Dừng một plugin trong quá trình kích hoạt khi một phiên bản WP nhất định không được đáp ứng, sau đó hiển thị thông báo lỗi trong hook hành động admin_notices


9

Tôi có một plugin mà tôi không muốn được kích hoạt nếu nó không đáp ứng một số phiên bản WP nhất định sau đó hiển thị thông báo lỗi trong hook hành động admin_notices. Theo như tôi đã nghiên cứu, mã dưới đây là cách tốt nhất mà tôi có thể đạt được mục tiêu này:

$wp_version = get_bloginfo('version');
if ( $wp_version < 4.5 ) {
    add_action( 'admin_init', 'deactivate_plugin_now' );
    add_action( 'admin_notices', 'errormsg' ) );
}

public function deactivate_plugin_now() {
    if ( is_plugin_active('myplugin/myplugin.php') ) {
        deactivate_plugins('myplugin/myplugin.php');
    }
}

public function errormsg () {
    $class = 'notice notice-error';
    $message = __( 'Error you did not meet the WP minimum version', 'text-domain' );
    printf( '<div class="%1$s"><p>%2$s</p></div>', $class, $message );
}

Nhưng tôi nghĩ rằng tôi vẫn đang làm sai vì tôi nhận được thông báo kích hoạt plugin cùng lúc với thông báo lỗi mà tôi đã gán.

Dừng một plugin trong quá trình kích hoạt khi một phiên bản WP nhất định không được đáp ứng

Điều gì sẽ là hook / bộ lọc hành động thích hợp để dừng đúng quy trình kích hoạt plugin để tôi chỉ nhận được thông báo lỗi?


Xin vui lòng @CarlAlber để xem xét câu trả lời của tôi.
prosti

Câu trả lời:


6

Tôi có thể bị trễ bữa tiệc này, nhưng để ngừng kích hoạt plugin và để WordPress hiển thị thông báo lỗi nơi thông báo của quản trị viên, tôi chỉ cần xuất thông báo lỗi và chấm dứt thực thi. Điều này có thêm lợi thế là chơi đẹp với wp-cli :

Kích hoạt plugin không thành công

Thí dụ:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

   if ($error) {
      die('Plugin NOT activated: ' . $error);
   }

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));

2

Essentialy, bạn không thể làm theo cách bạn muốn. Tất cả các hình thức wordpress đang chuyển hướng sau khi hoàn thành quá trình của họ và không tự tạo đầu ra và do đó thông báo lỗi được tạo trên một yêu cầu trang khác. Nếu plugin của bạn sẽ không hoạt động tại thời điểm đó, sẽ không có thông báo nào được hiển thị. Điều phức tạp hơn nữa là các plugin có thể được kích hoạt bởi Ajax.

Một cách xấu nhưng hoạt động là thất bại trong việc kích hoạt bằng cách tạo ra lỗi php hoặc IIRC, bất kỳ đầu ra nào cũng sẽ xảy ra, vì vậy bạn chỉ cần xuất ra một cái gì đó như "phiên bản không khớp" trong móc kích hoạt plugin, sẽ được hiển thị trong hộp đầu ra lỗi. đang được hiển thị khi kích hoạt thất bại.

Một vài điều cần suy nghĩ: mọi người có thể bao gồm các tệp plugin của bạn hoặc bằng cách nào đó kích hoạt nó một cách mạnh mẽ bằng cách bỏ qua UI hoặc sử dụng wp-cli. tùy thuộc vào lý do bạn muốn không kích hoạt, chỉ cần có thông báo lỗi có thể tốt hơn là cố gắng không kích hoạt


2

Vì bạn đã cập nhật tiêu đề tôi cần cung cấp câu trả lời khác, câu hỏi trước xin đừng bỏ qua vì nó thậm chí còn đơn giản hơn câu hỏi này.

add_action( 'admin_notices', 'my_plugin_admin_notices' );

function my_plugin_admin_notices() {
    if ( ! is_plugin_active( 'hello.php' ) && isset( $_GET['customhello'] ) ) {
        echo '<div class="error"><p>WordPress need to be at least 8.5 to activate this plugin</p></div>';
    }
}

add_action( 'activate_plugin', '_20170113_superess_activate', 10, 2 );

function _20170113_superess_activate( $plugin, $network_wide ) {
    global $wp_version;
    if ( $wp_version < 8.5 && 'hello.php' == $plugin ) {
        $redirect = self_admin_url( 'plugins.php?customhello=1' );
        wp_redirect( $redirect );
        exit;
    }
}

nhập mô tả hình ảnh ở đây

Xin lưu ý rằng khi bạn cố gắng kích hoạt plugin bạn tương tác với tệp plugins.php. Trong đó bạn có một chuyển đổi lớn của hành động mà bạn có thể chạy.

Và trong trường hợp bạn có lỗi được đặt $_GET['error']tại thời điểm bạn chỉ có các thông báo lỗi được xác định trước - bạn không thể tạo thông báo tùy chỉnh của riêng mình. Đây là lý do tại sao tôi đề xuất cho bạn giải pháp như thế này.

nhập mô tả hình ảnh ở đây

Người ta có thể đề xuất các thông báo tùy chỉnh dưới dạng thông báo của quản trị viên cho lõi WordPress trong trường hợp các plugin không đáp ứng một số yêu cầu.


3
Điều này không hoạt động. Nếu plugin không hoạt động, WP sẽ không thực thi các tập lệnh trong tệp, do đó, khi nhấn url chuyển hướng, chức năng được nối admin_noticessẽ không được kích hoạt.
JakeParis

0

Làm thế nào về mã này để chặn hello.php (Hello Dolly) nếu WP <8,5:

 add_action( 'activate_plugin', '_20170113_superess_activate' , 10, 2);

 function _20170113_superess_activate($plugin, $network_wide){
      global $wp_version;

      if ( $wp_version < 8.5 && 'hello.php' == $plugin ) {
        error_log( 'WordPress need to be at least 8.5' );      
        $args = var_export( func_get_args(), true );
        error_log( $args );
        wp_die( 'WordPress need to be at least 8.5 to activate this plugin' );
      }
 }

Tôi nghĩ rằng điều này là tốt bởi vì nó không buộc bạn phải tạo thông báo quản trị viên. Bạn chỉ cần nhận được phản hồi về lý do phá thai cài đặt plugin.

Tôi đã thêm mã này cho HelloDolly, nhưng bạn sẽ cần điều chỉnh.

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.