Liên hệ tư vấn

Hướng dẫn tạo Plugin cho WordPress chi tiết từ A-Z


Plugin là những đoạn mã được viết bằng ngôn ngữ PHP, có thể thêm vào WordPress để thay đổi hoặc mở rộng chức năng của hệ thống. Bạn có thể tạo Plugin cho WordPress để giải quyết các nhu cầu cụ thể của bạn hoặc của người dùng. Trong bài hướng dẫn này, chúng tôi sẽ hướng dẫn bạn các bước cơ bản để tạo Plugin cho WordPress. Cụ thể:

  1. Khái niệm về Plugin và lợi ích của nó
  2. Chuẩn bị môi trường.
  3. Tạo thư mục và tệp Plugin.
  4. Thêm chức năng.
  5. Tương tác với cơ sở dữ liệu.
  6. Tạo giao diện người dùng.
  7. Gỡ lỗi và kiểm thửTriển khai và quản lý Plugin.

Lưu ý: Đây là một nội dung nâng cao. Nếu bạn là người mới tiếp cận với WordPress thì tốt nhất không nên đọc bài viết này để tránh mất thời gian của bạn.

Khái niệm về Plugin trong WordPress

plugin-wordpress-la-gi

Plugin là những đoạn mã nhỏ được viết bằng ngôn ngữ PHP, có thể thêm vào WordPress để mở rộng chức năng hoặc thay đổi hành vi của hệ thống. Mỗi Plugin có một chức năng riêng biệt và có thể được kích hoạt hoặc vô hiệu hóa theo ý muốn của người quản trị website.

Plugin được lưu trữ trong thư mục wp-content/plugins của WordPress và có ít nhất một tệp PHP chứa thông tin cơ bản về Plugin (tên, phiên bản, tác giả, mô tả) và các đoạn mã để xử lý logic và giao diện của Plugin. Ngoài ra, Plugin cũng có thể có các tệp khác như CSS, JavaScript, HTML, XML, JSON, ảnh hoặc các loại tệp khác để hỗ trợ cho chức năng của Plugin.

Lợi ích và tác dụng của việc tạo Plugin cho WordPress

Việc tạo Plugin cho WordPress mang lại nhiều lợi ích và tác dụng cho người phát triển và người sử dụng:

  • Tạo Plugin cho phép bạn mở rộng và tùy biến WordPress theo nhu cầu cụ thể hoặc giải quyết vấn đề đặc biệt mà không có sẵn trên thư viện Plugin hoặc không phù hợp với yêu cầu của bạn.
  • Tạo Plugin cho phép bạn tách biệt các chức năng của Plugin với mã nguồn của WordPress, giúp dễ dàng quản lý, bảo trì và cập nhật Plugin mà không ảnh hưởng đến hệ thống WordPress.
  • Tạo Plugin cho phép bạn tái sử dụng các chức năng của Plugin trên nhiều trang web WordPress khác nhau, tiết kiệm thời gian và công sức phát triển.
  • Tạo Plugin cho phép bạn chia sẻ các chức năng của Plugin với cộng đồng WordPress, góp phần phát triển và làm giàu thư viện Plugin, cũng như nhận được phản hồi và hỗ trợ từ người dùng.
huong-dan-tu-tao-plugin-cho-wordpress

Phần 1. Chuẩn bị môi trường để tạo Plugin cho WordPress

Trước khi bắt đầu tạo Plugin, bạn cần chuẩn bị môi trường để phát triển và kiểm thử Plugin. Bạn cần có:

1. Cài đặt WordPress trên Localhost hoặc Hosting

cai-dat-wordpress-localhost-08

Để tạo Plugin, bạn cần có một trang web WordPress đang hoạt động để kích hoạt và kiểm tra Plugin. Bạn có thể cài đặt WordPress trên máy cục bộ (local) hoặc máy chủ (hosting).

Cài đặt WordPress trên máy cục bộ Localhost có lợi thế là bạn có thể phát triển và kiểm thử Plugin mà không cần kết nối internet, không bị ảnh hưởng bởi tốc độ tải trang hoặc các vấn đề bảo mật. Tuy nhiên, bạn cũng cần lưu ý rằng việc phát triển trên máy cục bộ có thể gặp một số khác biệt với việc phát triển trên máy chủ, ví dụ như phiên bản PHP, MySQL, Apache hoặc các thiết lập khác.

hoan-thanh-tao-site-wordpress-voi-localwp.

Cài đặt WordPress trên Hosting có lợi thế là bạn có thể phát triển và kiểm thử Plugin trên môi trường thực tế, giống như khi Plugin được triển khai trên các trang web WordPress khác. Tuy nhiên, bạn cũng cần lưu ý rằng việc phát triển trên máy chủ có thể gặp một số rủi ro về bảo mật, hiệu suất hoặc xung đột với các Plugin hoặc chủ đề khác.

Để cài đặt WordPress, bạn có thể làm theo hướng dẫn trong bài viết này: Cài đặt WordPress lên LocalHost bằng XAMPP đơn giản

2. Cài đặt môi trường phát triển (ví dụ: XAMPP)

XAMPP là một bộ phần mềm miễn phí, hỗ trợ nhiều hệ điều hành, bao gồm Apache, MySQL, PHP và Perl.

xampp-y-cms

Sau khi cài đặt xong môi trường phát triển, bạn cần khởi động các dịch vụ Apache và MySQL để có thể chạy WordPress trên máy cục bộ. Bạn cũng cần tạo một cơ sở dữ liệu cho WordPress bằng cách sử dụng công cụ quản lý cơ sở dữ liệu như phpMyAdmin hoặc MySQL Workbench.

3. Cài đặt trình soạn thảo mã nguồn (ví dụ: Visual Studio Code, PhpStorm)

Để viết mã PHP cho Plugin, bạn cần có một trình soạn thảo mã nguồn (code editor) hỗ trợ ngôn ngữ PHP và các tính năng như cú pháp nổi bật, gợi ý mã, kiểm tra lỗi, định dạng mã, v.v… Việc cài đặt các phần mềm này rất đơn giản, bạn chỉ cần vào trang chủ của chúng để tải về, sau đó chạy file đó và cứ next đến khi nào hiện chữ finish thì bấm nút đó.

Microsoft-Visual-Studio

Một số trình soạn thảo mã nguồn phổ biến cho PHP là:

  • Visual Studio Code: là một trình soạn thảo mã nguồn miễn phí, hỗ trợ nhiều hệ điều hành và nhiều ngôn ngữ lập trình, bao gồm PHP. Bạn có thể tải về và cài đặt Visual Studio Code tại https://code.visualstudio.com/
  • PhpStorm: là một trình soạn thảo mã nguồn chuyên nghiệp, dành riêng cho PHP và các công nghệ liên quan, như HTML, CSS, JavaScript, SQL, v.v. Bạn có thể tải về và cài đặt PhpStorm tại https://www.jetbrains.com/phpstorm/
  • Sublime Text: là một trình soạn thảo mã nguồn nhẹ và nhanh, hỗ trợ nhiều hệ điều hành và nhiều ngôn ngữ lập trình, bao gồm PHP. Bạn có thể tải về và cài đặt Sublime Text tại https://www.sublimetext.com/

Đây là các phần mềm miễn phí nên bạn không cần lo về vấn đề bản quyền. Sau khi cài đặt xong trình soạn thảo mã nguồn, bạn có thể mở thư mục WordPress trên máy cục bộ hoặc máy chủ để bắt đầu viết Plugin.

Phần 2. Tạo thư mục Plugin cho WordPress

1. Xác định vị trí và tên của Plugin

Để tạo Plugin cho WordPress, bạn cần tạo một thư mục riêng cho Plugin trong thư mục wp-content/plugins của WordPress. Thư mục này sẽ chứa các tệp PHP, CSS, JavaScript, hình ảnh và các tài nguyên khác của Plugin.

plugin-folder-wordpress

Bạn có thể đặt tên cho Plugin bất kỳ, nhưng nên tuân theo một số quy ước sau:

  • Tên Plugin nên là duy nhất và phản ánh chức năng hoặc mục đích của Plugin
  • Tên Plugin nên viết bằng tiếng Anh và không có dấu cách hoặc ký tự đặc biệt
  • Tên Plugin nên viết thường hoặc sử dụng dấu gạch dưới (_) để phân cách các từ

Ví dụ: Nếu bạn muốn tạo một Plugin để hiển thị số lượt xem của bài viết, bạn có thể đặt tên cho Plugin là post_views_counter hoặc post-views-counter.

2. Tạo thư mục và các tệp cần thiết cho Plugin

Sau khi xác định vị trí và tên của Plugin, bạn cần tạo một thư mục mới trong wp-content/plugins với tên giống như tên của Plugin. Trong thư mục này, bạn cần tạo ít nhất một tệp PHP chứa thông tin cơ bản của Plugin. Tệp này sẽ được WordPress sử dụng để nhận diện và kích hoạt Plugin.

Ngoài ra, bạn cũng có thể tạo các tệp khác để chứa các chức năng hoặc giao diện của Plugin. Bạn có thể tổ chức các tệp này theo các tiêu chí như loại (PHP, CSS, JS), chức năng (admin, front-end), v.v.

Ví dụ: Nếu bạn muốn tạo một Plugin để hiển thị số lượt xem của bài viết, bạn có thể tạo các tệp sau trong thư mục post_views_counter:

  • post_views_counter.php: tệp PHP chứa thông tin cơ bản của Plugin và các hàm để đếm và hiển thị số lượt xem
  • post_views_counter.css: tệp CSS để tùy biến giao diện của số lượt xem
  • post_views_counter.js: tệp JavaScript để thực hiện các hành động liên quan đến số lượt xem, như cập nhật, lọc, v.v.
  • images: thư mục chứa các hình ảnh sử dụng trong Plugin, như biểu tượng, nền, v.v.

Phần 3. Tạo tệp Plugin cho WordPress cơ bản

1. Tạo tệp PHP chứa thông tin Plugin

Tệp PHP chứa thông tin Plugin là tệp quan trọng nhất của Plugin, vì nó sẽ được WordPress sử dụng để nhận diện và kích hoạt Plugin. Tệp này phải có cùng tên với thư mục của Plugin, và phải có một phần đầu (header) chứa các thông tin cơ bản của Plugin, như tên, phiên bản, tác giả, mô tả, v.v.

Phần đầu của tệp PHP phải tuân theo định dạng sau:

<?php
/*
Plugin Name: Tên của Plugin
Plugin URI: Địa chỉ trang web của Plugin
Description: Mô tả ngắn gọn chức năng hoặc mục đích của Plugin
Version: Phiên bản hiện tại của Plugin
Author: Tên của người hoặc tổ chức tạo ra Plugin
Author URI: Địa chỉ trang web của người hoặc tổ chức tạo ra Plugin
License: Giấy phép sử dụng của Plugin
Text Domain: Tên miền văn bản của Plugin, dùng để hỗ trợ đa ngôn ngữ
Domain Path: Đường dẫn đến thư mục chứa các tệp ngôn ngữ của Plugin
*/
?>

Bạn có thể điền các thông tin cụ thể cho từng trường, hoặc bỏ qua các trường không cần thiết. Bạn cũng có thể thêm các trường khác nếu muốn, nhưng các trường trên là các trường cơ bản và phổ biến nhất.

Ví dụ: Nếu bạn muốn tạo một Plugin để hiển thị số lượt xem của bài viết, bạn có thể viết phần đầu cho tệp post_views_counter.php như sau:

<?php
/*
Plugin Name: Post Views Counter
Plugin URI: https://example.com/post-views-counter
Description: A simple plugin to count and display the number of views of each post
Version: 1.0.0
Author: John Doe
Author URI: https://example.com/john-doe
License: GPL-2.0-or-later
Text Domain: post-views-counter
Domain Path: /languages
*/
?>

2. Định nghĩa thông tin cơ bản của Plugin (tên, phiên bản, tác giả, mô tả)

Sau khi viết phần đầu cho tệp PHP, bạn cần định nghĩa các thông tin cơ bản của Plugin bằng cách sử dụng các hằng số (constants) hoặc các biến toàn cục (global variables). Điều này sẽ giúp bạn dễ dàng truy xuất và sử dụng các thông tin này trong các tệp khác của Plugin.

Các thông tin cơ bản của Plugin thường bao gồm:

  • Tên của Plugin: là tên hiển thị của Plugin, có thể có dấu cách và ký tự đặc biệt
  • Phiên bản của Plugin: là số hiệu biểu thị trạng thái phát triển của Plugin, thường có dạng x.y.z, trong đó x là số phiên bản chính, y là số phiên bản phụ, và z là số phiên bản sửa lỗi
  • Tác giả của Plugin: là tên của người hoặc tổ chức tạo ra Plugin
  • Mô tả của Plugin: là một đoạn văn ngắn gọn giới thiệu chức năng hoặc mục đích của Plugin
  • Đường dẫn của Plugin: là đường dẫn tuyệt đối đến thư mục chứa Plugin
  • Địa chỉ URL của Plugin: địa chỉ URL đến thư mục chứa Plugin

Bạn có thể định nghĩa các thông tin này bằng cách sử dụng hàm define() để tạo các hằng số, hoặc gán giá trị cho các biến toàn cục. Bạn nên đặt tên cho các hằng số hoặc biến toàn cục theo quy ước sau:

  • Tên hằng số hoặc biến toàn cục nên viết hoa và sử dụng dấu gạch dưới (_) để phân cách các từ
  • Tên hằng số hoặc biến toàn cục nên có tiền tố là tên của Plugin để tránh xung đột với các hằng số hoặc biến toàn cục khác

Ví dụ: Nếu bạn muốn định nghĩa các thông tin cơ bản cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Define plugin name
define( 'POST_VIEWS_COUNTER_NAME', 'Post Views Counter' );

// Define plugin version
define( 'POST_VIEWS_COUNTER_VERSION', '1.0.0' );

// Define plugin author
define( 'POST_VIEWS_COUNTER_AUTHOR', 'John Doe' );

// Define plugin description
define( 'POST_VIEWS_COUNTER_DESCRIPTION', 'A simple plugin to count and display the number of views of each post' );

// Define plugin path
define( 'POST_VIEWS_COUNTER_PATH', plugin_dir_path( __FILE__ ) );

// Define plugin URL
define( 'POST_VIEWS_COUNTER_URL', plugin_dir_url( __FILE__ ) );
?>

3. Đăng ký và kích hoạt Plugin cho WordPress

Sau khi định nghĩa các thông tin cơ bản cho Plugin, bạn cần đăng ký và kích hoạt Plugin để WordPress có thể sử dụng Plugin. Bạn có thể làm điều này bằng cách sử dụng các hàm sau:

  • register_activation_hook(): hàm này cho phép bạn đăng ký một hàm sẽ được gọi khi Plugin được kích hoạt. Bạn có thể sử dụng hàm này để thực hiện các công việc cần thiết khi Plugin được kích hoạt, như tạo bảng cơ sở dữ liệu, thiết lập giá trị mặc định, v.v.
  • register_deactivation_hook(): hàm này cho phép bạn đăng ký một hàm sẽ được gọi khi Plugin được vô hiệu hóa. Bạn có thể sử dụng hàm này để thực hiện các công việc cần thiết khi Plugin được vô hiệu hóa, như xóa bảng cơ sở dữ liệu, xóa giá trị tùy chọn, v.v.
  • register_uninstall_hook(): hàm này cho phép bạn đăng ký một hàm sẽ được gọi khi Plugin được gỡ bỏ. Bạn có thể sử dụng hàm này để thực hiện các công việc cần thiết khi Plugin được gỡ bỏ, như xóa tất cả các tệp và dữ liệu liên quan đến Plugin.

Các hàm trên đều có hai tham số: tên của tệp PHP chứa thông tin Plugin, và tên của hàm sẽ được gọi khi Plugin được kích hoạt, vô hiệu hóa hoặc gỡ bỏ.

Ví dụ: Nếu bạn muốn đăng ký và kích hoạt Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Register activation hook
register_activation_hook( __FILE__, 'post_views_counter_activation' );

// Register deactivation hook
register_deactivation_hook( __FILE__, 'post_views_counter_deactivation' );

// Register uninstall hook
register_uninstall_hook( __FILE__, 'post_views_counter_uninstall' );

// Define activation function
function post_views_counter_activation() {
  // Create a table to store post views
  global $wpdb;
  $table_name = $wpdb->prefix . 'post_views';
  $charset_collate = $wpdb->get_charset_collate();
  $sql = "CREATE TABLE $table_name (
    post_id bigint(20) unsigned NOT NULL,
    views bigint(20) unsigned NOT NULL DEFAULT 0,
    PRIMARY KEY (post_id)
  ) $charset_collate;";
  require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
  dbDelta( $sql );
}

// Define deactivation function
function post_views_counter_deactivation() {
  // Do nothing
}

// Define uninstall function
function post_views_counter_uninstall() {
  // Delete the table to store post views
  global $wpdb;
  $table_name = $wpdb->prefix . 'post_views';
  $sql = "DROP TABLE IF EXISTS $table_name;";
  $wpdb->query( $sql );
}
?>

Phần 4. Thêm chức năng cho Plugin

1. Thêm các hàm và lớp để mở rộng chức năng của Plugin

Sau khi tạo tệp Plugin cơ bản, bạn có thể bắt đầu viết các hàm và lớp để mở rộng chức năng của Plugin. Bạn có thể viết các hàm và lớp trong cùng tệp PHP chứa thông tin Plugin, hoặc tạo các tệp PHP riêng biệt và nhúng vào tệp chính bằng hàm include() hoặc require().

Bạn nên tuân theo một số quy ước sau khi viết các hàm và lớp cho Plugin:

  • Tên hàm và lớp nên viết bằng tiếng Anh và sử dụng dấu gạch dưới (_) hoặc dấu gạch ngang (-) để phân cách các từ
  • Tên hàm và lớp nên có tiền tố là tên của Plugin để tránh xung đột với các hàm và lớp khác
  • Tên hàm và lớp nên phản ánh chức năng hoặc mục đích của chúng
  • Tên hàm nên bắt đầu bằng một động từ, ví dụ: post_views_counter_get_views(), post_views_counter_update_views(), v.v.
  • Tên lớp nên bắt đầu bằng một danh từ, ví dụ: Post_Views_Counter, Post_Views_Counter_Admin, v.v.

Ví dụ: Nếu bạn muốn thêm các hàm và lớp để mở rộng chức năng cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Define a function to get the number of views of a post
function post_views_counter_get_views( $post_id ) {
  // Get the global database object
  global $wpdb;
  // Get the table name
  $table_name = $wpdb->prefix . 'post_views';
  // Prepare the SQL query
  $sql = $wpdb->prepare( "SELECT views FROM $table_name WHERE post_id = %d", $post_id );
  // Execute the query and return the result
  return $wpdb->get_var( $sql );
}

// Define a function to update the number of views of a post
function post_views_counter_update_views( $post_id ) {
  // Get the global database object
  global $wpdb;
  // Get the table name
  $table_name = $wpdb->prefix . 'post_views';
  // Prepare the SQL query
  $sql = $wpdb->prepare( "INSERT INTO $table_name (post_id, views) VALUES (%d, 1) ON DUPLICATE KEY UPDATE views = views + 1", $post_id );
  // Execute the query and return the result
  return $wpdb->query( $sql );
}

// Define a class to handle the admin settings of the plugin
class Post_Views_Counter_Admin {
  // Define a constructor method to initialize the class
  public function __construct() {
    // Add an action hook to register the admin menu of the plugin
    add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );
    // Add an action hook to register the admin settings of the plugin
    add_action( 'admin_init', array( $this, 'register_admin_settings' ) );
    // Add a filter hook to add a column for post views in the posts table
    add_filter( 'manage_posts_columns', array( $this, 'add_post_views_column' ) );
    // Add an action hook to display the post views in the posts table
    add_action( 'manage_posts_custom_column', array( $this, 'display_post_views_column' ), 10, 2 );
  }

  // Define a method to register the admin menu of the plugin
  public function register_admin_menu() {
    // Add a submenu page under the Settings menu
    add_options_page(
      __( 'Post Views Counter Settings', 'post-views-counter' ), // Page title
      __( 'Post Views Counter', 'post-views-counter' ), // Menu title
      'manage_options', // Capability required
      'post-views-counter', // Menu slug
      array( $this, 'display_admin_page' ) // Callback function
    );
  }

  // Define a method to register the admin settings of the plugin
  public function register_admin_settings() {
    // Register a setting group for the plugin
    register_setting(
      'post-views-counter-settings-group', // Setting group
      'post-views-counter-settings', // Setting name
      array( $this, 'sanitize_admin_settings' ) // Sanitize callback
    );
    // Add a section for the general settings of the plugin
    add_settings_section(
      'post-views-counter-general-section', // Section ID
      __( 'General Settings', 'post-views-counter' ), // Section title
      array( $this, 'display_general_section' ), // Section callback
      'post-views-counter' // Page slug
    );
    // Add a field for the position of the post views
    add_settings_field(
      'post-views-counter-position-field', // Field ID
      __( 'Position', 'post-views-counter' ), // Field title
      array( $this, 'display_position_field' ), // Field callback
      'post-views-counter', // Page slug
      'post-views-counter-general-section' // Section ID
    );
    // Add a field for the style of the post views
    add_settings_field(
      'post-views-counter-style-field', // Field ID
      __( 'Style', 'post-views-counter' ), // Field title
      array( $this, 'display_style_field' ), // Field callback
      'post-views-counter', // Page slug
      'post-views-counter-general-section' // Section ID
    );
  }

  // Define a method to display the admin page of the plugin
  public function display_admin_page() {
    ?>
    <div class="wrap">
      <h1><?php _e( 'Post Views Counter Settings', 'post-views-counter' ); ?></h1>
      <form method="post" action="options.php">
        <?php
        settings_fields( 'post-views-counter-settings-group' );
        do_settings_sections( 'post-views-counter' );
        submit_button();
        ?>
      </form>
    </div>
    <?php
  }

  // Define a method to sanitize the admin settings of the plugin
  public function sanitize_admin_settings( $input ) {
    // Sanitize the position of the post views
    if ( isset( $input['position'] ) && in_array( $input['position'], array( 'before', 'after', 'manual' ) ) ) {
      $output['position'] = $input['position'];
    } else {
      $output['position'] = 'before';
    }
    // Sanitize the style of the post views
    if ( isset( $input['style'] ) && in_array( $input['style'], array( 'default', 'custom' ) ) ) {
      $output['style'] = $input['style'];
    } else {
      $output['style'] = 'default';
    }
    return $output;
  }

  // Define a method to display the general section of the plugin
  public function display_general_section() {
    echo '<p>' . __( 'These are the general settings for Post Views Counter plugin.', 'post-views-counter' ) . '</p>';
  }

  // Define a method to display the position field of the plugin
  public function display_position_field() {
    // Get the current settings of the plugin
    $settings = get_option( 'post-views-counter-settings' );
    ?>
    <select name="post-views-counter-settings[position]">
      <option value="before" <?php selected( $settings['position'], 'before' ); ?>><?php _e( 'Before content', 'post-views-counter' ); ?></option>
      <option value="after" <?php selected( $settings['position'], 'after' ); ?>><?php _e( 'After content', 'post-views-counter' ); ?></option>
      <option value="manual" <?php selected( $settings['position'], 'manual' ); ?>><?php _e( 'Manual insertion', 'post-views-counter' ); ?></option>
    </select>
    <p class="description"><?php _e( 'Choose where to display the post views.', 'post-views-counter' ); ?></p>
    <?php
  }
  // Define a method to display the style field of the plugin
  public function display_style_field() {
    // Get the current settings of the plugin
    $settings = get_option( 'post-views-counter-settings' );
    ?>
    <select name="post-views-counter-settings[style]">
      <option value="default" <?php selected( $settings['style'], 'default' ); ?>><?php _e( 'Default style', 'post-views-counter' ); ?></option>
<option value="custom" <?php selected( $settings['style'], 'custom' ); ?>><?php _e( 'Custom style', 'post-views-counter' ); ?></option>
</select>
<p class="description"><?php _e( 'Choose the style of the post views.', 'post-views-counter' ); ?></p>
<?php }
// Define a method to add a column for post views in the posts table
public function add_post_views_column( $columns ) {
   // Add a new column after the title column
   $new_columns = array();
   foreach ( $columns as $key => $value ) {
      $new_columns[ $key ] = $value;
      if ( $key == 'title' ) {
         $new_columns['post_views'] = __( 'Views', 'post-views-counter' );
      }
   }
   return $new_columns;
}
// Define a method to display the post views in the posts table
public function display_post_views_column( $column, $post_id ) {
   // If the column is post views, display the number of views of the post
   if ( $column == 'post_views' ) {
      echo post_views_counter_get_views( $post_id );
   }
}
}
// Create an instance of the Post_Views_Counter_Admin class
$post_views_counter_admin = new Post_Views_Counter_Admin();
?>

Phần 5. Xử lý các hook và filters cho Plugin trong WordPress để tương tác với hệ thống

Hook filters là hai khái niệm quan trọng trong WordPress, cho phép bạn tương tác với hệ thống và thay đổi hành vi hoặc kết quả của nó. Bạn có thể sử dụng các hook và filters để thực hiện các hành động hoặc lọc các giá trị liên quan đến Plugin của bạn.

Hook là những điểm chèn (insertion points) trong mã nguồn của WordPress, cho phép bạn chạy các hàm tùy chỉnh khi một sự kiện xảy ra. Có hai loại hook là action hooks và filter hooks.

  • Action hooks là những điểm chèn cho phép bạn thực hiện một hành động khi một sự kiện xảy ra, ví dụ như khi WordPress khởi động, khi một bài viết được lưu, khi một menu được hiển thị, v.v.
  • Filter hooks là những điểm chèn cho phép bạn lọc một giá trị trước khi nó được trả về hoặc hiển thị, ví dụ như khi WordPress lấy nội dung của bài viết, khi WordPress tạo tiêu đề của trang, khi WordPress gửi email, v.v.

Bạn có thể sử dụng các hàm sau để xử lý các hook trong WordPress:

  • add_action(): hàm này cho phép bạn đăng ký một hàm sẽ được gọi khi một action hook được kích hoạt. Bạn cần cung cấp tên của action hook, tên của hàm sẽ được gọi, và ưu tiên (priority) của hàm đó so với các hàm khác cùng gắn với action hook đó.
  • do_action(): hàm này cho phép bạn kích hoạt một action hook và gọi các hàm đã được đăng ký với action hook đó. Bạn cần cung cấp tên của action hook và các tham số (parameters) cho các hàm sẽ được gọi.
  • add_filter(): hàm này cho phép bạn đăng ký một hàm sẽ được gọi khi một filter hook được kích hoạt. Bạn cần cung cấp tên của filter hook, tên của hàm sẽ được gọi, và ưu tiên (priority) của hàm đó so với các hàm khác cùng gắn với filter hook đó.
  • apply_filters(): hàm này cho phép bạn kích hoạt một filter hook và gọi các hàm đã được đăng ký với filter hook đó. Bạn cần cung cấp tên của filter hook, giá trị ban đầu (initial value) và các tham số (parameters) cho các hàm sẽ được gọi.

Ví dụ: Nếu bạn muốn xử lý các hook và filters liên quan đến Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Add an action hook to count and display the post views when the content is displayed
add_action( 'the_content', 'post_views_counter_display_views' );

// Define a function to count and display the post views when the content is displayed
function post_views_counter_display_views( $content ) {
  // Get the current settings of the plugin
  $settings = get_option( 'post-views-counter-settings' );
  // Get the current post ID
  $post_id = get_the_ID();
  // Update the number of views of the post
  post_views_counter_update_views( $post_id );
  // Get the number of views of the post
  $views = post_views_counter_get_views( $post_id );
  // Create a HTML element to display the post views
  $output = '<div class="post-views-counter">';
  $output .= '<span class="post-views-counter-icon"></span>';
  $output .= '<span class="post-views-counter-number">' . $views . '</span>';
  $output .= '<span class="post-views-counter-label">' . __( 'Views', 'post-views-counter' ) . '</span>';
  $output .= '</div>';
  // Apply a filter hook to allow other plugins to modify the output
  $output = apply_filters( 'post_views_counter_output', $output, $post_id, $views );
  // Check the position of the post views
  switch ( $settings['position'] ) {
    case 'before':
      // Return the output before the content
      return $output . $content;
    case 'after':
      // Return the output after the content
      return $content . $output;
    case 'manual':
      // Return only the content
      return $content;
  }
}

// Add a filter hook to add a shortcode for the post views
add_filter( 'post_views_counter_shortcode', 'post_views_counter_shortcode' );

// Define a function to add a shortcode for the post views
function post_views_counter_shortcode( $atts ) {
  // Get the current post ID
  $post_id = get_the_ID();
  // Get the number of views of the post
  $views = post_views_counter_get_views( $post_id );
  // Return the number of views as a shortcode output
  return $views;
}
?>

Phần 6. Giúp Plugin tương tác với cơ sở dữ liệu

1. Sử dụng API của WordPress để truy xuất và cập nhật dữ liệu

WordPress cung cấp một API (Application Programming Interface) để tương tác với cơ sở dữ liệu MySQL, cho phép bạn truy xuất và cập nhật dữ liệu một cách an toàn và hiệu quả. Bạn có thể sử dụng API này để lưu trữ và truy vấn các dữ liệu liên quan đến Plugin của bạn.

API của WordPress bao gồm các thành phần sau:

  • $wpdb: là một biến toàn cục, chứa một đối tượng của lớp wpdb, cho phép bạn thực hiện các truy vấn SQL trực tiếp đến cơ sở dữ liệu. Bạn có thể sử dụng các phương thức của đối tượng này để chuẩn bị, thực thi, lấy kết quả và xử lý lỗi của các truy vấn SQL.
  • Options API: là một bộ các hàm, cho phép bạn lưu trữ và lấy các giá trị tùy chọn (options) của Plugin trong bảng wp_options của cơ sở dữ liệu. Bạn có thể sử dụng các hàm này để thiết lập, lấy, cập nhật và xóa các giá trị tùy chọn.
  • Metadata API: là một bộ các hàm, cho phép bạn lưu trữ và lấy các giá trị siêu dữ liệu (metadata) của các đối tượng như bài viết, người dùng, thuật ngữ, bình luận trong các bảng wp_postmeta, wp_usermeta, wp_termmeta, wp_commentmeta của cơ sở dữ liệu. Bạn có thể sử dụng các hàm này để thêm, lấy, cập nhật và xóa các giá trị siêu dữ liệu.

Ví dụ: Nếu bạn muốn tương tác với cơ sở dữ liệu cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Use $wpdb to create a table to store post views
global $wpdb;
$table_name = $wpdb->prefix . 'post_views';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
  post_id bigint(20) unsigned NOT NULL,
  views bigint(20) unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (post_id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

// Use $wpdb to insert or update a row in the table
global $wpdb;
$table_name = $wpdb->prefix . 'post_views';
$post_id = get_the_ID();
$sql = $wpdb->prepare( "INSERT INTO $table_name (post_id, views) VALUES (%d, 1) ON DUPLICATE KEY UPDATE views = views + 1", $post_id );
$wpdb->query( $sql );

// Use $wpdb to select a value from the table
global $wpdb;
$table_name = $wpdb->prefix . 'post_views';
$post_id = get_the_ID();
$sql = $wpdb->prepare( "SELECT views FROM $table_name WHERE post_id = %d", $post_id );
$views = $wpdb->get_var( $sql );

// Use Options API to store and retrieve the plugin settings
// Store the plugin settings in the wp_options table
update_option( 'post-views-counter-settings', array(
  'position' => 'before',
  'style' => 'default'
) );
// Retrieve the plugin settings from the wp_options table
$settings = get_option( 'post-views-counter-settings' );

// Use Metadata API to store and retrieve the post views as post meta
// Store the post views in the wp_postmeta table
update_post_meta( $post_id, 'post_views', $views );
// Retrieve the post views from the wp_postmeta table
$views = get_post_meta( $post_id, 'post_views', true );
?>

2. Lưu trữ và truy vấn cơ sở dữ liệu trong Plugin

Khi bạn tương tác với cơ sở dữ liệu trong Plugin, bạn cần lưu ý một số điều sau:

  • Bạn nên sử dụng tiền tố (prefix) của bảng cơ sở dữ liệu khi tạo hoặc truy vấn các bảng. Tiền tố này được lưu trữ trong biến toàn cục $wpdb->prefix và có thể khác nhau trên các trang web WordPress khác nhau. Việc sử dụng tiền tố sẽ giúp bạn tránh xung đột với các bảng khác và hỗ trợ WordPress đa trang web (multisite).
  • Bạn nên sử dụng hàm dbDelta() để tạo hoặc cập nhật các bảng cơ sở dữ liệu. Hàm này sẽ kiểm tra xem bảng đã tồn tại hay chưa, và chỉ tạo hoặc cập nhật những thay đổi cần thiết. Hàm này cũng sẽ đảm bảo rằng các bảng tuân theo các quy chuẩn của WordPress.
  • Bạn nên sử dụng phương thức $wpdb->prepare() để chuẩn bị các truy vấn SQL trước khi thực thi. Phương thức này sẽ chèn các giá trị vào các ký tự giữ chỗ (%) trong câu lệnh SQL, và kiểm tra các giá trị đó để tránh các cuộc tấn công SQL injection.
  • Bạn nên sử dụng các phương thức của đối tượng $wpdb để thực thi và lấy kết quả của các truy vấn SQL. Các phương thức này sẽ giúp bạn xử lý các lỗi, bộ nhớ đệm (cache) và phân trang (pagination) của các truy vấn.
  • Bạn nên sử dụng Options API và Metadata API để lưu trữ và lấy các giá trị tùy chọn hoặc siêu dữ liệu của Plugin. Các API này sẽ giúp bạn quản lý các giá trị này một cách dễ dàng và an toàn, và hỗ trợ các tính năng như bộ nhớ đệm, đa ngôn ngữ và lọc.

Phần 7. Tạo giao diện người dùng cho Plugin

1. Xây dựng trang cấu hình và tùy chọn của Plugin

Một Plugin thường cần có một trang cấu hình và tùy chọn để người dùng có thể thiết lập các tham số hoặc lựa chọn cho Plugin. Bạn có thể tạo trang cấu hình và tùy chọn của Plugin bằng cách sử dụng các hàm sau:

  • add_menu_page(): hàm này cho phép bạn thêm một trang menu vào menu chính của bảng điều khiển (dashboard) của WordPress. Bạn cần cung cấp tiêu đề của trang, tiêu đề của menu, khả năng (capability) yêu cầu để truy cập trang, slug của trang, và hàm hiển thị nội dung của trang.
  • add_submenu_page(): hàm này cho phép bạn thêm một trang menu con vào một menu cha của bảng điều khiển của WordPress. Bạn cần cung cấp slug của menu cha, tiêu đề của trang, tiêu đề của menu, khả năng yêu cầu để truy cập trang, slug của trang, và hàm hiển thị nội dung của trang.
  • settings_fields(): hàm này cho phép bạn hiển thị các trường ẩn (hidden fields) liên quan đến nhóm cài đặt (settings group) của Plugin. Bạn cần cung cấp tên của nhóm cài đặt.
  • do_settings_sections(): hàm này cho phép bạn hiển thị các phần (sections) và các trường (fields) liên quan đến trang cài đặt của Plugin. Bạn cần cung cấp slug của trang cài đặt.
  • submit_button(): hàm này cho phép bạn hiển thị nút gửi (submit button) để lưu các cài đặt của Plugin.

Ví dụ: Nếu bạn muốn tạo trang cấu hình và tùy chọn cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Add an action hook to register the admin menu of the plugin
add_action( 'admin_menu', 'post_views_counter_register_admin_menu' );

// Define a function to register the admin menu of the plugin
function post_views_counter_register_admin_menu() {
  // Add a submenu page under the Settings menu
  add_options_page(
    __( 'Post Views Counter Settings', 'post-views-counter' ), // Page title
    __( 'Post Views Counter', 'post-views-counter' ), // Menu title
    'manage_options', // Capability required
    'post-views-counter', // Menu slug
    'post_views_counter_display_admin_page' // Callback function
  );
}

// Define a function to display the admin page of the plugin
function post_views_counter_display_admin_page() {
  ?>
  <div class="wrap">
    <h1><?php _e( 'Post Views Counter Settings', 'post-views-counter' ); ?></h1>
    <form method="post" action="options.php">
      <?php
      settings_fields( 'post-views-counter-settings-group' );
      do_settings_sections( 'post-views-counter' );
      submit_button();
      ?>
    </form>
  </div>
  <?php
}
?>

2. Tạo các trang và mẫu giao diện sử dụng PHP và HTML/CSS

Ngoài trang cấu hình và tùy chọn, một Plugin cũng có thể cần tạo các trang và mẫu giao diện khác để hiển thị các nội dung hoặc chức năng của Plugin cho người dùng. Bạn có thể tạo các trang và mẫu giao diện sử dụng PHP và HTML/CSS, và nhúng chúng vào các tệp của Plugin bằng hàm include() hoặc require().

Bạn nên tuân theo một số quy ước sau khi tạo các trang và mẫu giao diện cho Plugin:

  • Bạn nên đặt các tệp PHP chứa các trang và mẫu giao diện trong thư mục templates hoặc views của thư mục Plugin, để phân biệt với các tệp PHP chứa các hàm và lớp của Plugin.
  • Bạn nên đặt các tệp CSS chứa các kiểu giao diện trong thư mục css của thư mục Plugin, và đăng ký và gọi chúng bằng hàm wp_enqueue_style().
  • Bạn nên đặt các tệp JavaScript chứa các hành động giao diện trong thư mục js của thư mục Plugin, và đăng ký và gọi chúng bằng hàm wp_enqueue_script().
  • Bạn nên đặt các tệp hình ảnh chứa các hình ảnh sử dụng trong giao diện trong thư mục images của thư mục Plugin, và lấy địa chỉ URL của chúng bằng hàm plugins_url().

Ví dụ: Nếu bạn muốn tạo một trang để hiển thị danh sách các bài viết được xem nhiều nhất cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Add an action hook to register the admin menu of the plugin
add_action( 'admin_menu', 'post_views_counter_register_admin_menu' );

// Define a function to register the admin menu of the plugin
function post_views_counter_register_admin_menu() {
  // Add a submenu page under the Dashboard menu
  add_dashboard_page(
    __( 'Post Views Counter Dashboard', 'post-views-counter' ), // Page title
    __( 'Post Views Counter', 'post-views-counter' ), // Menu title
    'read', // Capability required
    'post-views-counter-dashboard', // Menu slug
    'post_views_counter_display_dashboard_page' // Callback function
  );
}

// Define a function to display the dashboard page of the plugin
function post_views_counter_display_dashboard_page() {
  // Include the template file for the dashboard page
  include( POST_VIEWS_COUNTER_PATH . 'templates/dashboard.php' );
}

// Add an action hook to enqueue the style and script for the dashboard page
add_action( 'admin_enqueue_scripts', 'post_views_counter_enqueue_dashboard_style_script' );

// Define a function to enqueue the style and script for the dashboard page
function post_views_counter_enqueue_dashboard_style_script( $hook ) {
  // Check if the current page is the dashboard page of the plugin
  if ( $hook == 'dashboard_page_post-views-counter-dashboard' ) {
    // Enqueue the style for the dashboard page
    wp_enqueue_style( 'post-views-counter-dashboard-style', POST_VIEWS_COUNTER_URL . 'css/dashboard.css' );
    // Enqueue the script for the dashboard page
    wp_enqueue_script( 'post-views-counter-dashboard-script', POST_VIEWS_COUNTER_URL . 'js/dashboard.js', array( 'jquery' ) );
  }
}
?>

Trong tệp templates/dashboard.php, bạn có thể viết như sau:

<?php
// Get the global database object
global $wpdb;
// Get the table name
$table_name = $wpdb->prefix . 'post_views';
// Prepare the SQL query to get the top 10 most viewed posts
$sql = "SELECT p.ID, p.post_title, v.views FROM $table_name v JOIN $wpdb->posts p ON v.post_id = p.ID WHERE p.post_status = 'publish' AND p.post_type = 'post' ORDER BY v.views DESC LIMIT 10";
// Execute the query and get the results
$results = $wpdb->get_results( $sql );
?>
<div class="wrap">
  <h1><?php _e( 'Post Views Counter Dashboard', 'post-views-counter' ); ?></h1>
  <div class="post-views-counter-dashboard">
    <h2><?php _e( 'Top 10 Most Viewed Posts', 'post-views-counter' ); ?></h2>
    <table class="post-views-counter-table">
      <thead>
        <tr>
          <th><?php _e( 'Post ID', 'post-views-counter' ); ?></th>
          <th><?php _e( 'Post Title', 'post-views-counter' ); ?></th>
          <th><?php _e( 'Views', 'post-views-counter' ); ?></th>
        </tr>
      </thead>
      <tbody>
        <?php
        // Loop through the results and display them in the table
        foreach ( $results as $result ) {
          ?>
          <tr>
            <td><?php echo $result->ID; ?></td>
            <td><a href="<?php echo get_permalink( $result->ID ); ?>"><?php echo $result->post_title; ?></a></td>
            <td><?php echo $result->views; ?></td>
          </tr>
          <?php
        }
        ?>
      </tbody>
    </table>
  </div>
</div>

3. Sử dụng các hàm và lớp của WordPress để tạo các thành phần giao diện cho Plugin

WordPress cung cấp một số hàm và lớp để tạo các thành phần giao diện phổ biến, như nút, hộp nhập liệu, bảng, danh sách, v.v. Bạn có thể sử dụng các hàm và lớp này để tạo giao diện cho Plugin của bạn một cách dễ dàng và thống nhất.

Một số hàm và lớp giao diện của WordPress bao gồm:

  • submit_button(): hàm này cho phép bạn hiển thị nút gửi (submit button) để lưu các cài đặt của Plugin.
  • settings_errors(): hàm này cho phép bạn hiển thị các thông báo lỗi hoặc thành công liên quan đến các cài đặt của Plugin.
  • add_settings_error(): hàm này cho phép bạn thêm một thông báo lỗi hoặc thành công liên quan đến các cài đặt của Plugin.
  • WP_List_Table: lớp này cho phép bạn tạo một bảng để hiển thị các dữ liệu có thể sắp xếp, lọc, phân trang và thực hiện hành động hàng loạt.
  • WP_Screen: lớp này cho phép bạn truy xuất và thay đổi các thông tin về màn hình hiện tại của bảng điều khiển WordPress, như tiêu đề, biểu tượng, v.v.
  • WP_Http: lớp này cho phép bạn thực hiện các yêu cầu HTTP đến các trang web khác, như lấy dữ liệu, gửi dữ liệu, v.v.

Ví dụ: Nếu bạn muốn sử dụng các hàm và lớp giao diện của WordPress cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Use submit_button() to display the submit button for the plugin settings
submit_button();

// Use settings_errors() to display the settings errors or success messages
settings_errors();

// Use add_settings_error() to add a settings error or success message
add_settings_error( 'post-views-counter-settings', 'post-views-counter-settings-updated', __( 'Settings updated.', 'post-views-counter' ), 'updated' );

// Use WP_List_Table to create a table to display the post views
class Post_Views_Counter_List_Table extends WP_List_Table {
  // Define a constructor method to initialize the table
  public function __construct() {
    parent::__construct( array(
      'singular' => __( 'Post', 'post-views-counter' ),
      'plural'   => __( 'Posts', 'post-views-counter' ),
      'ajax'     => false
    ) );
  }

  // Define a method to get the columns of the table
  public function get_columns() {
    return array(
      'post_id'    => __( 'Post ID', 'post-views-counter' ),
      'post_title' => __( 'Post Title', 'post-views-counter' ),
      'views'      => __( 'Views', 'post-views-counter' )
    );
  }

  // Define a method to get the sortable columns of the table
  public function get_sortable_columns() {
    return array(
      'post_id'    => array( 'post_id', true ),
      'post_title' => array( 'post_title', false ),
      'views'      => array( 'views', false )
    );
  }

  // Define a method to prepare the items of the table
  public function prepare_items() {
    // Get the current page number
    $current_page = $this->get_pagenum();
    // Get the number of items per page
    $per_page = 20;
    // Get the global database object
    global $wpdb;
    // Get the table name
    $table_name = $wpdb->prefix . 'post_views';
    // Prepare the SQL query to get the post views
    $sql = "SELECT p.ID, p.post_title, v.views FROM $table_name v JOIN $wpdb->posts p ON v.post_id = p.ID WHERE p.post_status = 'publish' AND p.post_type = 'post'";
    // Get the orderby and order parameters
    $orderby = isset( $_GET['orderby'] ) ? esc_sql( $_GET['orderby'] ) : 'post_id';
    $order = isset( $_GET['order'] ) ? esc_sql( $_GET['order'] ) : 'ASC';
    // Append the orderby and order clauses to the SQL query
    $sql .= " ORDER BY $orderby $order";
    // Get the total number of items
    $total_items = $wpdb->query( $sql );
    // Append the limit clause to the SQL query
    $sql .= " LIMIT $per_page";
    $sql .= " OFFSET " . ( $current_page - 1 ) * $per_page;
    // Execute the query and get the items
    $items = $wpdb->get_results( $sql );
    // Set the items property of the table
    $this->items = $items;
    // Set the pagination arguments of the table
    $this->set_pagination_args( array(
      'total_items' => $total_items,
      'per_page'    => $per_page,
      'total_pages' => ceil( $total_items / $per_page )
    ) );
  }

  // Define a method to display the default column value
  public function column_default( $item, $column_name ) {
    switch ( $column_name ) {
      case 'post_id':
      case 'views':
        return $item->$column_name;
      case 'post_title':
        return '<a href="' . get_permalink( $item->ID ) . '">' . $item->post_title . '</a>';
      default:
        return print_r( $item, true );
    }
  }
}

// Create an instance of the Post_Views_Counter_List_Table class
$post_views_counter_list_table = new Post_Views_Counter_List_Table();
// Prepare the items of the table
$post_views_counter_list_table->prepare_items();
// Display the table
$post_views_counter_list_table->display();
?>

4. Sử dụng các hàm và lớp của WordPress để tạo các widget và shortcode cho Plugin

Widget và shortcode là hai khái niệm cho phép bạn hiển thị các nội dung hoặc chức năng của Plugin ở các vị trí khác nhau trên trang web. Bạn có thể sử dụng các hàm và lớp của WordPress để tạo các widget và shortcode cho Plugin của bạn.

  • Widget là các thành phần giao diện có thể kéo thả vào các vùng sidebar hoặc footer của trang web. Bạn có thể tạo widget bằng cách kế thừa lớp WP_Widget và định nghĩa các phương thức cần thiết, như __construct(), widget(), form() và update(). Sau đó, bạn có thể đăng ký widget bằng hàm register_widget().
  • Shortcode là các mã ngắn có thể chèn vào nội dung của bài viết hoặc trang để hiển thị các nội dung hoặc chức năng đặc biệt. Bạn có thể tạo shortcode bằng cách sử dụng hàm add_shortcode() và cung cấp tên của shortcode và hàm xử lý của shortcode.

Ví dụ: Nếu bạn muốn tạo một widget và một shortcode để hiển thị số lượt xem của bài viết cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Add an action hook to register the widget of the plugin
add_action( 'widgets_init', 'post_views_counter_register_widget' );

// Define a function to register the widget of the plugin
function post_views_counter_register_widget() {
  // Register the Post_Views_Counter_Widget class
  register_widget( 'Post_Views_Counter_Widget' );
}

// Define a class to create the widget of the plugin
class Post_Views_Counter_Widget extends WP_Widget {
  // Define a constructor method to initialize the widget
  public function __construct() {
    parent::__construct(
      'post-views-counter-widget', // Base ID
      __( 'Post Views Counter Widget', 'post-views-counter' ), // Name
      array( 'description' => __( 'A widget to display the number of views of the current post.', 'post-views-counter' ) ) // Args
    );
  }

  // Define a method to display the widget on the front-end
  public function widget( $args, $instance ) {
    // Extract the arguments
    extract( $args );
    // Get the title of the widget
    $title = apply_filters( 'widget_title', $instance['title'] );
    // Get the current post ID
    $post_id = get_the_ID();
    // Get the number of views of the post
    $views = post_views_counter_get_views( $post_id );
    // Display the widget before the content
    echo $before_widget;
    // Display the title of the widget if any
    if ( ! empty( $title ) ) {
      echo $before_title . $title . $after_title;
    }
    // Display the number of views of the post
    echo '<div class="post-views-counter-widget">';
    echo '<span class="post-views-counter-widget-icon"></span>';
    echo '<span class="post-views-counter-widget-number">' . $views . '</span>';
    echo '<span class="post-views-counter-widget-label">' . __( 'Views', 'post-views-counter' ) . '</span>';
    echo '</div>';
    // Display the widget after the content
    echo $after_widget;
  }

  // Define a method to display the widget form on the back-end
  public function form( $instance ) {
    // Get the title of the widget
    $title = isset( $instance['title'] ) ? $instance['title'] : __( 'Post Views', 'post-views-counter' );
    ?>
    <p>
      <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'post-views-counter' ); ?></label>
      <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
    </p>
    <?php
  }

  // Define a method to update the widget settings
  public function update( $new_instance, $old_instance ) {
    // Sanitize the title of the widget
    $instance['title'] = strip_tags( $new_instance['title'] );
    return $instance;
  }
}

// Add a filter hook to add a shortcode for the post views
add_filter( 'post_views_counter_shortcode', 'post_views_counter_shortcode' );

// Define a function to add a shortcode for the post views
function post_views_counter_shortcode( $atts ) {
  // Get the current post ID
  $post_id = get_the_ID();
  // Get the number of views of the post
  $views = post_views_counter_get_views( $post_id );
  // Return the number of views as a shortcode output
  return $views;
}
?>

Phần 8. Quốc tế hóa và đa ngôn ngữ cho Plugin

Quốc tế hóa (internationalization) và đa ngôn ngữ (localization) là hai khái niệm cho phép bạn tạo Plugin có thể dịch sang các ngôn ngữ khác nhau. Bạn có thể quốc tế hóa và đa ngôn ngữ hóa Plugin của bạn bằng cách sử dụng các hàm sau:

  • __(): hàm này cho phép bạn dịch một chuỗi sang ngôn ngữ hiện tại của trang web. Bạn cần cung cấp chuỗi cần dịch và tên miền văn bản (text domain) của Plugin.
  • _e(): hàm này cho phép bạn dịch và hiển thị một chuỗi sang ngôn ngữ hiện tại của trang web. Bạn cần cung cấp chuỗi cần dịch và tên miền văn bản của Plugin.
  • load_plugin_textdomain(): hàm này cho phép bạn nạp các tệp dịch (translation files) cho Plugin. Bạn cần cung cấp tên miền văn bản của Plugin và đường dẫn đến thư mục chứa các tệp dịch.

Ví dụ: Nếu bạn muốn quốc tế hóa và đa ngôn ngữ hóa Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Add an action hook to load the plugin text domain
add_action( 'plugins_loaded', 'post_views_counter_load_textdomain' );

// Define a function to load the plugin text domain
function post_views_counter_load_textdomain() {
  // Load the translation files for the plugin
  load_plugin_textdomain( 'post-views-counter', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}

// Use __() to translate a string in the plugin
echo __( 'Post Views Counter Settings', 'post-views-counter' );

// Use _e() to translate and display a string in the plugin
_e( 'Views', 'post-views-counter' );
?>

Phần 9. Kiểm tra và sửa lỗi Plugin

1. Sử dụng công cụ kiểm tra và sửa lỗi của WordPress

WordPress cung cấp một số công cụ để kiểm tra và sửa lỗi cho Plugin, như:

  • WP_DEBUG: là một hằng số, cho phép bạn bật hoặc tắt chế độ gỡ lỗi (debug mode) của WordPress. Khi bật chế độ gỡ lỗi, WordPress sẽ hiển thị các thông báo lỗi, cảnh báo và thông tin trên trang web. Bạn có thể định nghĩa hằng số này trong tệp wp-config.php của trang web.
  • WP_DEBUG_LOG: là một hằng số, cho phép bạn lưu các thông báo gỡ lỗi vào một tệp nhật ký (log file) tên là debug.log trong thư mục wp-content của trang web. Bạn có thể định nghĩa hằng số này trong tệp wp-config.php của trang web.
  • WP_DEBUG_DISPLAY: là một hằng số, cho phép bạn bật hoặc tắt việc hiển thị các thông báo gỡ lỗi trên trang web. Bạn có thể định nghĩa hằng số này trong tệp wp-config.php của trang web.
  • error_log(): là một hàm, cho phép bạn ghi một thông báo gỡ lỗi vào tệp nhật ký hoặc máy chủ. Bạn có thể sử dụng hàm này để ghi các thông báo tùy chỉnh trong Plugin.

Ví dụ: Nếu bạn muốn sử dụng các công cụ kiểm tra và sửa lỗi của WordPress cho Plugin Post Views Counter, bạn có thể viết như sau:

<?php
// Define WP_DEBUG as true in the wp-config.php file
define( 'WP_DEBUG', true );

// Define WP_DEBUG_LOG as true in the wp-config.php file
define( 'WP_DEBUG_LOG', true );

// Define WP_DEBUG_DISPLAY as false in the wp-config.php file
define( 'WP_DEBUG_DISPLAY', false );

// Use error_log() to write a custom debug message in the plugin
error_log( 'Post Views Counter plugin activated.' );
?>

2. Sử dụng công cụ kiểm tra và sửa lỗi của trình duyệt

Trình duyệt cũng cung cấp một số công cụ để kiểm tra và sửa lỗi cho Plugin, như:

  • Console: là một công cụ, cho phép bạn xem các thông báo lỗi, cảnh báo và thông tin từ JavaScript hoặc PHP trên trang web. Bạn có thể mở console bằng cách nhấn F12 hoặc Ctrl + Shift + I trên trình duyệt, và chọn tab Console.
  • Network: là một công cụ, cho phép bạn xem các yêu cầu và phản hồi HTTP từ trang web. Bạn có thể mở network bằng cách nhấn F12 hoặc Ctrl + Shift + I trên trình duyệt, và chọn tab Network.
  • Elements: là một công cụ, cho phép bạn xem và chỉnh sửa mã HTML và CSS của trang web. Bạn có thể mở elements bằng cách nhấn F12 hoặc Ctrl + Shift + I trên trình duyệt, và chọn tab Elements.

Ví dụ: Nếu bạn muốn sử dụng các công cụ kiểm tra và sửa lỗi của trình duyệt cho Plugin Post Views Counter, bạn có thể làm như sau:

  • Sử dụng console để xem các thông báo lỗi từ JavaScript hoặc PHP, ví dụ: Uncaught ReferenceError: jQuery is not defined
  • Sử dụng network để xem các yêu cầu và phản hồi HTTP từ trang web, ví dụ: GET https://example.com/wp-admin/admin-ajax.php?action=post_views_counter_update_views&post_id=123 200 OK
  • Sử dụng elements để xem và chỉnh sửa mã HTML và CSS của trang web, ví dụ:
<div class=“post-views-counter”>
<span class=“post-views-counter-icon”></span>
<span class=“post-views-counter-number”>10</span>
<span class=“post-views-counter-label”>Views</span>
</div>

Phần 10. Đóng gói và phát hành Plugin

1. Tạo tệp readme.txt cho Plugin

Tệp readme.txt là một tệp văn bản, chứa các thông tin cơ bản về Plugin, như tên, mô tả, phiên bản, tác giả, yêu cầu, cài đặt, hỏi đáp, v.v. Bạn nên tạo tệp readme.txt cho Plugin để người dùng có thể hiểu và sử dụng Plugin một cách dễ dàng.

Bạn nên tuân theo một số quy ước sau khi tạo tệp readme.txt cho Plugin:

  • Bạn nên sử dụng định dạng Markdown để viết tệp readme.txt. Markdown là một ngôn ngữ đánh dấu (markup language) đơn giản, cho phép bạn tạo các đoạn văn bản có cấu trúc và định dạng.
  • Bạn nên sử dụng tiếng Anh để viết tệp readme.txt. Tiếng Anh là ngôn ngữ phổ biến và thông dụng nhất trên Internet.
  • Bạn nên sử dụng các phần (sections) và các tiêu đề (headings) để tổ chức nội dung của tệp readme.txt. Bạn có thể sử dụng các ký tự = hoặc – để tạo các tiêu đề cấp 1 hoặc 2, hoặc sử dụng các ký tự # để tạo các tiêu đề từ cấp 1 đến 6.
  • Bạn nên sử dụng các thẻ (tags) để chỉ ra các thông tin quan trọng của Plugin. Các thẻ là các từ khóa được bắt đầu bằng ký tự === và kết thúc bằng ký tự ===. Bạn có thể sử dụng các thẻ sau: === Plugin Name ===, === Plugin URI ===, === Description ===, === Version ===, === Author ===, === Author URI ===, === License ===, === License URI ===, === Text Domain ===, === Domain Path ===, v.v.

Ví dụ: Nếu bạn muốn tạo tệp readme.txt cho Plugin Post Views Counter, bạn có thể viết như sau:

=== Post Views Counter ===
Contributors: nguyenvanhoa
Tags: post views, post views counter, post views widget, post views shortcode
Requires at least: 4.0
Tested up to: 5.8
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Post Views Counter is a simple plugin that allows you to count and display the number of views of your posts.

== Description ==

Post Views Counter is a simple plugin that allows you to count and display the number of views of your posts. You can use this plugin to:

- Track the number of views of your posts in a custom database table.
- Display the number of views of your posts on the front-end using a custom HTML element.
- Customize the position and style of the post views element using the plugin settings page.
- Display the number of views of your posts on the back-end using a custom column in the posts table.
- Display the top 10 most viewed posts on the dashboard using a custom table.
- Display the number of views of your posts using a widget or a shortcode.

== Installation ==

To install Post Views Counter plugin, follow these steps:

1. Download and unzip the plugin files.
2. Upload the post-views-counter folder to the /wp-content/plugins/ directory of your WordPress site.
3. Activate the plugin through the Plugins menu in WordPress.
4. Go to Settings > Post Views Counter to configure the plugin settings.

== Frequently Asked Questions ==

= How can I manually insert the post views element into my theme? =

If you choose the manual insertion option in the plugin settings page, you can use the following code to insert the post views element into your theme:

`<?php if ( function_exists( 'post_views_counter_display_views' ) ) post_views_counter_display_views(); ?>`

= How can I use the shortcode to display the number of views of a post? =

You can use the following shortcode to display the number of views of a post:

`[post_views_counter]`

= How can I change the icon of the post views element? =

You can use the following CSS code to change the icon of the post views element:

`.post-views-counter-icon {
  background-image: url('your-icon-url');
}`

= How can I modify the output of the post views element? =

You can use the filter hook 'post_views_counter_output' to modify the output of the post views element. The filter hook accepts three parameters: $output, $post_id, and $views. For example, you can use the following code to add a prefix to the output:

`add_filter( 'post_views_counter_output', 'post_views_counter_output_prefix', 10, 3 );
function post_views_counter_output_prefix( $output, $post_id, $views ) {
  return 'This post has ' . $output;
}`

2. Tạo tệp zip cho Plugin

Tệp zip là một tệp nén, chứa các tệp và thư mục của Plugin, cho phép bạn đóng gói và phát hành Plugin một cách dễ dàng. Bạn nên tạo tệp zip cho Plugin để người dùng có thể tải về và cài đặt Plugin một cách nhanh chóng.

Bạn nên tuân theo một số quy ước sau khi tạo tệp zip cho Plugin:

  • Bạn nên đặt tên của tệp zip trùng với tên của thư mục chính của Plugin, ví dụ: post-views-counter.zip
  • Bạn nên bao gồm tất cả các tệp và thư mục cần thiết cho Plugin, nhưng loại bỏ các tệp và thư mục không cần thiết, ví dụ: .git, .svn, .DS_Store, v.v.
  • Bạn nên sử dụng công cụ nén (compression tool) để tạo tệp zip, ví dụ: WinZip, 7-Zip, v.v.

Ví dụ: Nếu bạn muốn tạo tệp zip cho Plugin Post Views Counter, bạn có thể làm như sau:

  • Chọn thư mục post-views-counter chứa các tệp và thư mục của Plugin.
  • Chuột phải vào thư mục và chọn Send to > Compressed (zipped) folder.
  • Đổi tên của tệp zip thành post-views-counter.zip

3. Đăng ký và tải lên Plugin lên kho lưu trữ của WordPress

Kho lưu trữ WordPress (WordPress repository) là một nơi để bạn đăng ký và tải lên Plugin của bạn, để người dùng có thể tìm kiếm, tải về và cài đặt Plugin một cách dễ dàng. Bạn nên đăng ký và tải lên Plugin lên kho lưu trữ WordPress để tăng độ phổ biến và uy tín của Plugin.

Bạn nên tuân theo các bước sau để đăng ký và tải lên Plugin lên kho lưu trữ WordPress:

  • Tạo một tài khoản WordPress.org để đăng nhập vào kho lưu trữ WordPress. Bạn có thể đăng ký một tài khoản miễn phí tại https://wordpress.org/support/register.php
  • Kiểm tra xem Plugin của bạn có tuân theo các quy định và tiêu chuẩn của WordPress hay không. Bạn có thể xem các quy định và tiêu chuẩn tại https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/
  • Gửi yêu cầu đăng ký Plugin của bạn lên kho lưu trữ WordPress. Bạn có thể gửi yêu cầu tại https://wordpress.org/plugins/developers/add/
  • Chờ duyệt yêu cầu đăng ký Plugin của bạn. Quá trình duyệt có thể mất từ vài giờ đến vài ngày, tùy thuộc vào số lượng yêu cầu và nhân viên duyệt.
  • Nhận email thông báo về kết quả duyệt yêu cầu đăng ký Plugin của bạn. Nếu yêu cầu được chấp nhận, bạn sẽ nhận được email chứa các thông tin về SVN (Subversion), là hệ thống quản lý phiên bản cho Plugin của bạn.
  • Sử dụng SVN để tải lên các tệp và thư mục của Plugin của bạn lên kho lưu trữ WordPress. Bạn có thể sử dụng công cụ SVN, ví dụ: TortoiseSVN, để kết nối với SVN của Plugin và thực hiện các thao tác như checkout, commit, update, v.v.
  • Kiểm tra xem Plugin của bạn đã xuất hiện trên kho lưu trữ WordPress hay chưa. Bạn có thể kiểm tra bằng cách truy cập vào địa chỉ URL https://wordpress.org/plugins/your-plugin-slug/

4. Cập nhật và bảo trì Plugin

Cập nhật và bảo trì Plugin là quá trình thay đổi và cải thiện Plugin để khắc phục các lỗi, tăng tính năng, tương thích, bảo mật, v.v. Bạn nên cập nhật và bảo trì Plugin thường xuyên để đảm bảo Plugin hoạt động tốt và an toàn.

Bạn nên tuân theo các bước sau để cập nhật và bảo trì Plugin:

  • Bạn nên kiểm tra xem WordPress hoặc các Plugin khác có phiên bản mới hay không. Bạn có thể kiểm tra bằng cách truy cập vào bảng điều khiển WordPress và chọn Updates.
  • Sao lưu (backup) các tệp và cơ sở dữ liệu của trang web trước khi cập nhật Plugin. Bạn có thể sử dụng các công cụ sao lưu, ví dụ: UpdraftPlus, để sao lưu trang web một cách tự động hoặc thủ công.
  • Thử nghiệm (test) Plugin trên một môi trường phát triển (development environment) trước khi cập nhật Plugin trên môi trường sản xuất (production environment). Bạn có thể sử dụng các công cụ tạo môi trường phát triển, ví dụ: Local by Flywheel, để tạo một bản sao của trang web trên máy tính của bạn.
  • Sửa đổi các tệp và cơ sở dữ liệu của Plugin để khắc phục các lỗi, tăng tính năng, tương thích, bảo mật, v.v. Bạn có thể sử dụng các công cụ kiểm tra và sửa lỗi, ví dụ: WP_DEBUG, Console, Network, v.v. để tìm và sửa các lỗi trong Plugin.
  • Tăng phiên bản (version) của Plugin khi cập nhật Plugin. Bạn có thể tăng phiên bản của Plugin bằng cách sửa đổi giá trị của thẻ Version trong tệp chính của Plugin và trong tệp readme.txt của Plugin.
  • Sử dụng SVN để tải lên các tệp và cơ sở dữ liệu mới của Plugin lên kho lưu trữ WordPress. Bạn có thể sử dụng công cụ SVN, ví dụ: TortoiseSVN, để kết nối với SVN của Plugin và thực hiện các thao tác như checkout, commit, update, v.v.
  • Kiểm tra xem Plugin đã được cập nhật thành công trên kho lưu trữ WordPress hay chưa. Bạn có thể kiểm tra bằng cách truy cập vào địa chỉ URL https://wordpress.org/plugins/your-plugin-slug/ và xem phiên bản mới nhất của Plugin.

Kết luận

Trong bài viết này, bạn đã học cách tạo Plugin cho WordPress đơn giản, bằng cách thực hiện các bước sau:

  • Tạo thư mục và tệp chính cho Plugin
  • Đăng ký và kích hoạt Plugin
  • Thêm các hàm và lớp cho Plugin
  • Tương tác với cơ sở dữ liệu trong Plugin
  • Tạo giao diện người dùng cho Plugin
  • Quốc tế hóa và đa ngôn ngữ hóa Plugin
  • Kiểm tra và sửa lỗi cho Plugin
  • Đóng gói và phát hành Plugin
  • Cập nhật và bảo trì Plugin

Hy vọng bài viết này sẽ giúp bạn có được những kiến thức cơ bản về cách tạo một Plugin WordPress đơn giản. Bạn có thể tham khảo thêm các tài liệu sau để nâng cao kỹ năng của mình:

  • https://developer.wordpress.org/plugins/
  • https://codex.wordpress.org/Writing_a_Plugin
  • https://www.wpbeginner.com/wp-tutorials/how-to-create-a-wordpress-plugin/

Đánh giá: 

(0 lượt)
Lưu ý:

*Thông tin trong bài viết đều là những kiến thức chuyên môn và kinh nghiệm thực tế của đội ngũ sáng tạo tại MDIGI . Mọi hành vi sao chép vui lòng ghi trích dẫn nguồn MDIGI.vn! Xem Điều khoản & điều kiện của Chúng tôi.

*Cập nhật mới nhất ngày: 08/08/2023

Đôi nét về tác giả Thieu Bui

Thieu Bui

Phụ trách chính mảng kỹ thuật @ MDIGI

38 bài viết cùng chủ đề Tự học Wordpress

Backup website WordPress là gì? Tại sao cần backup
Tạo trang Thành viên Membership Site với WordPress
Hướng dẫn tạo Blog WordPress chi tiết từ A-Z
02 cách tạo Menu trong WordPress cực đơn giản
03 cách tạo Landing Page WordPress chi tiết từ A-Z
Cấu trúc của thư mục Theme trong WordPress
Ứng dụng PHP để phát triển Website WordPress
Hướng dẫn cài đặt XAMPP chi tiết từ A-Z
Cấu trúc Thư mục WordPress gồm những gì?
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận