ป้องกันการเปิดใช้งานเครือข่ายของปลั๊กอิน


9

ฉันมีปลั๊กอินที่ไม่รองรับการเปิดใช้งานเครือข่ายในขณะนี้ การแก้ไขที่ดีที่สุดสำหรับหลักสูตรนี้คือการแก้ไข :) ซึ่งฉันวางแผนจะทำ อย่างไรก็ตามฉันสงสัยว่ามีวิธีแก้ปัญหาชั่วคราวที่ฉันสามารถใช้เพื่อป้องกันการเปิดใช้งานเครือข่ายในระหว่างนี้อาจเป็นเวิร์กโฟลว์ที่คล้ายกับ:

  1. ตรวจสอบว่าการเปิดใช้งานทั่วทั้งเครือข่าย (อย่างไร ??)
  2. แสดงข้อความที่ไม่รองรับในปัจจุบันและฉันเหม็นฉันขอโทษ
  3. ขัดจังหวะการเปิดใช้งานหรือปิดใช้งาน

หรือยอมรับคำแนะนำอื่น ๆ ขอบคุณ

สำหรับการชี้แจง: การเปิดใช้งานหลายไซต์นั้นใช้ได้ แต่ไม่ใช่การเปิดใช้งานทั้งเครือข่าย

คำตอบ:


5

คำตอบที่นี่มีความคิดมากและซับซ้อนเกินไป ทำไมเลิกใช้งานปลั๊กอินแทนที่จะป้องกันการเปิดใช้งาน บางสิ่งที่ง่ายพอ ๆ กับการเรียก die ('ข้อความแสดงข้อผิดพลาดของคุณที่นี่) เมื่อเปิดใช้งานจะทำงาน

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

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

จากนั้นเมื่อคุณพยายามเปิดใช้งานในแผงควบคุมคุณจะได้รับข้อผิดพลาดที่ดีด้านบนของหน้าพร้อมข้อความแสดงข้อผิดพลาด


6

Network: falseWordPress ส่วนหัวจะถูกละเว้นโดย ... น่าเสียดาย แต่ฮุกการเปิดใช้งานจะได้รับพารามิเตอร์$network_wideและเราสามารถใช้เพื่อปิดการใช้งานปลั๊กอินในระหว่างการเปิดใช้งาน:

<?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;
}

สิ่งนี้มีประโยชน์ แต่อย่าให้ฉันอธิบายสิ่งที่เกิดขึ้น (อย่างน้อยก็ตามที่ปรากฏในปัจจุบัน) ฉันสามารถใส่wp_dieในที่นั่นและข้ามการเปลี่ยนเส้นทาง แต่ดูเหมือนว่าไม่มีรสนิยมที่ดีกว่าการปิดใช้งานโดยไม่มีคำอธิบายเล็กน้อย :)
k3davis

1
นี่เป็นวิธีการแก้ปัญหาที่ฉันใช้โดย - ฉันเพิ่งปรับฟังก์ชั่นนี้เป็น "ตาย" เพื่อส่งข้อความแทนที่จะเปลี่ยนเส้นทางไปยัง URL ที่ปิดใช้งาน มันไม่ได้สะอาดที่สุด แต่มันตรงตามข้อกำหนดทั้งหมดและมีค่าใช้จ่ายน้อยกว่าโซลูชั่นอื่น ๆ สำหรับแพทช์ชั่วคราวในส่วนของฉัน
k3davis

4

คุณสามารถซ่อนได้จากรายการปลั๊กอินเครือข่าย

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;
}

และแสดงการแจ้งเตือนผู้ดูแลระบบเครือข่ายแบบครั้งเดียว การปรับ Q&A add_role () ทำงานเพียงครั้งเดียว .

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;
    }
}

หรือใช้เทคนิคอื่นนี้: เพิ่มประกาศให้กับผู้ใช้เมื่อเข้าสู่ระบบครั้งแรกไปยังพื้นที่ผู้ดูแลระบบ


2

(นี่คือยังไม่ทดลอง)

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);
   }

}

จากนั้นadmin_noticesตรวจสอบwpse76145_network_activate_noticeตัวเลือกและแสดงประกาศ

หมายเหตุ:มันจะดีกว่าที่จะไม่ hardcode 'myplugin / myplugin.php' - ฉันคิดว่าการแทนที่ด้วยplugin_basename(__FILE__);จะใช้งานได้ (และจะดีกว่า)

แก้ไขหากการเปิดใช้งานหลายเว็บไซต์นั้นใช้ได้คุณสามารถใช้switch_to_blog()เพื่อเปิดใช้งานปลั๊กอินแต่ละรายการได้ ฉันจะยังคงแสดงการแจ้งเตือนเมื่อคุณไม่ได้ทำสิ่งที่ผู้ใช้ถาม


อาจใช้งานได้ แต่ฉันไม่เข้าใจว่าจะมีการแจ้งให้ผู้ดูแลระบบทราบอย่างไรหากปลั๊กอินถูกปิดการใช้งานอยู่แล้ว หรือมันเป็นการเปิดใช้งานไซต์เดียวที่ให้สิ่งนี้เกิดขึ้น?
k3davis

ใช่คุณเปิดใช้งานปลั๊กอินในเว็บไซต์หลัก
Stephen Harris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.