Ngăn chặn kích hoạt mạng của plugin


9

Tôi có một plugin hiện không hỗ trợ kích hoạt mạng. Cách khắc phục tốt nhất cho khóa học này là sửa nó :) mà tôi dự định làm. Tuy nhiên, tôi tự hỏi nếu có một giải pháp tạm thời tôi có thể sử dụng để ngăn chặn kích hoạt mạng trong thời gian này, có lẽ là một quy trình công việc tương tự như:

  1. Phát hiện nếu kích hoạt trên toàn mạng (làm thế nào ??)
  2. Hiển thị thông báo rằng nó hiện không được hỗ trợ và tôi bốc mùi, tôi xin lỗi
  3. Ngắt kích hoạt hoặc hủy kích hoạt

Hoặc, các đề xuất khác được chấp nhận. Cảm ơn.

Để làm rõ: Kích hoạt nhiều trang là tốt, chỉ cần không kích hoạt trên toàn mạng.

Câu trả lời:


5

Các câu trả lời ở đây là quá nhiều và quá phức tạp. Tại sao tắt plugin thay vì ngăn chặn kích hoạt? Một cái gì đó đơn giản như gọi die ('thông báo lỗi của bạn ở đây) khi kích hoạt sẽ thực hiện công việc.

function activate($networkwide) {
    if (is_multisite() && $networkwide) 
       die('This plugin can\'t be activated networkwide');
}

register_activation_hook('your-plugin/index.php','activate');

Sau đó, khi bạn cố gắng kích hoạt trong bảng điều khiển, bạn sẽ nhận được một lỗi tốt ở đầu trang, với thông báo lỗi của bạn.


6

Network: falseThật không may, một tiêu đề plugin sẽ bị bỏ qua bởi WordPress. Nhưng hook kích hoạt nhận được một tham số $network_widevà chúng ta có thể sử dụng nó để hủy kích hoạt plugin trong khi kích hoạt:

<?php
/**
 * Plugin Name: Prevent Network Activation
 * Plugin URI:  http://wordpress.stackexchange.com/questions/76145/prevent-network-activation-of-plugin
 * Network:     false
 *
 * Note the 'Network' option will be ignored by WordPress.
 */

register_activation_hook( __FILE__, 'pna_check_network_activation' );

function pna_check_network_activation( $network_wide )
{
    if ( ! $network_wide )
        return;

    deactivate_plugins( plugin_basename( __FILE__ ), TRUE, TRUE );

    header( 'Location: ' . network_admin_url( 'plugins.php?deactivate=true' ) );
    exit;
}

Điều này hữu ích, nhưng không để tôi giải thích những gì đang xảy ra (ít nhất là như hiện tại). Tôi chỉ có thể đặt một cái wp_dievào đó và bỏ qua việc chuyển hướng, nhưng điều đó dường như chỉ bớt khó khăn hơn một chút so với việc tắt mà không cần giải thích. :)
k3davis

1
Đây là giải pháp tôi đã kết thúc bằng cách sử dụng - Tôi chỉ điều chỉnh chức năng này thành "chết" để gửi tin nhắn thay vì chuyển hướng đến URL hủy kích hoạt. Nó không phải là sạch nhất, nhưng nó đáp ứng tất cả các yêu cầu và có ít chi phí hơn các giải pháp khác, cho một bản vá tạm thời về phía tôi.
k3davis

4

Bạn chỉ có thể ẩn nó khỏi danh sách bổ trợ mạng.

add_filter( 'all_plugins', 'wpse_76145_hide_network_plugin' );
function wpse_76145_hide_network_plugin( $all )
{
    global $current_screen;

    if( $current_screen->is_network )
        unset($all['akismet/akismet.php']);

    return $all;
}

Và hiển thị thông báo quản trị mạng một lần. Điều chỉnh Q & A add_role () chỉ chạy một lần? .

add_action( 'network_admin_notices', 'wpse_76145_admin_notice' );

function wpse_76145_admin_notice()
{ 
    global $current_screen;
    if( 'plugins-network' == $current_screen->id )
    {
        if ( wpse_25643_run_once( 'hide_akismet_network' ) )
            echo '<div class="error">Akismet not available in Network mode</div>';
    }
}

function wpse_25643_run_once( $key )
{
    $test_case = get_option( 'run_once' );

    if ( isset( $test_case[$key] ) && $test_case[$key] )
    {
        return false;
    }
    else
    {
        $test_case[$key] = true;
        update_option( 'run_once',$test_case );
        return true;
    }
}

Hoặc sử dụng kỹ thuật khác này: Thêm thông báo cho người dùng khi đăng nhập lần đầu vào khu vực quản trị


2

(Điều này chưa được kiểm tra)

add_action( 'activated_plugin', 'wpse76145_no_network_activation',10,2 );
function wpse76145_no_network_activation( $plugin, $network_wide){

   if( $plugin == 'myplugin/myplugin.php' && $network_wide ){
       //Plugin was network activated

       //Network deactivate
       deactivate_plugins( $plugin,false, true );

       //Activate on single site
       activate_plugins( $plugin);

       add_option('wpse76145_network_activate_notice',1);
   }

}

Và sau đó admin_noticeskiểm tra wpse76145_network_activate_noticetùy chọn và hiển thị thông báo.

Lưu ý: Sẽ tốt hơn nếu không mã hóa cứng 'myplugin / myplugin.php' - Tôi nghĩ thay thế nó bằng plugin_basename(__FILE__);sẽ hoạt động (và thích hợp hơn).

Chỉnh sửa nếu kích hoạt nhiều trang web là ổn, thì bạn có thể sử dụng switch_to_blog()để kích hoạt trên từng trình cắm riêng lẻ. Tôi vẫn sẽ hiển thị một thông báo vì bạn chưa thực hiện những gì người dùng đã yêu cầu.


Điều này có thể hoạt động, nhưng tôi không hiểu làm thế nào thông báo quản trị viên sẽ được gọi nếu plugin đã bị vô hiệu hóa? Hay đó là kích hoạt trang web duy nhất cho phép điều này xảy ra?
k3davis

Yup, bạn kích hoạt plugin trên trang web chính.
Stephen Harris
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.