remove_action no funciona con la función de procedimiento

2

He comprado un tema que carga una acción como la siguiente:

function func() {
    echo "head content";
}
add_action( 'wp_head', 'func', 5 );

Siguiendo el eliminar el códice de acción intenté lo siguiente:

remove_action( 'wp_head', 'func', 5 );

Lo que no funcionó, así que pensé que era un problema prioritario, así que ajusté tanto más alto como más bajo ninguno funcionó. Luego intenté envolver la función en otra función como:

function testfunc() {
    if (remove_action( 'wp_head', 'func', 5 )) {
        echo "removed action";
    }
}
add_action( 'wp_head', 'testfunc', 1000 );

De nuevo jugando con la prioridad. Todo el tiempo remove_action devuelve true pero no elimina la acción. Luego intenté agregar la función de ajuste en la acción init y funcionó. ¡Genial! Lamentablemente no tengo ni idea de por qué. Algo más desconcertante es la función de envoltura que se requiere. Por último, el códice establece específicamente:

  

También vale la pena señalar que es posible que deba priorizar la eliminación de la acción a un enlace que se produce después de agregar la acción . No puede eliminar la acción correctamente antes de que se haya agregado.

Y de acuerdo con esta entrada de códice tanto init como get_header (que funcionó) están antes de wp_head acción en la que se enganchó la función. ¿Alguien puede desmitificar esto por mí?

Editar: Para responder a la pregunta de @ sumit, add_action ocurre mediante una inclusión en los temas principales functions.php (incluye library / core.php). El remove_action está en las funciones. Php del tema secundario.

    
pregunta JSP 06.04.2016 - 01:12

1 respuesta

4

El problema aquí es que las funciones del tema secundario.php se cargan antes que las funciones del tema principal.php. Por lo tanto, el orden de las acciones de agregar / eliminar sería algo así:

//* From the child theme
remove_action( 'wp_head', 'func', 5 );
//* From the parent theme
add_action( 'wp_head', 'func', 5 );

La devolución de llamada a func en el enganche wp_head se elimina antes de agregarse. Por lo tanto, parecerá que el tema secundario que elimina la acción no funciona. En realidad, la función remove_action() está intentando eliminar la devolución de llamada func del enganche wp_head , pero aún no se ha agregado.

La solución es conectar en WordPress en cualquier momento después de que el tema principal functions.php se cargue y luego eliminar la acción.

add_action( 'after_setup_theme', 'wpse_222809_after_setup_theme' );
function wpse_222809_after_setup_theme() {
  remove_action( 'wp_head', 'func', 5 );
}

Esto funciona porque el enganche after_setup_theme se dispara después de las funciones del tema principal.php, por lo que el orden de las acciones de agregar / eliminar sería:

//* From the child theme
add_action( 'after_setup_theme', 'wpse_222809_after_setup_theme' );
//* From the parent theme
add_action( 'wp_head', 'func', 5 );
//* From the wpse_222809_after_setup_theme function hooked to after_setup_theme 
//*( hook added in child theme )
remove_action( 'wp_head', 'func', 5 );

Esto también funcionaría con la sustitución de after_setup_theme con init , como se dio cuenta, porque el enganche init se activa después de las funciones del tema principal.php y antes de wp_head .

    
respondido por el Nathan Johnson 27.04.2017 - 23:48

Lea otras preguntas en las etiquetas