Upload 1M bài viết EZArticles lên Wordpress làm thế nào ?

Discussion in 'Thảo Luận Chung' started by Dung Le, Dec 18, 2018.

  1. mitom

    mitom Tân Thủ Thôn

    Các pro ai có link EZarticles không, share mình với
     
  2. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Cái phần quan trọng là "- chỉnh sửa EZ db trong mysql cho phù hợp cấu trúc của WP db (thêm/bớt/sửa/... các columns) " thì mình đang kẹt rồi chứ mấy cái khác thì okie.

    Ví dụ :
    1.Tạo thêm cột id : làm sao để tạo ra id = 1 , id kế tiếp = i + 1 .
    2.Tạo cột slug , làm sao convert từ title " em dep lam " thanh " em-dep-lam" .
    3.Tạo cột excerpt . bằng cách lấy 120 word từ column content ...

    .. mà bằng câu lệnh sql luôn đó .
    Tới đây thì hơi bí lù.
     
  3. Dung Le

    Dung Le Sơ Nhập Giang Hồ

  4. money

    money Hương Chủ

    Vậy mới cần học và cũng chứng tỏ rằng không ai có thể chỉ mọi thứ cho người khác.
    1. Keyword: mysql add auto_increment primary key
    2. Keyword: mysql replace string in column
    3. Keyword: mysql update column substring
     
    Vito_King and Dung Le like this.
  5. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Thánh kiu bác @money , ra được khối thứ rồi .
     
  6. Trần Trọng Bách

    Trần Trọng Bách Sơ Nhập Giang Hồ

    Mình nghĩ giải pháp cho vấn đề này có 2 bước:
    1. Dùng code để đọc database đó thay vì export ra csv rồi chỉnh sửa nhiêu khê lắm. Cái này bạn có thể search dùng php hay bất cứ thằng nào đọc vào database, không phức tạp gì đâu.
    2. Ghi lại những thứ đọc được thành 1 database mới phù hợp với db của wordpress dể import vào / ghi ra csv để import / bắn thẳng lên wordpress qua api của wordpress.

    Mình post lại bài đã có thảo luận về việc post bài lên wordpress: http://cafemmo.club/threads/hoi-cach-import-bai-sieu-nhanh-vao-wordpress.717/
     
    Vito_King likes this.
  7. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Bác @Trần Trọng Bách không ngại thì cho mình hỏi lại : đoạn code trước đây bác post ở bài kia là dùng trong trường hợp nào :
    1. Database đã có sẵn các thông tin và chỉ publish ra khi chạy file php đó ?
    2. Dữ liệu bác crawl về từ web khác online sau đó import trực tiếp vào web của mình luôn .

    Lúc đó mình có hỏi cái file dữ liệu đi kèm đâu thì bác nói là có sẵn nên mình cũng chưa hiểu chữ " có sẵn" là thế nào mà không dám hỏi tiếp luôn , hehe, tới giờ cũng còn hoang mang quá , nếu được bác giải thích thêm rỏ rỏ nhé ,xem như là bài học vỡ lòng cho newbie vậy .
     
  8. mitom

    mitom Tân Thủ Thôn

    Theo như đoạn code sample của bác bách thì data cần để chạy code import truc tiep vao wp có các trường là title, content, cats, tags nha bác.
     
    Trần Trọng Bách and Dung Le like this.
  9. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Vậy cái data đó đang nằm đâu ? có sẵn trong database do mình up lên trước rồi hay là 1 cái file sql/csv/xml nào đó hay là đang crawl rồi up lên luôn ? cái vấn đề mình không hiểu là chỗ đó.
     
  10. mitom

    mitom Tân Thủ Thôn

    Ah, data có sẵn của bác nhé, bác phải hiểu thế này, bác phải viết 1 đoạn code read data và post đống data đó lên wp thì code của bác bách sẽ nhận data đó và insert vào db của wp.(chèn code này vào wp nhé)
     
  11. Trần Trọng Bách

    Trần Trọng Bách Sơ Nhập Giang Hồ

    Có sẵn ở đây í mình là kiểu như bạn có file csv, có 1 database lưu dữ liệu của bạn ở đâu đó. Về 2 vấn dề bạn hỏi thì thế này:
    1. File php đó chỉ là 1 file trung gian gọi vào phần post bài của wordpress, tức là khi bạn gửi những thông tin như title, content, tag, category vào cái đường link chứa file php đó thì nó sẽ tự động gọi đến wordpress để wordpress post những bài đó lên (ghi vào database của wordpress theo đúng chuẩn của nó)
    2. Thường thì dữ liệu crawl về mình lưu ở 1 db riêng để có thể tùy biến trước khi post lên wordpress. Rồi khi dựng site thì mình sẽ đọc từ database đó, xào nấu hoặc không thì tùy, rồi gửi thông tin đến đường link chứ file php kia, và nó sẽ post thành bài trên wordpress.

    Thông thường thì qui trình của mình thế này:
    1. Crawl data (php, python, tool ...) (có thể xào nấu luôn từ đoạn này, tùy)
    2. Lưu vào db của mình (mongodb, mysql)
    3. Gọi từ db đã lưu ra (php, python) (có thể xào nấu ở đoạn này)
    4. Post lên web (wordpress, framework nào đó)

    Mình không ngại gì đâu nên bạn cứ hỏi thoải mái, cái gì đơn giản quá mình sẽ bảo bạn tự tìm hiểu thôi không có vấn đề gì đâu.
     
    wpresources likes this.
  12. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Như vậy theo mình hiểu sẽ có 2 database , một của bác đã crawl về từ đâu đó gọi là A bao gồm nhiều column nhưng phải có title, content, cats, tags với data trong đó.. , cái thứ hai là B ( tức là database của Wordpress tạo ra với prefix là wp_ ) gồm nhiều tables nhưng chưa có dữ liệu .

    Vậy cho mình hỏi :
    1. Cả hai database A và B đều nằm chung 1 VPS/host ?
    2.Do không thấy đề cập trong code đến database name/user name và password nên mình sẽ hiểu là cả hai đều chung user và có quyền truy cập như nhau ?
    3. Nếu chỉ với 4 field trên thì Wordpress vẫn chấp nhận cho post và tự tạo các trường khác luôn hả bác ? vd như slug,guid,id ...

    4. Câu này quan trọng nhất : để chạy được đoạn 2 đoạn code của bác thì sẽ phải làm như thế nào :
    - đoạn code đầu tiên sẽ nằm ở vị trí : abc.com/post.php ==> cái này mình hiểu .
    - đoạn code thứ hai: chèn vào file tên gi? vị trí thế nào ? hay chèn vào một file nào có sẵn trong wordpress ?
    - cần dùng cronjob để chạy file đó hay sao ?

    Nếu bác thấy cần chỉnh tí để code chạy theo ý mình hiểu thì chỉnh giúp nhé .
     
  13. Trần Trọng Bách

    Trần Trọng Bách Sơ Nhập Giang Hồ

    1. 2 db này không nhất thiết phải nằm chung VPS, bạn có thể tạo 1 db ở máy nhà để lưu data crawl về, hoặc trên 1 vps chuyên để crawl. Hoặc chỉ là 1 file csv. Các phần title, content, cats, tags không nhất thiết là cứ phải có đủ, vd cats, tags bạn không có từ trước mà sinh ra sau thì cũng không sao.
    2. File code trên wordpress, cụ thể ở đây là file abc.com/post.php không cần user pass vì nó xử lí thẳng với wordpress, wordpress sẽ gửi đến database mà nó được config sẵn, bởi vậy nên mình mới thêm dòng $api = "kls$^^as9kjkj23qq3j"; trong file này để thêm 1 lớp xác thực.
    3. Vì thằng post.php sẽ đẩy thẳng sang wp_insert_post là function của wordpress, nên những phần như bạn hỏi wp sẽ tự sinh ra.
    4. Đoạn code thứ 2 thực ra là chưa đầy đủ, mình chỉ viết phần gửi content lên đoạn code thứ nhất (abc.com/post.php) mà không viết đoạn đọc từ database hay từ csv ra. Đoạn code này bạn có thể để ở bất cứ đâu để chạy miễn đảm bảo việc là nó có thể đọc được db gốc của bạn (chứa data crawl về) hoặc file csv. Sau đó với mỗi nội dung đọc ra nó sẽ gửi lên con abc.com/post.php và con này post nội dung lên.
    Bạn có thể hình dung thế này: bạn có 1 file csv trên máy và 1 trang abc.com, bạn nhét file post.php như mình bảo lên trang abc.com, rồi từ máy nhà bạn tạo 1 file php đọc nội dung file csv, với mỗi nội dung đọc được bạn ghép với đoạn code thứ 2 mình đưa để nó gửi lên abc.com/post.php. Thay vì đọc file csv thì bạn đọc từ db chứa nội dung crawl về cũng vậy.
    Về việc cronjob thì còn tùy vào trường hợp cụ thể của bạn. Vd bạn có 1mil dòng trong file csv, bạn tạo 1 file php đọc lần lượt từ 1 -> 1mil dòng đó, với mỗi phần đọc được bạn gửi lên bằng code thứ 2, và code thứ nhất ở abc.com/post.php sẽ nhập nội dung vào wordpress. Như vậy nó chạy vòng for từ 1 -> 1mil là xong, không cần cronjob gì cả. Nhưng vd mỗi ngày bạn sinh ra 1 file csv và cần nó chạy hàng ngày khác nhau, thì khi đó sẽ cần đến cronjob.

    Ở đoạn code thứ 2 mình gửi, phần:
    Code:
    $myvars = array(
    'api' => "kls$^^as9kjkj23qq3j", // cái này có nội dung giống với đoạn trong file post.php là $api = "kls$^^as9kjkj23qq3j"; mình dùng để xác thực.
    'post_title' => $post_title,
    'post_content' => $post_content,
    'post_category' => $post_category,
    'tags' => $tags,
    );
    ở đây $post_title, $post_content, $post_category, $post_tags mình mặc định là những nội dung bạn đã lấy ra để post lên thành 1 bài hoàn chỉnh trên wordpress. Nên bạn chỉ cần tìm hiểu phần đọc data từ csv hoặc từ db, rồi với mỗi phần data đó bạn chạy đoạn code thứ 2 là được.
     
    Dung Le and wpresources like this.
  14. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Được bác @money chỉ bảo tận tình nên cũng ráng test cho ra hàng họ . Sau khi ngồi hí hoáy các thể loại câu lệnh , copy , sao chép đủ mọi nguồn thì mình cũng cho ra sản phẩm tuy vẫn còn thiếu nhiều thứ như tag, category nhưng đại khái là tạm ổn . Sau đây là các bước làm :

    Mình dựng web bằng XAMPP , dùng trực tiếp PHPmyadmin để truy xuất dữ liệu , nhập câu lệnh mysql luôn nha cả nhà .

    1. Đầu tiên là đổ data từ file ezine.sql vào một database trống :
    mysql -u [uname] -p [dbname] < [backupfile.sql]

    2. Sau đó tạo thêm 1 table,đặt tên là wp_posts trong cùng database trên, dùng câu lệnh :
    Code:
    CREATE TABLE wp_posts (
      ID bigint(20) unsigned NOT NULL auto_increment,
      post_author bigint(20) unsigned NOT NULL default '0',
      post_date datetime NOT NULL default '0000-00-00 00:00:00',
      post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',
      post_content longtext NOT NULL,
      post_title text NOT NULL,
      post_excerpt text NOT NULL,
      post_status varchar(20) NOT NULL default 'publish',
      comment_status varchar(20) NOT NULL default 'open',
      ping_status varchar(20) NOT NULL default 'open',
      post_password varchar(20) NOT NULL default '',
      post_name varchar(200) NOT NULL default '',
      to_ping text NOT NULL,
      pinged text NOT NULL,
      post_modified datetime NOT NULL default '0000-00-00 00:00:00',
      post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',
      post_content_filtered longtext NOT NULL,
      post_parent bigint(20) unsigned NOT NULL default '0',
      guid varchar(255) NOT NULL default '',
      menu_order int(11) NOT NULL default '0',
      post_type varchar(20) NOT NULL default 'post',
      post_mime_type varchar(100) NOT NULL default '',
      comment_count bigint(20) NOT NULL default '0',
      PRIMARY KEY  (ID),
      KEY post_name (post_name),
      KEY type_status_date (post_type,post_status,post_date,ID),
      KEY post_parent (post_parent),
      KEY post_author (post_author)
    ) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    sẽ tạo ra một table y chang như yêu cầu của wordpress.

    3. Sao chép 2 column là title và content từ table articles sang column :
    INSERT INTO wp_posts ('post_title','post_content')
    SELECT title,content
    FROM articles;

    Tới đây coi như là cơ bản có đủ dữ liệu cần thiết cho bài viết rồi .
    Như bài viết trên thì mình xác định là table wp_posts có tổng cộng 23 column (ID,post_author,post_date,post_date_gmt,post_content,post_title,post_excerpt,post_status,comment_status,ping_status,post_password,post_name, to_ping,pinged, post_modified,post_modified_gmt,post_content_filtered,post_parent,guid,menu_order,post_type,post_mime_type,comment_count)

    chúng ta mới có 2 column thì cần tạo thêm dữ liệu cho các column khác , một số column thì WP không cần nên không sao nhé .

    Làm tiếp theo các câu lệnh tuần tự:

    UPDATE wp_posts SET 'post_author' = '1' // set author của toàn bộ bài viết là admin ( gán giá trị =1)

    UPDATE wp_posts SET `post_date` = '2018-12-20 01:00:00';// set ngày publish bài viết //
    UPDATE wp_posts SET `post_date_gmt` = '2018-12-20 01:00:00';// set ngày publish bài viết //
    UPDATE wp_posts SET 'post_modified` = '2018-12-20 01:00:00';// set ngày chỉnh sửa bài viết //
    UPDATE wp_posts SET `post_modified_gmt` = '2018-12-20 01:00:00';// set ngày chỉnh sửa bài viết //


    Phần khó hơn là xử lý slug,excerpt :
    UPDATE wp_posts SET `post_excerpt` = left(`post_content`,120);

    UPDATE wp_posts SET `post_name` =
    LOWER(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(`post_title`), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '\/', ''), '\"', ''), '?', ''), '\'', ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-'));

    Rồi cuối cùng là xử lý guid : GUID của wordpress có dạng "http:// localhost/ wordpress/?p=xxx" , bạn cần thay phần "http:// localhost/ wordpress/" sau này bằng domain của mình nên cũng phải nhớ câu lệnh này để sau này xử lý lại khi up lên web.

    UPDATE wp_posts SET `guid` = "http://localhost/wordpress1/?p="'id';

    Coi như là xong phần table wp_posts , chỉ cần dùng câu lệnh backup table này lại
    mysqldump db_name table_name > table_name.sql

    Sau đó cài đặt wordpress bình thường .
    Dùng câu lệnh : mysql -u [uname] -p [dbname] < [backupfile.sql] là tự nó đổ đúng table wp_posts vào database của mình .

    Lưu ý : Do dung lượng lớn nên các câu lệnh trên MYSQL nên ghỏ trực tiếp qua command line hơn là dùng trong PHPmyadmin vì XAMPP có cả hai chế độ nên làm được hết .

    Mình thấy với 400k bài viết thì database tầm 2GB rồi nhé , các bạn cứ xử lý rồi mới thấy cảm giác nhanh hay chậm giữa hai cách xử lý này .

    Nhắc lại , bài viết này còn hạn chế ở phần Category, tags vì phải can thiệp tiếp vào các table khác , sẽ bổ sung sau khi làm được .
     
  15. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Ráng đu theo để nắm vững luôn món này , bác @Trần Trọng Bách giúp cho trót nhé ,dân mù code nhưng thích vọt vẹt nên khoái vọc lắm , lượm được cái này trên mạng, đọc sơ sơ thì chắc giống phần bác đề cập " Nên bạn chỉ cần tìm hiểu phần đọc data từ csv hoặc từ db".

    Code:
    <?php
    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDB";
    
    // Create connection
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    // Check connection
    if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
    }
    
    $sql = "SELECT post_title,post_content,post_category,tags FROM table_name";/// Ý là ở đây mình có sẵn một table có 4 column là post_title,post_content,post_category,tags kèm theo dữ liệu trong đó  ? //
    $result = mysqli_query($conn, $sql);
    
    if (mysqli_num_rows($result) > 0) {
    // output data of each row===> khúc này quan trọng để xuất dữ liệu ra thì mình lại không hiểu lắm
    while($row = mysqli_fetch_assoc($result)) {
    echo"post_title: " . $row["post_title"]. " - Post_content " . $row["post_content"]. " " . $row["post_category"]. " " . $row["tags"] "<br>";
      }
    } else {
    echo"0 results";
    }
    
    mysqli_close($conn);
    ?>
    Đúng chỗ này là cái mình muốn hiểu nghĩa của bác " đọc từ dữ liệu db" ==> mình gán như thế nào từ câu lệnh bên dưới , ở dưới echo là xuất ra màn hình , còn gán thì là câu lệnh gì ? Bác chỉnh giúp nhé .

    Code:
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
    echo"post_title: " . $row["post_title"]. " - Post_content " . $row["post_content"]. " " . $row["post_category"]. " " . $row["tags"] "<br>";
      }
    } else {
    echo"0 results";
    }
    
     
  16. mitom

    mitom Tân Thủ Thôn

    Bác sử dụng curl để post các nội dung title, content, cat, tag lên file code trung gian của bác bách nhé.

    Mình cản giác bạn vẫn chưa hiểu code bác bách lắm thì phải ??

    Không cần thiết phải tạo 1 tables wp_posts như vậy đâu, khá công phu và tag cat bạn relationship nó như thế nào trong wp ??
     
  17. Dung Le

    Dung Le Sơ Nhập Giang Hồ


    CÁCH THỨ HAI LÀ POST LÊN TỪ FILE TRÊN MÁY , các bạn sử dụng đoạn code này , thiết lập thông số , cho 1 file chỉ cần 2-3 cột gì đó như author,title,content , định dạng CSV rồi máy sẽ tự post lên database :

    Code:
    <?php
        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "test";
        //For create connection
        $conn = new mysqli($servername, $username, $password, $dbname);
    
        $query = "LOAD DATA LOCAL INFILE
                    'thu muc chua file '
                    INTO TABLE wp_posts
                    FIELDS TERMINATED BY ','
                    LINES TERMINATED BY '\n'
                    IGNORE 1 LINES
                    (post_author,post_content,post_title)
                                    "; 
                   
        if (!$result = mysqli_query($conn, $query)){
            echo '<script>alert("Oops... Some Error occured.");</script>';
            exit();
                //exit(mysqli_error());
           }else
            echo '<script>alert("Data Inserted Successfully.");</script>'
         
        ?>
    Mấy cái khác thì dùng câu lệnh như bài trên để bổ sung .
     
  18. money

    money Hương Chủ

    @Dung Le LOAD DATA INFILE nếu chạy qua php thì NÊN dùng cho file nhỏ/vừa thôi, file quá lớn sẽ timeout và insert không hết. Lệnh này chạy command line tốt hơn nhiều. Mình hay dùng cho file tầm 500Mb, chạy phà phà.
     
    Dung Le likes this.
  19. Dung Le

    Dung Le Sơ Nhập Giang Hồ

    Thank bác , thật ra khúc up file là liên quan đến công năng xào nấu rồi , nên chắc up lên từng file nhỏ nhỏ ,đã thêm bớt nhiều thứ rồi !! Hehe, sẽ thọ giáo bác tiếp cái vụ xào nấu , chẻ content này .
     
  20. Trần Trọng Bách

    Trần Trọng Bách Sơ Nhập Giang Hồ

    $sql = "SELECT post_title,post_content,post_category,tags FROM table_name"; đoạn này tức là nó lấy dữ liệu của 4 cột post_title,post_content,post_category,tags tất nhiên phải có sẵn dữ liệu thì mới lấy ra, không nhất thiết cứ phải có đủ 4 cái hoặc chỉ 4 cái.
    // output data of each row: chỗ này í là đầu ra dữ liệu theo mỗi dòng trong database của bạn.
    theo đó đoạn code:
    Code:
    while($row = mysqli_fetch_assoc($result)) {
    echo"post_title: " . $row["post_title"]. " - Post_content " . $row["post_content"]. " " . $row["post_category"]. " " . $row["tags"] "<br>";
      }
    } else {
    echo"0 results";
    }
    bạn có thể hiểu là với mỗi dòng được đọc từ db nó sẽ show ra cho bạn xem nội dung, ở đây bạn chỉ cần thay mỗi lần show ra đó bằng 1 lần bắn lên site. MÌnh sẽ viết lại cả file này cho bạn, bạn chỉ việc sửa lại thông tin theo db của bạn là được. Lâu rồi mình k dùng php nên k có sẵn trên máy, chỉ viết ghép vào thôi, bạn chạy xem có lỗi thì bảo mình nhé.

    Code:
    <?php
        // Config để post lên site:
        $url = "http:// abc.com/post.php"
    
        // Config kết nối db:
        $servername = "localhost";
        $username = "username";
        $password = "password";
        $dbname = "myDB";
    
        // Create connection
        $conn = mysqli_connect($servername, $username, $password, $dbname);
        // Check connection
        if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
        }
    
        $sql = "SELECT post_title,post_content,post_category,tags FROM table_name";
        $result = mysqli_query($conn, $sql);
    
        if (mysqli_num_rows($result) > 0) {
            while($row = mysqli_fetch_assoc($result)) {
                // Đoạn này thực hiện post lên trang, mình comment phần echo đẻ nếu thấy post k thành công có thể echo ra xem dữ liệu có hay không
                //echo"post_title: " . $row["post_title"]. " - Post_content " . $row["post_content"]. " " . $row["post_category"]. " " . $row["tags"] "<br>";
                $myvars = array(
                    'api' => "kls$^^as9kjkj23qq3j", // cái này có nội dung giống với đoạn trong file post.php là $api = "kls$^^as9kjkj23qq3j"; mình dùng để xác thực.
                    'post_title' => $post_title,
                    'post_content' => $post_content,
                    'post_category' => $post_category,
                    'tags' => $tags,
                );
                $result = post_bai($url, $myvars);
                echo $result;   // show kết quả trả về khi post bài
            }
        }
        else {
            echo"0 results";
        }
    
        mysqli_close($conn);
    
        function post_bai($url, $myvars)
        {
            $ch = curl_init( $url );
            curl_setopt( $ch, CURLOPT_POST, 1);
            curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
            curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt( $ch, CURLOPT_HEADER, 0);
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
            $response = curl_exec( $ch );
            curl_close ($ch);
            return $response;
        }
    ?>