after_setup_theme siempre se ejecuta

11

Estoy configurando un tema secundario para algunos de los miembros de mi facultad, y como parte del tema, me gustaría activar un puñado de complementos en el momento en que se activa el tema. Entonces, naturalmente, usé la acción after_setup_theme y llamé a mi función de configuración. Funciona muy bien, excepto que se ejecuta en CADA solicitud (administrador y de otra manera). Lo probé agregando esto al final de la función de configuración:

echo '<script type="text/javascript">alert("This action was run")</script>';

Y como resultado, recibo una alerta de JavaScript en cada solicitud de administrador y en cada solicitud de front-end (tengo una configuración de red, así que obviamente en sitios donde este tema no está activo, no está ejecutando la función)

Entonces la pregunta es, ¿es esto un error? ¿De alguna manera estoy haciendo algo mal? Aquí está el código completo que estoy usando:

add_action( 'after_setup_theme', 'fwp_setup' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
    echo '<script type="text/javascript">alert("This action was run")</script>';
}

Cualquier idea sería muy apreciada!

Aaron Wagner
fuente
SOLUCIÓN: after_switch_themehace exactamente lo que pretendía aquí. Se activa después de que el tema se cambia a su tema. Una de las soluciones mencionadas a continuación utiliza switch_theme. Esto no tiene los resultados deseados, ya que solo ocurre al cambiar de tema. Haga referencia a este comentario de Trac
Aaron Wagner
publíquelo como una respuesta , en lugar de como un comentario a su pregunta. :)
Chip Bennett
2
Disculpas No me dejaría hacer eso todavía. Lo agregaré como respuesta en un momento.
Aaron Wagner

Respuestas:

8

SOLUCIÓN: after_switch_themehace exactamente lo que pretendía aquí. Se activa después de que el tema se cambia a su tema. Una de las soluciones mencionadas a continuación utiliza switch_theme. Esto no tiene los resultados deseados, ya que solo ocurre al cambiar de tema.

Aquí hay un artículo que encontré como referencia: http://core.trac.wordpress.org/ticket/7795#comment:29

Aquí está mi código modificado

add_action( 'after_switch_theme', 'fwp_theme_setup' );
function fwp_theme_setup(){ 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
}
Aaron Wagner
fuente
5

La after_setup_themeacción está destinada a disparar en cada carga de WordPress. Es simplemente parte del proceso durante el cual WordPress invoca el sistema de plantillas, determina los diversos parámetros de configuración para el tema y luego continúa con el procesamiento posterior, como determinar la plantilla correcta para mostrar, etc.

En otras palabras, after_setup_themerepresenta el punto en el que WordPress configura el tema actual, no el punto en el que el administrador activa y / o configura el tema actual.

Lo que está buscando es un enlace de activación de tema , que actualmente no está disponible, pero está bajo consideración / desarrollo .

Chip Bennett
fuente
El enlace de entrada del Codex es terriblemente engañoso entonces. Dice "Este gancho se llama durante una inicialización de temas". Eso significa, para mí, que el gancho debe llamarse cuando está activado. Aunque entiendo lo que estás diciendo. Terriblemente engañoso.
Aaron Wagner
55
init !== activation. Normalmente se llama __construct()función en php también una initfunción. Eso significa: Inicializar la instancia.
kaiser
¡El boleto de tráfico tiene 7 años y parece que no será reparado!
numediaweb
4

Desafortunadamente no hay un gancho de activación del tema. Sin embargo, esta pregunta proporciona una solución alternativa para eso.

Simplemente use el "enlace de activación del tema" para activar los complementos.

Una mejor solución, en la misma línea es esta . Ambos esencialmente usan el switch_themegancho.


Según los comentarios de OP y el ticket de trac vinculado , after_switch_themees el gancho requerido.

Esto pasa el nombre del viejo tema como argumento. Sin embargo, si esto está en su functions.php(que debería ser ...) la devolución de llamada solo se activará cuando se active su tema .

add_action( 'after_switch_theme', 'wpse50298_setup' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}

Del mismo modo, agregue una devolución de llamada a switch_themesolo se llamará cuando su tema esté desactivado.

add_action( 'switch_theme', 'wpse50298_deactivate' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}
Stephen Harris
fuente
Ninguna de estas opciones funcionó para mí. switch_themesolo funcionó después de desactivar el tema. Sin embargo, after_switch_themefuncionó perfectamente.
Aaron Wagner
1
respuesta actualizada :)
Stephen Harris
switch_theme ya no parece funcionar. Creo que es debido a los cambios en la activación 3.4. Al menos no me funciona.
Jake
after_switch_theme funciona perfecto. Esta debería ser la respuesta aceptada. Estoy usando WP 3.5
Ardee Aram el
0

Una mejor solución podría ser utilizar el script de activación del complemento de Thomas Griffin . Esto solicitará a los usuarios que instalen complementos de su elección cuando el tema esté en uso. Creo que esta es una excelente manera de separar el complemento del tema y aún así usarlo.

Dentro de su tema, verifique si el complemento está activo antes de usar sus funciones. Esto permitirá a los usuarios más opciones y control.

Puede configurar el script de activación fácilmente con Knapsack .

Jeff Sebring
fuente
0

Su mejor solución ahora sería usar switch_themehook y filtrar el argumento '$ theme' pasado para ver si es el actual, entonces si no devuelve;

function nw_update_network($theme) {
   if ($theme !== 'my_theme_name') return;

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
numediaweb
fuente