Hook de activación de tema en WordPress
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?
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

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.

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

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

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

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".

Puede que estés buscando el hook after_setup_theme
:
http://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme

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

-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".

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']
