Tại sao activ_plugin không hoạt động trong register_activation_hook


10

Tôi đang cố gắng tự động kích hoạt plugin thứ hai trong khi kích hoạt plugin đầu tiên.

register_activation_hook(__FILE__, 'example_activation' );
function example_activation() {
        include_once(ABSPATH .'/wp-admin/includes/plugin.php');
        activate_plugin('hello.php');
}

Nó không hoạt động bên trong register_activation_hook .. Nó hoạt động nếu tôi sử dụng nó trực tiếp như:

include_once(ABSPATH .'/wp-admin/includes/plugin.php');
activate_plugin('hello.php');

Làm thế nào tôi có thể sửa chữa nó? Cảm ơn vì sự giúp đỡ

Giải pháp:

Tôi đang sử dụng điều này cho bản thân mình bây giờ:

// When this plugin activate, activate another plugin too.
register_activation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_inactive($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            /* for some reason, 
            activate_plugin($dependent); 
               is not working */
            activate_plugin('hello.php');
        });
    }
}); 

// When this plugin deactivate, deactivate another plugin too.
register_deactivation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_active($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            deactivate_plugins('hello.php');
        });
    }
}); 

Tôi đọc sai bài viết của bạn ban đầu. Tôi phải nói rằng, nó được định dạng chính xác. Là chức năng này trong chính của plugin của bạn?
Chris

Chỉ một giây thôi. Cần chỉnh sửa bài viết của tôi.
Chris

vâng, đó là plugin đầu tiên cố gắng kích hoạt plugin thứ hai .. plugin thứ hai là hello.php làm ví dụ
Ünsal Korkmaz

Câu trả lời:


8

Để được giải thích đầy đủ về những gì đang xảy ra, hãy xem bài đăng này (đây là để tắt trình cắm, nhưng vấn đề là như vậy).

Một lời giải thích ngắn gọn: Các plugin về cơ bản được kích hoạt bằng cách thêm chúng vào mảng các pug-in hoạt động được lưu trữ trong cơ sở dữ liệu. Khi bạn kích hoạt trình cắm đầu tiên, WordPress sẽ truy xuất mảng của tất cả các trình cắm hiện đang hoạt động, thêm trình cắm vào đó (nhưng chưa cập nhật cơ sở dữ liệu) và sau đó chạy lại cuộc gọi lại cài đặt của bạn.

Cuộc gọi lại cài đặt này chạy mã của bạn.

Sau đó, WordPress cập nhật cơ sở dữ liệu với mảng trên, có chứa trình cắm đầu tiên nhưng không phải là trình cắm thứ hai. Do đó, trình cắm thứ hai của bạn xuất hiện không được kích hoạt.

Giải pháp: đã đề cập trong liên kết ở trên, giải pháp là như thế này (chưa được kiểm tra):

//This goes inside Plugin A.
//When A is activated. activate B.
register_activation_hook(__FILE__,'my_plugin_A_activate'); 
function my_plugin_A_activate(){
    $dependent = 'B/B.php';
    if( is_plugin_inactive($dependent) ){
         add_action('update_option_active_plugins', 'my_activate_dependent_B');
    }
}

function my_activate_dependent_B(){
    $dependent = 'B/B.php';
    activate_plugin($dependent);
}

Nếu bạn có thời gian, tôi chỉnh sửa câu hỏi của mình để viết những gì tôi đang sử dụng. Bạn có thể thấy activ_plugin ($ phụ thuộc); không hoạt động khi kích hoạt plugin. Bất cứ ý tưởng làm thế nào để khắc phục điều đó?
Ünsal Korkmaz

Sao chép mã của bạn vào một trình cắm thử nghiệm (và tạo một hello.phptrình cắm thử nghiệm thử nghiệm khác - nó hoạt động tốt với tôi). Hãy nhớ rằng nếu các trình cắm tồn tại trong thư mục con, bạn sẽ cần cung cấp thư mục: vd hello/hello.php.
Stephen Harris

mã của tôi sẽ hoạt động bình thường .. vấn đề bắt đầu khi bạn thay đổi activate_plugin('hello.php');dòng vớiactivate_plugin($dependent);
Ünsal Korkmaz

Đó là bởi vì biến được cung cấp cho cuộc gọi lại của bạn không phải hello.phplà mảng các trình cắm hiện đang hoạt động. Bạn không thể chuyển các biến của riêng mình cho các cuộc gọi lại như thế. Trừ khi bạn sử dụng các biến lớp / toàn cầu, bạn sẽ cần sử dụng activate_plugin('hello.php');. Nhưng đó không phải là một vấn đề ...?
Stephen Harris

tôi cũng không muốn viết cùng một biến ở nhiều vị trí. nhưng nó không phải là một vấn đề lớn rất nhiều
Ünsal Korkmaz

2

Đây là một người giải thích lý do tại sao nó không hiệu quả với anh ta và làm thế nào anh ta phải sao chép phương thức activ_plugin và tạo một tùy chỉnh của riêng mình mà không gặp vấn đề gì: /programming/1415958/how-to- kích hoạt-wordpress-plugin-nội bộ

Đây là nguồn ban đầu của mã activ_plugin, mà bạn có thể sử dụng để tạo chức năng của riêng mình và xem nơi nào không hoạt động cho bạn: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Đây là một giải pháp khả thi, chứa một phương thức kích hoạt plugin thay thế mà người khác có thể đã lấy từ mã nguồn đó: Làm thế nào để kích hoạt Plugin thông qua Code?


giải pháp đó vẫn không hoạt động trong register_activation_hook
Ünsal Korkmaz

May mắn thay, bây giờ bạn có phương pháp riêng để kích hoạt một plugin, bạn sẽ có thể gỡ lỗi nó và tìm ra nơi nó bị lỗi phải không? :) Bạn đã thay đổi register_activation_hook để sử dụng phương thức activ_plugin tùy chỉnh của bạn thay vì phương thức mặc định? Nếu vậy, hãy ném vào một vài câu lệnh trigger_error và tìm xem nó thất bại ở đâu. Ví dụ, một nơi tốt để bắt đầu sẽ là tìm ra phương thức của bạn sẽ trả về khi thất bại.
mltsy

Tôi đã cố gắng hết sức để gỡ lỗi nhưng tôi không thể tìm thấy lý do. Có thể tùy chọn active_plugins nhận được cập nhật sau khi register_activation_hook được thực thi.
Ünsal Korkmaz

Tôi xin lỗi, tôi vừa sửa thứ tự của hai liên kết tôi đã tráo đổi (hai liên kết cuối cùng). Bạn có đang sử dụng mã từ liên kết có tiêu đề "Cách kích hoạt Plugin thông qua mã không?" Một gợi ý hữu ích khác để cung cấp sẽ là giá trị trả về của activate_pluginphương thức mặc định . Bạn có thể sử dụng trigger_errorđể tìm giá trị trả về, và đăng nó ở đây.
mltsy
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.