Cập nhật Wordpress Hook / Hành động? Kể từ 3.9


15

Tôi đã nghiên cứu điều này một vài lần, nhưng việc tìm kiếm của tôi không tiết lộ nhiều ngoại trừ mã tùy chỉnh có thể hoặc không thể thực hành WordPress tốt.

Kể từ phiên bản mới nhất (WordPress 3.9 "Smith"), có một hook nào được thêm vào quá trình cập nhật plugin không? Tôi đang hỏi bởi vì đó là một nhu cầu rất cơ bản, nhưng tôi không thấy nó được thêm vào codex (chưa). Nếu không, các nhà phát triển thực hành phổ biến và tốt nhất sử dụng là gì?

EDIT: Chỉ cần làm rõ, tôi không nói về kích hoạt, nhưng về việc cập nhật, theo cách đó, nếu có thay đổi trong cơ sở dữ liệu hoặc nếu không nó có thể được giải quyết.



@drzaus trả lời miễn là không có thực hành tốt.
Rens Tillmann

Dù sao thì @RensTillmann cũng đã hết hạn 2 năm, q / a được liên kết về cơ bản có cùng một câu trả lời nhưng trước câu hỏi này thêm 2 năm nữa, do đó 'trùng lặp'.
drzaus

Câu trả lời:


15

Tôi không nghĩ rằng một hành động đã được thêm vào. Bạn có thể xem chi tiết phiên bản cho bất kỳ phiên bản nào và xem bất kỳ hành động mới nào được thêm vào.

Cách WordPress để chạy mã trên cập nhật plugin là những gì được mô tả ở đây :

Cách thích hợp để xử lý đường dẫn nâng cấp là chỉ chạy quy trình nâng cấp khi bạn cần. Lý tưởng nhất là bạn sẽ lưu trữ một phiên bản tiếng Đức trong tùy chọn cơ sở dữ liệu của plugin và sau đó là phiên bản trong mã. Nếu chúng không khớp, bạn sẽ thực hiện quy trình nâng cấp của mình và sau đó đặt tùy chọn cơ sở dữ liệu bằng với phiên bản trong mã. Đây là cách nhiều plugin xử lý các nâng cấp và đây cũng là cách hoạt động của lõi.

và với ví dụ mã ở đây :

function myplugin_update_db_check() {
    global $jal_db_version;
    if (get_site_option( 'jal_db_version' ) != $jal_db_version) {
        jal_install();
    }
}
add_action( 'plugins_loaded', 'myplugin_update_db_check' );

Cảm ơn bạn - Tôi sẽ đơn giản sử dụng phương pháp đó sau đó. WP thực sự phải thêm một hành động cho việc này: D
user1915665

8
về mặt kỹ thuật bạn nên sử dụng register_activation_hook, vì trong hầu hết các trường hợp, một plugin bị vô hiệu hóa / kích hoạt bất cứ khi nào bạn cập nhật nó từ quản trị viên. Hooking to plugins_loadedsẽ kiểm tra của bạn trên mỗi lần tải trang (bao gồm cả lối vào). Đã có cuộc nói chuyện về việc giới thiệu register_update_hook, nhưng nó đã được đánh dấu là WONTFIX một thời gian trước đây. Các cuộc thảo luận có ích.
drzaus

4
Điều quan trọng là phải hiểu rằng một bản cập nhật plugin hàng loạt KHÔNG chạy hook kích hoạt - nó NÊN, nhưng không ở 3.9.2. Theo "cập nhật hàng loạt" Tôi có nghĩa là một bản cập nhật được thực hiện từ trang cập nhật Bảng điều khiển. Các cập nhật riêng lẻ được thực hiện từ bên trong trang plugin chạy các hook tốt.
Brian C

4
Vấn đề là các plugin cũng có thể được cập nhật qua FTP, điều đó có nghĩa là hook sẽ không bị bắn trong mọi trường hợp. Đó là lý do tại sao bạn cần sử dụng tùy chọn được lưu trữ trong cơ sở dữ liệu.
giraff

4
Để mở rộng nhận xét của @ giraff, điều tương tự cũng đúng với những người quản lý mã của họ bằng kiểm soát nguồn như SVN hoặc Git. Do đó, câu trả lời này là cách tốt nhất để xử lý các nâng cấp.
gỡ lỗi

3

Từ cuộc thảo luận nơi họ quyết định không thêm móc / chức năng tùy chỉnh cụ thể để nâng cấp , có vẻ như "hầu hết mọi người" (tính đến 4 năm trước) register_activation_hook, vì nó được gọi khi plugin được nâng cấp thông qua trang quản trị; hầu hết các ví dụ tôi đã thấy từ đó theo xu hướng đó.

Đối với hầu hết các sử dụng, tôi sẽ đề nghị không móc qua plugins_loaded , vì nó sẽ được gọi trên mỗi lần tải trang. Ngoại lệ cho vấn đề này được đề cập trong cuộc thảo luận: đường dẫn nâng cấp qua FTP / SVN là 'trường hợp cạnh', vì WP sẽ không có cơ chế để biết rằng plugin đã được thay đổi, trong trường hợp đó, câu trả lời trước có thể phù hợp hơn.

Xem https://gist.github.com/zaus/c08288c68b7f487193d1 để biết ví dụ về 'khung đơn giản' bằng cách sử dụng register_activation_hook.


register_activation_hookkhông được đảm bảo để được chạy trên các bản cập nhật, xem make.wordpress.org/core/2010/10/27/ trên
Flimm

Rất nhiều - KHÔNG sử dụng plugins_loaded- chạy mọi tải và có thể nặng / chậm.
cale_b

3

Kể từ WordPress 3.9, bạn có thể sử dụng upgrader_process_completehook.
Xem tài liệu tham khảo 1 , 2

Đây là một mã ví dụ:

<?php 
/**
 * Plugin Name: Test plugin 1
 * Plugin URI: http://rundiz.com
 * Description: A very simple plugin for testing. This plugin do nothing.
 * Version: 0.1.8
 * Author: Vee Winch
 * Author URI: http://rundiz.com
 * License: MIT
 * License URI: https://opensource.org/licenses/MIT
 * Text Domain: test-plugin1
 * Domain Path: 
 */


$wppstp1_version = '0.1.8';


add_action('upgrader_process_complete', 'wppstp1_upgrade', 10, 2);// will working only this plugin activated.
function wppstp1_upgrade(\WP_Upgrader $upgrader_object, $hook_extra)
{
    global $wppstp1_version;

    if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) {
        // check first that array contain required keys to prevent undefined index error.
        if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) {
            // if this action is update plugin.
            $this_plugin = plugin_basename(__FILE__);

            foreach ($hook_extra['plugins'] as $each_plugin) {
                if ($each_plugin == $this_plugin) {
                    // if this plugin is in the updated plugins.
                    // don't process anything from new version of code here, because it will work on old version of the plugin.
                    file_put_contents(WP_CONTENT_DIR . '/test.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND); // you will always get the previous version even you update to the new version.
                    // set transient to let it run later.
                    set_transient('wppstp1_updated', 1);
                }
            }// endforeach;
            unset($each_plugin);
        }// endif update plugin and plugins not empty.
    }// endif; $hook_extra
}// wppstp1_upgrade


add_action('plugins_loaded', 'wppstp1_runUpdatedPlugin');
function wppstp1_runUpdatedPlugin()
{
    global $wppstp1_version;

    if (get_transient('wppstp1_updated') && current_user_can('manage_options')) {
        // if plugin updated and current user is admin.
        file_put_contents(WP_CONTENT_DIR . '/test-update-by-transient.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND);// you will always get the updated version here.

        // update code here.

        // delete transient.
        delete_transient('wppstp1_updated');
    }
}// wppstp1_runUpdatedPlugin

Khi plugin được cập nhật, nó sẽ đặt tác vụ vào db bằng cách sử dụng set_transient()hàm. Không nên thêm mã cập nhật trong khi gọi upgrader_process_completehook.
Tiếp theo, nếu bạn duyệt đến trang quản trị khác,plugins_loaded hook sẽ hoạt động và mã cập nhật sẽ hoạt động ở đó.

Xin lưu ý rằng plugin này phải được kích hoạt để cập nhật hook hoạt động.
Điều này không hoạt động trên plugin kích hoạt, vì vậy, nếu bạn muốn mã hoạt động khi kích hoạt plugin, bạn phải mã hóa nó trong register_activation_hook()chức năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.