El Action Hook personalizado del plugin no funciona

25 nov 2013, 20:27:40
Vistas: 22.1K
Votos: 2

Estoy tratando de crear un plugin básico donde quiero crear mi propio action hook. Aquí está el código para el mismo.

<?php
/*
Plugin Name: Demo Plugin
Version: 1.0
*/

do_action('basic_action_demo');
?>

Ahora después de activar este plugin quiero usar este action hook en el archivo functions.php de mi tema actual, el código es el siguiente:

add_action('basic_action_demo','action_demo');

function action_demo()
{
    echo "Estoy dentro";
}

El problema es que mi action hook nunca se ejecuta, podemos ver que do_action se llama incondicionalmente por lo que se llamará en cada carga de página pero nunca entra en el método "action_demo".

Lo que he descubierto hasta ahora es que el plugin se carga antes de que se ejecute el archivo functions.php de mi tema. Así que aquí do_action se llama primero y luego add_action.

Una pista sería muy apreciada.

Actualización:

El siguiente código del plugin funciona.

<?php
/*
Plugin Name: Demo Plugin
Version: 1.0
*/

add_action('basic_action_demo','action_demo');
do_action('basic_action_demo');

function action_demo()
{
    echo "Estoy dentro";
    die;
}
?>
4
Comentarios

El orden de tus 'do' y 'add' no es correcto. Por favor explica qué quieres lograr con tu propio action hook para que podamos ayudarte a determinar dónde/cómo necesitas agregarlos.

Twifty Twifty
25 nov 2013 20:36:27

@Waldermort Bueno, digamos que tengo un plugin con un formulario simple. Quiero llamar a mi propio action hook una vez que ese formulario sea enviado. Espero que esto aclare lo que quiero decir.

Avinash Avinash
25 nov 2013 20:39:07

Lo siento, no es muy claro. Puedes llamar a tu hook desde tu script manejador del formulario, momento en el que el core ya debería estar completamente cargado. Todo realmente depende de cómo crees ese código y cómo manejes tus variables de consulta.

Twifty Twifty
25 nov 2013 20:46:39

@Waldermort El problema que he descubierto (según tu respuesta a continuación) es que el archivo del plugin se está cargando antes que el archivo del tema. ¿Tienes alguna guía específica sobre cómo debería manejarse esto?

Avinash Avinash
25 nov 2013 20:53:01
Todas las respuestas a la pregunta 1
5

Tu plugin debe esperar a que se cargue el archivo functions.php del tema. Prueba esto:

<?php
/*
Plugin Name: Demo Plugin
Version: 1.0
*/

add_action( 'after_setup_theme', function() {
    do_action( 'basic_action_demo' );
} );
?>

El hook after_setup_theme se ejecuta inmediatamente después de que se carga functions.php.

Actualización para tu comentario a continuación. En tu plugin crea una función para tu formulario:

<?php
/*
Plugin Name: Demo Plugin
Version: 1.0
*/

function output_my_form () {
    echo "Soy un formulario";
    // realiza tu acción aquí
    do_action( 'basic_action_demo' );
}
?>

Luego en el functions.php de tu tema:

if ( function_exists( 'output_my_form' ) ) {
    output_my_form();
}

Este es un ejemplo simple. En la realidad querrías llamar a esa función desde un archivo form.php en tu tema.

25 nov 2013 20:40:59
Comentarios

Esto funciona, pero ¿es esta la única manera de agregar mi propio hook de acción en los archivos del plugin o me estoy perdiendo algo?

Avinash Avinash
25 nov 2013 20:48:32

@Avinash ¿Cuándo quieres que se ejecute tu código? Un plugin está hecho para estar disponible para un tema, por eso se cargan primero. Si quieres ejecutar código de tu plugin desde tu tema, simplemente crea un conjunto de funciones en tu plugin y llámalas desde tu tema. Si quieres ejecutar código del tema desde un plugin (no es una buena idea) entonces usa el hook de acción mencionado anteriormente para esperar a que cargue el tema y luego llama a esas funciones desde el manejador de la acción.

Twifty Twifty
25 nov 2013 21:00:55

Tengo mi código de envío de formulario en mi archivo de plugin, así que después de eso he hecho do_action('my_action') pero no está funcionando :(

Avinash Avinash
25 nov 2013 21:03:41

OK. Estoy empezando a entender. No generes tu formulario cuando se cargue tu plugin. Crea una función para ello, luego llama a esa función desde tu tema. Actualizaré mi respuesta.

Twifty Twifty
25 nov 2013 21:06:04

@Avinash Por favor, recuerda votar/aceptar si consideras que la respuesta es útil :)

Twifty Twifty
25 nov 2013 21:38:58