Thứ Tư, 10 tháng 9, 2014

CÁCH VIẾT MỘT PLUGIN CHO WORDPRESS

Xin chào các bạn, tôi dùng Wordpress từ rất lâu rồi khoảng 4 năm tính từ khi tôi viết bài này. Thời gian tôi không sử dụng cũng gần gần thời gian đó (vì tôi tự build CMS riêng cho mình). Thời gian gần đây tôi mới sử dụng lại wordpress vì nó khá tiện lợi với một website dạng blog, và đặc biệt là SEO rất tốt. Hơn nữa wordpress có rất nhiều plugin hay và cách viết plugin khá đơn giản. Hôm nay xin hướng dẫn các bạn cách viết plugin cho wordpress đơn giản.

Plugin này có tác dụng là lưu tất cả các ảnh từ một website khác về website của mình. Ví dụ khi bạn coppylink từ một website abcxyz.com thì khi view source sẽ thấy các link ảnh trẽ trỏ về đường dẫn của abczyz.com. Nếu site  kia họ để nguyên thì không sao, nhưng vì một lý do nào đó họ xóa đi thì cũng có nghĩa là ảnh ở website của chúng ta cũng mất theo. Các bạn mới học wordpress có thể tham khảo để tự viết 1 plugin cho mình.
Hôm nay tôi sẽ hướng dẫn các bạn viết một plugin cho wordpress để làm việc đó. Và tôi đã áp dụng plugin này cho chính những website của mình là cachnauanngon.com và dulichbuivietnam.com. 
Trong plugin này tôi có sử dụng một thư viện là simple html dom sử dụng sử dụng thư viện này như thế nào các bạn vui lòng search trên mạng. nếu có điều kiện tôi sẽ hướng dẫn sau:
Đâu tiên các bạn tạo một folder tên là hanh-content
Trong folder này tạo một file hanh-content.php có nội dung như sau:
<?php
/*
Plugin Name: Hanh - content
Plugin URI: http://nguyenduchanh.com
Description: clean content and save images
Author: Nguyen Duc Hanh
Version: 1.0
Author URI: http://nguyenduchanh.com
*/

include_once('include/simple_html_dom.php');

/**
 * @package kiểm tra content post, lưu ảnh từ site khác về hostting của mình (thêm vào thư viện bài viết)
 * @author Nguyen Duc Hanh
 * @version 1.0
 */
function  H_saveImage($post_id){
    // lay noi dung content
    $post = get_post($post_id);
    $content = $post->post_content;

    // chuyen content ve dang dom de co the su dung duoc
    $dom = new simple_html_dom;
    $dom->load($content);

    // lay cac urlimage tu hosting khac
    $arrImages = array();
    foreach($dom->find('img') as $e){
        $src = $e->src;
        $check_str = $_SERVER['SERVER_NAME'];
        if(strpos($src,$check_str) > 0 ){
            continue;
        }
        $arrImages[] = $src;
    }

    // luu anh vao thu vien
    foreach($arrImages as $key=>$src){

        $path_parts = pathinfo($src);
        $images_name = $path_parts['basename'];
        $tmp  = download_url( $src );//media_sideload_image($path_parts, $post_id);

        // Set variables for storage
  // fix file filename for query strings
  preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $src, $matches );
  $file_array['name'] = basename($matches[0]);
  $file_array['tmp_name'] = $tmp;

  // If error storing temporarily, unlink
  if ( is_wp_error( $tmp ) ) {
   @unlink($file_array['tmp_name']);
   $file_array['tmp_name'] = '';
            break;
  }

  // do the validation and storage stuff
  $id = media_handle_sideload( $file_array, $post_id, $desc );
  // If error storing permanently, unlink
  if ( is_wp_error($id) ) {
   @unlink($file_array['tmp_name']);
   break;
  }

  $src_images = wp_get_attachment_url( $id );
        $content = str_replace($src,$src_images,$content);
    }

    $my_post = array(
        'ID'           => $post_id,
        'post_content' => $content
    );

    // Update the post into the database
    if ( ! wp_is_post_revision( $post_id ) ){

  // unhook this function so it doesn't loop infinitely
  remove_action('save_post', 'H_saveImage');

  // update the post, which calls save_post again
  wp_update_post( $my_post );

  // re-hook this function
  add_action('save_post', 'H_saveImage');
 }
}

add_action( 'save_post', 'H_saveImage', 1000);
Mình xin giải thích đoạn code trên một chút
Từ dòng 3-8: là khai báo thông tin về plugin cho wordpress biết theo thứ tự là: tên, địa chỉ update, mô tả, tác giả, phiên bản plugin, website của tác giả
Dòng 18: function chính của plugin, tên các bạn đặt tùy ý nhưng có lời khuyên là các bạn thê tiền tố ở đầu để tránh trùng tên với những function trong thư viện core của wordpress cũng như các function trong template
Dòng 89: dòng này rất quan trọng, nếu không có dòng này thì plugin của bạn sẽ không làm gì
add_action( 'save_post', 'H_saveImage', 1000);
save_post: tham số thứ nhất của add_action báo cho wordpress biết là áp dụng hàm H_saveImage: khi lưu một bài viết
1000: là thứ tự ưu tiên so với những action khác, số càng cao thì độ ưu tiên càng cao
Vậy giờ tất cả những gì chúng ta cần mổ xẻ tiếp là function H_saveImage ở dòng thứ 18
Ở đây khi gọi hàm này thì wordpress sẽ truyền vào một tham số là $post_id, từ tham số này chúng ta có thể lấy được nôi dung (content).
Việc của chúng ta bây giờ là:
  • Tìm tất cả các src của thẻ img trong content
  • Lưu về hosting của website
  •  Thay thể các src cũ bằng các src tương ứng với địa chỉ mình lưu về
  • Update lại nội dung mới
Tất cả các việc tìm và thay thế mình làm trong vòng lặp foreach từ dòng 39-68
Việc lưu lại từ dòng 70-87. Lưu ý đoạn if từ 75-86 để cho wordpress không lặp lại việc này nhiều lần mình từng bỏ đoạn này đi và wordpress thực thi plugin này rất là lâu. Bạn nào hiểu nguồn gốc vấn đề thì giải thích giúp mình nhé
Vậy là xong. Đây là cách viết một plugin khá đơn giản và mình nghĩ khá là hữu hiệu với việc crawl nội dung cho website sử dụng wordpress. 
Chúc các bạn thành công!

Không có nhận xét nào:

Đăng nhận xét