Запобігання мережевій активації плагіна


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опції та покажіть повідомлення.

Примітка. Було б краще не жорстко кодувати "myplugin / myplugin.php" - я думаю, що замінити його на plugin_basename(__FILE__);спрацювало б (і було б краще).

Змініть, якщо активація на декількох сайтах нормальна, тоді ви можете використовувати її switch_to_blog()для активації кожного плагіна окремо. Я б все одно відображав повідомлення, оскільки ви не зробили те, що запитав користувач.


Це може спрацювати, але я не розумію, як буде викликано повідомлення адміністратора, якщо плагін уже відключений? Або це може активізувати єдиний сайт?
k3davis

Так, ви активуєте плагін лише на головному сайті.
Стівен Харріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.