Hướng dẫn toàn diện phát triển plugin WordPress: Từ cơ bản đến thực chiến xây dựng tính năng tùy chỉnh

4 phút đọc
2026-03-16
2026-06-03
2,679
Tôi kiếm được hoa hồng khi bạn mua sắm thông qua các liên kết dưới đây, mà không phát sinh thêm chi phí nào cho bạn.

Tổng quan về phát triển plugin cho WordPress

WordPress plugin là một tập hợp các script PHP được sử dụng để mở rộng và nâng cao các chức năng cơ bản của WordPress. Chúng cho phép các nhà phát triển thêm các tính năng mới, công cụ hỗ trợ (widgets), bảng điều khiển quản trị (management panels), hoặc thay đổi cách thức hoạt động của hệ thống mà không cần phải chỉnh sửa mã nguồn gốc của WordPress. Một plugin có thể rất đơn giản (chỉ gồm một tệp duy nhất) hoặc rất phức tạp (bao gồm nhiều thư mục và nhiều loại tệp khác nhau).

Điều quan trọng để hiểu rõ cấu trúc của một plugin là phải nắm được tệp tin “entrance file” (tệp tin đầu vào) của nó. Mỗi plugin phải chứa ít nhất một tệp PHP chính, và ở phần đầu của tệp này, các thông tin cơ bản về plugin phải được cung cấp theo định dạng chuẩn. Những thông tin này sẽ được hệ thống quản lý plugin của WordPress đọc và hiển thị trong danh sách các plugin trên giao diện backend.

Xây dựng plugin đầu tiên của bạn

Tạo cấu trúc tệp tin cơ bản

Trước tiên, bạn cần tạo tệp khởi động (entry file) cho plugin của mình. Hãy thực hiện điều này trong thư mục cài đặt WordPress của bạn.wp-content/plugins/tạo một thư mục mới, ví dụ:my-first-pluginTrong thư mục đó, hãy tạo một tệp PHP chính; tên tệp thường giống với tên của thư mục, ví dụ:my-first-plugin.php

Đọc thêm Bắt đầu từ con số không: Tạo plugin WordPress đầu tiên của bạn

Viết thông tin tiêu đề plugin

Trong tệp chính này, bạn cần thêm một dòng chú thích ở đầu để mô tả plugin, theo tiêu chuẩn của WordPress. Điều này rất quan trọng để plugin có thể được WordPress nhận diện và kích hoạt.

UltaHost – Nhà cung cấp dịch vụ máy chủ WordPress chuyên nghiệp
Bảo đảm hoàn tiền trong 30 ngày, băng thông và cơ sở dữ liệu không giới hạn, bảo vệ DDoS miễn phí, mua 3 năm ưu đãi 50%
<?php
/**
 * Plugin Name:       我的第一个插件
 * Plugin URI:        https://example.com/my-first-plugin
 * Description:       这是一个用于演示的简单插件,它将在文章内容顶部添加一行文字。
 * Version:           1.0.0
 * Author:            你的名字
 * License:           GPL v2 or later
 * Text Domain:       my-first-plugin
 */

Đoạn chú thích này cung cấp thông tin cơ bản về plugin. Sau khi lưu tệp tin, bạn sẽ có thể thấy nó trên trang “Plugins” trong giao diện quản trị WordPress.

Thực hiện một chức năng đơn giản

Tiếp theo, chúng ta sẽ thêm một tính năng đơn giản nhất cho plugin này: hiển thị một dòng văn bản tùy chỉnh ở phía trên mỗi bài viết. Chúng ta có thể sử dụng…the_contentĐiều này được thực hiện thông qua hook lọc (Filter Hook).

function myplugin_add_text_to_content( $content ) {
    $custom_text = '<p>Lời chào này được thêm vào bởi plugin đầu tiên của tôi!</p>';
    return $custom_text . $content;
}
add_filter( 'the_content', 'myplugin_add_text_to_content' );

Hãy thêm đoạn mã này vào tệp plugin chính của bạn.my-first-plugin.phpTrong bước đó, hãy lưu trữ và kích hoạt plugin. Bây giờ, mỗi khi bạn truy cập bất kỳ bài đăng hay trang nào trên trang web, đoạn văn bản được chỉ định sẽ xuất hiện ở phía trước nội dung. Đó chính là cách thức hoạt động cơ bản nhất của plugin này.

Các khái niệm cốt lõi trong phát triển plugin và API

Hiểu cơ chế của các “hook” (móc kết nối)

Hook là yếu tố cốt lõi trong việc phát triển các plugin cho WordPress; nó cho phép bạn đưa đoạn mã của mình vào quá trình thực thi của WordPress hoặc các plugin khác. Có hai loại hook chính: Action và Filter.

Đọc thêm Hướng dẫn chi tiết và thực hành từ đầu về việc phát triển plugin cho WordPress

Chức năng này được thiết kế để thực thi đoạn mã tùy chỉnh của bạn vào một thời điểm cụ thể. Ví dụ,wp_footerHành động này cho phép bạn hiển thị HTML hoặc mã script ở phía dưới trang. Bạn có thể sử dụng nó để thêm các nội dung cần thiết vào đó.add_action()Hàm được sử dụng để gắn (mount) một hành động (action) vào hệ thống.

Các bộ lọc (filters) được sử dụng để thay đổi dữ liệu trước khi chúng được truyền đến cơ sở dữ liệu hoặc trình duyệt. Ví dụ, như trong ví dụ ở trên…the_contentBộ lọc cho phép bạn thay đổi nội dung của bài viết. Bạn cần sử dụng nó để thực hiện các thao tác chỉnh sửa cần thiết.add_filter()Bạn có thể sử dụng một hàm để thêm bộ lọc (filter), và hàm gọi lại (callback) của bạn phải trả về giá trị đã được sửa đổi.

Sử dụng các lớp cơ sở dữ liệu cốt lõi

WordPress cung cấp một lớp trừu tượng cơ sở dữ liệu mạnh mẽ.wpdbĐây là đối tượng được sử dụng để tương tác an toàn với cơ sở dữ liệu. Bạn nên trực tiếp sử dụng đối tượng toàn cục này thay vì gọi trực tiếp các hàm MySQL của PHP.

Hosting.com - lưu trữ chia sẻ
Hiệu năng cao, được trang bị CPU AMD EPYC, lưu trữ SSD NVMe và LiteSpeed, hỗ trợ chuyên gia nội bộ 24 giờ/ngày, các biện pháp bảo mật tiên tiến bao gồm SSL, chống brute force, phần mềm độc hại và bảo vệ DDoS, tiết kiệm tới 73%.

Ví dụ, nếu bạn muốn truy vấn một số thông tin trong cơ sở dữ liệu, bạn có thể làm như sau:

global $wpdb;
$results = $wpdb->get_results( "SELECT id, name FROM {$wpdb->prefix}my_custom_table" );

Vui lòng sử dụng cẩn thận.$wpdb->prefixHãy đảm bảo tính chính xác của tiền tố bảng (table prefix). Đối với các thao tác chèn (insert), cập nhật (update) hoặc xóa (delete), nhất định phải sử dụng tiền tố đúng.wpdbNhững gì được cung cấp…insert()update()Các phương pháp như vậy sẽ tự động xử lý việc đánh dấu ký tự đặc biệt trong dữ liệu (được gọi là “đánh dấu thoát” – data escaping), nhằm ngăn chặn các cuộc tấn công kiểu SQL injection.

Tạo trang cấu hình quản lý

Việc tạo ra một trang cấu hình nền (backend settings page) cho plugin là yêu cầu cơ bản đối với một plugin chuyên nghiệp. WordPress cung cấp nhiều hàm API để thêm các mục menu và trang ở các cấp độ khác nhau; trong đó, hàm được sử dụng phổ biến nhất là…add_menu_page()add_options_page()

Đọc thêm WooCommerce Thực Hành Hướng Dẫn: Xây Dựng Trang Web Thương Mại Điện Tử Chuyên Nghiệp Từ Đầu Đến Cuối

Dưới đây là một ví dụ về cách thêm menu cấp cao và trang cấu hình đơn giản:

function myplugin_add_admin_menu() {
    add_menu_page(
        '我的插件设置',        // 页面标题
        '我的插件',            // 菜单标题
        'manage_options',      // 所需权限
        'myplugin-settings',   // 菜单Slug
        'myplugin_settings_page', // 回调函数,用于输出页面HTML
        'dashicons-admin-generic', // 图标
        6                      // 菜单位置
    );
}
add_action( 'admin_menu', 'myplugin_add_admin_menu' );

function myplugin_settings_page() {
    ?&gt;
    <div class="wrap">
        <h1>Cài đặt plugin của tôi</h1>
        <form method="post" action="/vi/options.php/" data-trp-original-action="options.php">
            <?php
                settings_fields( 'myplugin_settings_group' );
                do_settings_sections( 'myplugin-settings' );
                submit_button();
            ?>
        <input type="hidden" name="trp-form-language" value="vi"/></form>
    </div>
    &lt;?php
}

Ví dụ này sẽ tạo ra một menu cấp cao có tên là “My Plugin” (Tôi’s Plugin). Khi người dùng nhấp vào menu đó, họ sẽ được đưa đến trang chứa nội dung liên quan đến plugin đó.myplugin_settings_pageTrang được tạo ra bởi các hàm (functions). Thông thường, bạn sẽ sử dụng kết hợp với API Cài đặt (Settings API) của WordPress để quản lý và hiển thị nội dung trên trang web.register_setting, add_settings_section, add_settings_fieldĐể xử lý và lưu trữ các thiết lập một cách an toàn.

Máy chủ chia sẻ của InterServer
Lưu trữ chia sẻ với mức phí $2,50 USD mỗi tháng, giảm giá $0,1 USD trong tháng đầu tiên, mã giảm giá tryinterserver, với 461 ứng dụng đám mây và cài đặt chỉ bằng một cú nhấp chuột.

Thực hành dự án: Phát triển một tiện ích quản lý ghi chú

Trong phần này, chúng ta sẽ tổng hợp các kiến thức đã học để tạo ra một tính năng “ghi chú” đơn giản có thể được sử dụng trên trang biên tập bài viết. Tiện ích này cho phép người biên tập thêm những ghi chú nội bộ riêng tư vào bài viết của họ.

tạo bảng cơ sở dữ liệu tùy chỉnh

Trước hết, khi plugin được kích hoạt, chúng ta cần tạo một bảng cơ sở dữ liệu mới để lưu trữ các ghi chú. Điều này có thể thực hiện bằng cách đăng ký một hàm hook (hook function) được kích hoạt (activation hook).register_activation_hooktrong thư mục gốc của dự án.

function my_note_plugin_activate() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'post_notes';
    $charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        post_id bigint(20) NOT NULL,
        note_content text NOT NULL,
        created_by bigint(20) NOT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}
register_activation_hook( __FILE__, 'my_note_plugin_activate' );

Ở đây, chúng ta sử dụng…dbDelta()Các hàm được sử dụng để tạo hoặc cập nhật cấu trúc bảng dữ liệu. Đây là một phương pháp an toàn và có tính tương thích cao.

Thêm khung meta vào giao diện biên tập bài viết.

Tiếp theo, chúng ta cần thêm một ô thông tin (meta box) trên trang biên tập bài viết để hiển thị và lưu trữ các ghi chú (notes). Điều này đòi hỏi sử dụng công cụ hoặc mã nguồn phù hợp để tạo và quản lý ô thông tin đó.add_meta_boxhàm, và gắn nó vàoadd_meta_boxesVề mặt hành động (action).

function my_note_add_meta_box() {
    add_meta_box(
        'my_note_meta_box',         // 元框的唯一ID
        '文章内部便签',             // 显示的标题
        'my_note_meta_box_callback', // 渲染元框内容的回调函数
        'post',                     // 要显示的帖子类型
        'side',                     // 位置
        'default'                   // 优先级
    );
}
add_action( 'add_meta_boxes', 'my_note_add_meta_box' );

function my_note_meta_box_callback( $post ) {
    // 从数据库获取当前文章的已有便签
    global $wpdb;
    $table_name = $wpdb-&gt;prefix . 'post_notes';
    $notes = $wpdb-&gt;get_results( $wpdb-&gt;prepare( "SELECT * FROM $table_name WHERE post_id = %d ORDER BY created_at DESC", $post-&gt;ID ) );

wp_nonce_field( 'my_note_save_action', 'my_note_nonce_field' );
    echo '<textarea name="my_new_note" rows="5" style="width:100%;" placeholder="Nhập những ghi chú nội bộ của bạn..."></textarea>';
    echo '<p class="description">Nhận xét này chỉ có thể được nhìn thấy bởi các biên tập viên và quản trị viên trang web.</p>';

if ( $notes ) {
        echo '<hr><h4>Lưu ý lịch sử:</h4>';
        foreach ( $notes as $note ) {
            $user = get_user_by( 'id', $note-&gt;created_by );
            $username = $user ? $user-&gt;display_name : '未知用户';
            echo '<p><strong>' . esc_html( $username ) . ' (' . $note-&gt;created_at . '):</strong><br>';
            echo nl2br( esc_html( $note-&gt;note_content ) ) . '</p>';
        }
    }
}

Lưu trữ và dọn dẹp dữ liệu

Khi bài viết được lưu trữ hoặc cập nhật, chúng ta cần lưu các ghi chú mới vào cơ sở dữ liệu. Điều này có thể được thực hiện bằng cách…save_postCác hành động cần được thực hiện để hoàn thành công việc này. Đồng thời, khi plugin được xóa (tùy chọn), chúng ta cũng cần cung cấp một hàm hook để thực hiện quá trình gỡ cài đặt plugin.register_uninstall_hookĐến để dọn dẹp các bảng dữ liệu đã được tạo ra.

function my_note_save_post_data( $post_id ) {
    // 检查非ce、权限、自动保存等
    if ( ! isset( $_POST['my_note_nonce_field'] ) || ! wp_verify_nonce( $_POST['my_note_nonce_field'], 'my_note_save_action' ) ) {
        return;
    }
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

if ( ! empty( $_POST['my_new_note'] ) ) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'post_notes';

$wpdb->insert(
            $table_name,
            array(
                'post_id' => $post_id,
                'note_content' => sanitize_textarea_field( $_POST['my_new_note'] ),
                'created_by' => get_current_user_id(),
            ),
            array( '%d', '%s', '%d' )
        );
    }
}
add_action( 'save_post', 'my_note_save_post_data' );

// 可选:卸载插件时删除数据表
function my_note_plugin_uninstall() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'post_notes';
    $wpdb->query( "DROP TABLE IF EXISTS $table_name" );
}
register_uninstall_hook( __FILE__, 'my_note_plugin_uninstall' );

Best Practices and Preparation for Release

Tuân thủ các tiêu chuẩn mã hóa của WordPress

Để đảm bảo tính dễ đọc, dễ bảo trì của mã nguồn và khả năng tương thích với các plugin khác, vui lòng tuân thủ nghiêm ngặt các tiêu chuẩn lập trình PHP chính thức của WordPress. Các tiêu chuẩn này bao gồm nhưng không giới hạn ở: sử dụng định dạng dấu thụt đầu phù hợp (dùng tab thay vì khoảng trắng), đặt tên hàm và biến theo quy ước “snake_case” (chữ thường kết hợp với dấu gạch dưới), đặt tên lớp theo quy ước “UpperCamelCase” (chữ in hoa kết hợp với dấu gạch trên), và sử dụng các hàm hỗ trợ dịch thuật cho tất cả các chuỗi có thể được dịch.

Thực hiện hóa quốc tế hóa (Internationalization)

Một plugin xuất sắc và được kỳ vọng sẽ được sử dụng rộng rãi phải hỗ trợ tính quốc tế hóa (internationalization). Điều này có nghĩa là tất cả các văn bản dành cho người dùng đều cần được đặt bên trong các hàm dịch (translation functions).

WordPress cung cấp…__()_e()_n()Một loạt các hàm… Trước tiên, bạn cần phải thiết lập chúng trong phần thông tin đầu của plugin.Text Domain(Ví dụ: `my-first-plugin`), sau đó tiến hành “bọc” (wrapping) chuỗi đó mỗi khi nó được hiển thị hoặc sử dụng.

Ví dụ:

echo '<p>' . esc_html__( '这是一个演示文本。', 'my-first-plugin' ) . '</p>';

Sau đó, bạn có thể sử dụng các công cụ như Poedit để trích xuất toàn bộ văn bản và tạo ra sản phẩm cần thiết..potTệp tin, dùng để người dịch chuyển đổi sang các ngôn ngữ khác..mo.poTệp.

Tối ưu hóa An ninh và Hiệu suất

An toàn là yếu tố quan trọng nhất trong quá trình phát triển các tiện ích mở rộng (plugin). Hãy luôn kiểm tra và xử lý dữ liệu đầu vào từ người dùng một cách cẩn thận (sanitization), đồng thời tiến hành “đánh dấu đặc biệt” (escaping) cho dữ liệu đầu ra. Trong các truy vấn SQL, nhất định phải sử dụng các biện pháp bảo mật thích hợp để ngăn chặn các cuộc tprepare()Sử dụng các câu lệnh để ngăn chặn việc xâm nhập (injection). Trước khi thực hiện bất kỳ thao tác nào, hãy kiểm tra quyền hạn của người dùng.current_user_can()Đối với các trường hợp không sử dụng cơ chế CE (Cross-Site Encryption), hãy áp dụng cơ chế nonCE của WordPress.wp_nonce_field(), wp_verify_nonce())。

Về mặt hiệu năng, hãy tối ưu hóa các truy vấn cơ sở dữ liệu và tránh thực hiện chúng trong các vòng lặp. Sử dụng API Transients của WordPress một cách hợp lý để tạo bộ nhớ đệm. Khi không cần đến các hook (hàm được gọi tự động trong quá trình thực thi), hãy loại bỏ chúng ngay lập tức.remove_action(), remove_filter()Cuối cùng, hãy đảm bảo rằng thư mục chứa các plugin chỉ chứa những tệp tin cần thiết, và tiến hành nén cũng như dọn dẹp mã nguồn trước khi phát hành.

Sẵn sàng đăng lên kho lưu trữ WordPress.

Nếu bạn dự định phát hành plugin của mình vào danh mục plugin chính thức của WordPress, bạn cần thực hiện một loạt công việc chuẩn bị. Hãy đảm bảo rằng plugin của bạn có giao diện và cấu trúc rõ ràng, dễ sử dụng.readme.txtTệp tin này có định dạng phù hợp với các tiêu chuẩn của WordPress. Nó cần chứa thông tin mô tả về plugin, hướng dẫn cài đặt, câu hỏi thường gặp (FAQ), nhật ký cập nhật phiên bản, v.v. Đồng thời, hãy đảm bảo rằng thông tin ở phần đầu của tệp tin chứa thông tin về plugin (header information) là đầy đủ và chính xác. Hãy kiểm thử kỹ lưỡng tính tương thích của plugin của bạn trên nhiều môi trường khác nhau và các phiên bản WordPress khác nhau.

Tóm lại

Việc phát triển plugin cho WordPress là một quá trình sáng tạo, nhằm biến những ý tưởng thành những tính năng mạnh mẽ và hữu ích. Bằng cách hiểu rõ cấu trúc cơ bản của plugin, nắm vững cơ chế hoạt động của các công cụ như “hook” (Actions và Filters), và thành thạo việc sử dụng các API như Settings API cũng như các thao tác trên cơ sở dữ liệu, bạn có thể tạo ra nhiều loại plugin khác nhau – từ những công cụ đơn giản đến những giải pháp phức tạp. Trong suốt quá trình phát triển, hãy luôn coi tính bảo mật, hiệu suất, các tiêu chuẩn mã nguồn và khả năng hỗ trợ nhiều ngôn ngữ (internationalization) là những yếu tố then chốt. Hãy bắt đầu với việc tạo plugin đầu tiên của mình (chẳng hạn plugin “Hello World”), thực hành từng bước một, và cuối cùng bạn sẽ có thể tự tin tạo ra những plugin chuyên nghiệp, sẵn sàng được phát hành trên nền tảng WordPress.

FAQ 常见问题

Để phát triển các plugin, bạn cần nắm vững những kỹ thuật sau:

Bạn cần có nền tảng PHP vững chắc, am hiểu các ngôn ngữ lập trình HTML, CSS và JavaScript cơ bản. Kiến thức về cơ sở dữ liệu MySQL cũng rất quan trọng. Điều quan trọng nhất là bạn phải hiểu rõ cấu trúc cốt lõi của WordPress, đặc biệt là cơ chế Hook và cấu trúc các file template (mẫu). Kiến thức về lập trình hướng đối tượng (Object-Oriented Programming – OOP) sẽ rất hữu ích khi bạn xây dựng các plugin phức tạp.

Sự khác biệt giữa các hàm trong plugin và theme là gì?

Các plugin được sử dụng để thêm hoặc chỉnh sửa chức năng của trang web. Về mặt lý thuyết, chúng nên được tách rời khỏi giao diện (đồ họa, bố cục) của trang web và phải có khả năng di chuyển cao, tức là vẫn có thể hoạt động bình thường sau khi thay đổi giao diện (theme). Giao diện (theme) chủ yếu kiểm soát vẻ ngoài và cách bố trí của trang web; tuy nhiên, các giao diện hiện đại thường cũng chứa nhiều mã nguồn liên quan đến chức năng (mặc dù điều này được coi là một thực hành không tốt). Thực hành tốt nhất là: nếu một chức năng có mối liên hệ chặt chẽ với cách trang web được hiển thị (ví dụ: hiển thị nội dung theo giao diện cụ thể), thì nó có thể được đặt trong giao diện; còn nếu chức năng đó mang tí

Làm thế nào để xử lý việc cập nhật và đảm bảo tính tương thích của các plugin?

Để xử lý các bản cập nhật, bạn cần thay đổi nội dung trong phần ghi chú ở đầu của plugin.VersionĐối với các bản cập nhật quan trọng, bạn có thể xem xét sử dụng hệ thống thông báo cập nhật và chương trình nâng cấp của WordPress. Chìa khóa để đảm bảo tính tương thích là phát triển nghiêm ngặt theo API cốt lõi của WordPress, tránh sử dụng các hàm riêng tư hoặc đã bị loại bỏ, và…readme.txtTrong tệp tin có ghi rõ phiên bản WordPress tối thiểu mà plugin hỗ trợ. Trước khi phát hành phiên bản mới, hãy chắc chắn thực hiện các bài kiểm thử kỹ lưỡng trên nhiều phiên bản WordPress khác nhau.

Các plugin nên tải các tệp CSS và JavaScript như thế nào?

Bạn tuyệt đối không nên viết mã CSS hoặc JS trực tiếp vào các tệp PHP của plugin. Để đảm bảo tính tương thích và hiệu suất tốt nhất, bạn cần sử dụng hàm `wp_enqueue` của WordPress để tải các tập tin script và bảng định dạng (style sheet) một cách chính xác. Hãy thực hiện điều này trong phần quản trị (backend) của trang web.admin_enqueue_scriptsHook, được sử dụng ở phía trước (frontend).wp_enqueue_scriptsHook. Hãy sử dụng nó.wp_enqueue_style()wp_enqueue_script()Hãy sử dụng các hàm (functions) và hãy chú ý đến việc xử lý các yêu cầu phụ thuộc (dependencies) cũng như các phiên bản (version numbers).

Làm thế nào để thêm loại bài viết tùy chỉnh hoặc hệ thống phân loại tùy chỉnh vào plugin của tôi?

Cách thêm loại bài viết tùy chỉnh (Custom Post Type – CPT) vào hệ thống WordPress:register_post_type()Chức năng: Thêm phương pháp phân loại tùy chỉnhregister_taxonomy()Các hàm. Thực hành tốt nhất là đặt các thao tác đăng ký này ở…initThao tác này được thực hiện trong các “hook” (các điểm kết nối chương trình). Bạn cần cấu hình kỹ lưỡng mảng các tham số đăng ký, bao gồm thông tin về thẻ (tag), mức độ công khai, các tính năng được hỗ trợ, và liệu có trang lưu trữ (archive page) hay không. Những thông số này sẽ quyết định hành vi của nó cả ở phía