Prevenir la activación de red del complemento

9

Tengo un complemento que actualmente no admite la activación de red. La mejor solución para esto, por supuesto, es solucionarlo :) lo que planeo hacer. Sin embargo, me pregunto si hay una solución temporal que pueda usar para evitar la activación de la red mientras tanto, tal vez un flujo de trabajo similar a:

  1. Detectar si la activación es en toda la red (¿cómo?)
  2. Mostrar mensaje de que actualmente no es compatible, y apesto, lo siento
  3. Interrumpir la activación o desactivar

O, otras sugerencias aceptadas. Gracias.

Para aclarar: la activación multisitio está bien, pero no la activación de toda la red.

k3davis
fuente

Respuestas:

5

Las respuestas aquí son excesivas y demasiado complejas. ¿Por qué desactivar el complemento en lugar de evitar la activación? Algo tan simple como llamar a morir ('su mensaje de error aquí) después de la activación hará el trabajo.

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

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

Luego, cuando intente activar en el panel, obtendrá un buen error en la parte superior de la página, con su mensaje de error.

Maciej Krawczyk
fuente
6

Network: falseWordPress ignorará un encabezado de complemento ... desafortunadamente. Pero el enlace de activación obtiene un parámetro $network_wide, y podemos usarlo para desactivar el complemento durante la activación:

<?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;
}
fuxia
fuente
Esto es útil, pero no me deja explicar lo que está sucediendo (al menos como se presenta actualmente). Podría poner un wp_dieallí y omitir la redirección, pero eso parece solo un poco menos pegajoso que desactivar sin explicación. :)
k3davis
1
Esta es la solución que terminé usando: simplemente ajusté esta función para "morir" para enviar el mensaje en lugar de redirigir a la URL desactivada. No es el más limpio, pero cumple con todos los requisitos y tiene menos gastos generales que las otras soluciones, por un parche temporal de mi parte.
k3davis
4

Simplemente podría ocultarlo de la lista de complementos de red.

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

Y muestre un aviso de administrador de red único. ¿La adaptación de Q&A add_role () se ejecuta solo una vez? .

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

O utilice esta otra técnica: agregue un aviso a los usuarios al iniciar sesión por primera vez en el área de administración

brasofilo
fuente
2

(Esto no ha sido probado)

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

}

Y luego admin_noticesverifique la wpse76145_network_activate_noticeopción y muestre el aviso.

Nota: Sería mejor no codificar 'myplugin / myplugin.php'. Creo que reemplazarlo plugin_basename(__FILE__);funcionaría (y sería preferible).

Edite si la activación multisitio está bien, entonces puede usar switch_to_blog()para activar en cada complemento individualmente. Todavía mostraría un aviso ya que no has hecho lo que el usuario ha pedido.

Stephen Harris
fuente
Esto podría funcionar, pero no entiendo cómo se llamará al aviso de administrador si el complemento ya está desactivado. ¿O es la activación de un solo sitio lo que permite que esto suceda?
k3davis
Sí, activas el complemento solo en el sitio principal.
Stephen Harris