¿Es posible usar add_action dentro de una función en WordPress?

20 mar 2012, 05:37:49
Vistas: 18K
Votos: 6

Estoy intentando agregar algo de JS al head usando add_action('wp_head', 'js_func'); lo cual funciona cuando se coloca justo después de la función. Sin embargo, no quiero que se cargue en todas las páginas, solo en la página relevante, y estoy intentando hacerlo así:

function cosas_para_hacer_en_esta_pagina() {
    add_action('wp_head', 'js_func');
    // otras cosas de la función  
}

Sin embargo, cuando se llama de esta manera, el JS no se inserta en absoluto, lo que rompe la página.

¿Es posible hacer esto?

2
Comentarios

¿en qué momento del proceso de solicitud estás llamando a esa función?

Milo Milo
20 mar 2012 05:55:58

Probablemente sería más útil si reformularas tu pregunta para preguntar cómo engancharse a una acción condicionalmente. También: ¿cuáles son las condiciones bajo las cuales quieres encolar este script?

Chip Bennett Chip Bennett
20 mar 2012 17:02:08
Todas las respuestas a la pregunta 1
2

Si deseas saber si estás en una página específica, entrada, en un archivo de categoría, etc., el núcleo de WordPress ofrece Etiquetas Condicionales para esto.

Si deseas enlazar una definición de script JS, entonces una mejor manera de hacerlo es la siguiente:

// Asumiendo que colocas tu código JS en un archivo separado en lugar de solo entre etiquetas <script>

// 1ro: Registrar durante el hook init
function add_my_script()
{
    wp_register_script( $name, $url, $dependency, filemtime( $path ), true )
}
add_action( 'init', 'add_my_script' );

// 2do: Encolar durante el hook enqueue
function enqueue_my_script()
{
    // Elige tus condiciones:
    // En el Admin, verifica contra "global $hook_suffix, $pagenow, $typenow"
    if ( 'post-new.php' !== $typenow )
        return;
    // En páginas públicas, elige tus condiciones de la lista de Etiquetas Condicionales
    // Ejemplo: Solo en páginas
    if ( ! is_page() )
        return;
    // ...Nada que hacer en login

    // imprime el script en pantalla
    wp_enqueue_script( $name );
}
// Elige donde lo necesitas
add_action( 'wp_enqueue_scripts', 'enqueue_my_script' );
add_action( 'admin_enqueue_scripts', 'enqueue_my_script' );
add_action( 'login_enqueue_scripts', 'enqueue_my_script' );

EDITAR

Puedes resumir/recolectar todas tus pequeñas funciones, que se enlazan en algún lugar y colocar las llamadas add_action en una función que se carga en el primer hook disponible para los temas: after_setup_theme. Lo importante es que el functions.php del tema hijo se carga primero, luego el del tema padre y después el hook after_setup_theme. Así puedes dejar abierta la posibilidad de cambiar cosas desde tu tema padre o hijo.

function theme_bootstrap_fn() 
{
    add_action( 'wp_head', 'js_func' );
    // otras cosas de funciones
}
add_action( 'after_setup_theme', 'theme_bootstrap_fn' );

// Define tu función:
function js_func()
{
    echo "
        <script type='text/javascript>
            // hacer cosas
            // Añadir variables así:
            {$some_var}
        </script>";
}

Pero para responder tu pregunta: Sí, puedes llamar cualquier función global dentro de otra función.

20 mar 2012 06:00:23
Comentarios

Tengo el script, es solo un fragmento de código "suelto" que quiero colocar para mostrar y ocultar divs basado en una casilla de verificación, así que no necesito encolar todos los scripts, solo colocarlo en la página cuando se llame a esa función particular.

Joshua Joshua
20 mar 2012 07:48:19

@Joshua Quizás más adelante agregarás más js, así que en mi humilde opinión nunca es una mala idea. Si estás usando plugins como Cachify, entonces los archivos se recopilan y agrupan en uno solo, así que no importa. Pero: Mira la edición.

kaiser kaiser
20 mar 2012 16:54:09