Hook de activación de tema en WordPress

16 feb 2013, 18:59:29
Vistas: 20.6K
Votos: 16

Conozco varios trucos para detectar si un tema está activado y he investigado en internet. No estoy buscando que me peguen ese código nuevamente. Lo que busco es saber si las versiones 3.3-3.5 liberaron una nueva función que se ejecute durante theme_init. Vi algún tipo de hook en el codex relacionado con ejecutar acciones después de que un tema ha sido inicializado, pero no puedo recordar dónde.

¿Alguien lo sabe?

0
Todas las respuestas a la pregunta 6
0
47

Para cualquiera que encuentre esta pregunta; existe una acción a la que puedes engancharte (añadida en la versión 3.3.0) que se dispara solo al activar un nuevo tema: after_switch_theme

add_action('after_switch_theme', 'mytheme_setup_options');

function mytheme_setup_options () {
  //haciendo algo...
}

http://codex.wordpress.org/Plugin_API/Action_Reference/after_switch_theme

Para hacer algo al desactivar un tema puedes usar la acción hermana: switch_theme

27 sept 2014 22:33:31
1

Con las funciones de vista previa de temas, es poco probable que alguna vez exista un gancho de activación de temas, ya que los temas necesitan funcionar incluso sin estar "activados".

16 feb 2013 19:21:22
Comentarios

Buen punto @mark-kaplun

wesamly wesamly
16 oct 2016 15:26:46
3

Después de probar el método de @sleepingkiwi me encontré con un problema. Un cliente podría intentar cambiar de tema (aunque sea solo por un momento), lo que podría crear un problema debido a que el hook "on theme activation" que creamos se ejecutó dos veces.

El mejor método es usar after_switch_theme junto con "update_option" de WordPress para guardar y luego verificar un aviso de activación, haciendo así este método a prueba de fallos.

Ejemplo:

add_action('after_switch_theme', 'sgx_activation_hook');
function sgx_activation_hook() {
    if(get_option('SOMEPREFIX_theme_activated') != '1') {

        update_option( 'SOMEPREFIX_theme_activated', '1' );

        // EJECUTAR ACCIONES DE ACTIVACIÓN DEL TEMA AQUÍ

    }
}

Espero que esto ayude.

18 sept 2017 23:59:37
Comentarios

Ese no debería ser el caso, el codex especifica que solo se activa para el tema actual: Theme functions attached to this hook are only triggered in the theme (and/or child theme) being activated. codex

Gerard Reches Gerard Reches
27 may 2020 01:57:26

Pero eso es bueno, ¿no? También necesitamos hacer algo de limpieza después de que el tema se desactive - pero en general, pensaría que es bueno ya que es algo relacionado con el tema

Sagive Sagive
28 may 2020 16:56:39

Claro, lo hace más fácil

Gerard Reches Gerard Reches
29 may 2020 02:11:24
0

Utilizo este código para crear los hooks register_vuewp_theme y unregister_vuewp_theme, de manera que puedo adjuntar funciones a estos hooks fácilmente.

function register_vuewp() {
    $one = get_option('vuewp_theme');
    if (false == $one) {
        update_option('vuewp_theme', 'on');
        do_action('register_vuewp_theme');
    }
}
add_action('admin_init', 'register_vuewp');

function unregister_vuewp() {
    delete_option('vuewp_theme');
    do_action('unregister_vuewp_theme');
}
add_action('switch_theme', 'unregister_vuewp');
21 jul 2023 21:52:49
0

El hook de acción after_switch_theme a veces puede fallar porque solo se activa si el tema anterior aún existe. Esto está documentado en el codex.

También puedes verificarlo directamente en wp-includes/theme.php en la función check_theme_switched() donde se agrega el hook de acción. Verás que el hook de acción "after_switch_theme" está dentro de la condición if ( $old_theme->exists() ) {....}

Si quieres asegurarte de que el hook se active cada vez que un tema se active, sin importar si el tema anterior aún existe, puedes crear tu propio hook personalizado enganchándote al cambio de la opción "stylesheet". Cada vez que se activa un tema, esa opción almacena el nombre del nuevo tema activo. Entonces:

add_action( 'update_option_stylesheet','my_theme_activation_hook',20,3 );
add_action( 'update_site_option_stylesheet','my_theme_activation_hook',20,3 ); //Para instalaciones multisitio

function my_theme_activation_hook( $old_value, $value, $option ){
    //Agrega un hook de acción después de la activación del tema, sin importar si el tema anterior aún existe
    do_action( 'my_after_theme_activation');
}

Luego puedes usar tu hook de acción "my_after_theme_activation" o como quieras llamarlo.

Este método no es perfecto porque un plugin también podría actualizar la opción "stylesheet" sin una activación real del tema. No veo por qué lo harían, pero está permitido, y nunca se sabe. Así que, tomaría eso en cuenta. Úsalo si para ti no es un problema que también se active cuando un nuevo tema no se activa realmente, pero uno de los plugins simplemente cambió la opción "stylesheet".

También podrías engancharte directamente al cambio de la opción "theme_switched" en lugar de "stylesheet". No lo he probado, pero al revisar el código parece que se activa dos veces cuando activas un nuevo tema. La primera vez para guardar el stylesheet del tema anterior, y una segunda vez para guardar el valor "false".

3 nov 2022 13:47:22
5
-5

Puede que estés buscando el hook after_setup_theme:

http://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme

16 feb 2013 19:07:44
Comentarios

¿Puedo usar esta misma función para hacer algo después de la desactivación? El ejemplo parece indicarlo pero tengo curiosidad

TheWebs TheWebs
16 feb 2013 19:11:39

puedes trabajar con $_GET['previewed'] y $_GET['theme']

birgire birgire
16 feb 2013 19:20:32

-1 ya que este hook se ejecuta en cada inicialización de WP. Se activa después de incluir el archivo functions.php del tema, por lo tanto no es un hook de "activación".

Mark Kaplun Mark Kaplun
16 feb 2013 19:20:41

sí es cierto, pero la solución para eso se menciona en la página del Codex, verificar los parámetros GET anteriores o $_GET['activated']

birgire birgire
16 feb 2013 19:23:46

Esta es una mala respuesta que publiqué aquí hace mucho tiempo, por favor evítala, uno no puede eliminar las respuestas aceptadas, gracias

birgire birgire
4 mar 2022 21:02:08