¿Es posible agregar una acción a la acción actualmente en ejecución?

2

Mi pregunta es muy simple pero todavía no he encontrado esta respuesta. Aquí hay un ejemplo:

class MyClass {
  public function __construct(){
    add_action('init', array($this, 'init'));
    add_action('wp_footer', array($this, 'footer'));
  }

  public function init(){
    add_action('init', array($this, 'register_scripts'));
  }

  public function register_scripts(){
    wp_register_script('my-script', plugins_url('/script.js', __FILE__));
  }

  public function footer(){
    echo('<div class="style-me">Rawr this is my plugin.</div>');
  }
}

Así es como se ve mi código y está fallando. Muestra el div pero el javascript no se aplica. Así que me pregunté si mi problema era ejecutar la función init() en la acción de inicio y luego agregar register_scripts() a la acción de inicio pero ya estoy en esa acción. ¿Es esto posible?

    
pregunta Aust 26.06.2013 - 01:25

3 respuestas

3

Tienes que usar una prioridad posterior (más alta). Entonces use current_filter() para obtener el gancho y la prioridad actuales, agregue 1 a esa prioridad y registre la siguiente acción:

add_action( 'init', 'func_1' );

function func_1()
{
    global $wp_filter;

    $hook = current_filter();
    add_action( $hook, 'func_2', key( $wp_filter[ $hook ] ) + 1 );
}

function func_2()
{
    echo 'hi!';
}
    
respondido por el fuxia 26.06.2013 - 01:33
1

Sí, este es probablemente el problema. ¿Por qué estás utilizando este enfoque?

¿Por qué no hacer lo siguiente?

public function init(){
     wp_register_script('my-script', plugins_url('/script.js', __FILE__));
  }
    
respondido por el vancoder 26.06.2013 - 01:34
1

Sé que esta es una pregunta antigua, pero en la versión 4.7, WordPress cambió la forma en que manejaban los enlaces, por lo que la respuesta anterior ya no funcionará.

La diferencia relevante está en el archivo my-functions.php que contiene una función que devolverá la prioridad actual de un gancho para las versiones anteriores y posteriores a 4.7.

(Nota: no me gusta agregar ganchos en el constructor, por lo que me he tomado la libertad de estructurar el complemento de manera un poco diferente, pero funcionará igual.)

En my-plugin.php:

require_once( PATH_TO . '/my-functions.php' );
require_once( PATH_TO . '/my-class.php' );

add_action( 'plugins_loaded', [ new MyClass(), 'register' ] );

En my-functions.php:

if( ! functions_exists( 'current_priority' ) ):
function current_priority() {
  global $wp_filter;
  global $wp_version;
  return version_compare( $wp_version, '4.7', '<' ) ?
    key( $wp_filter[ current_filter() ] ) :
    $wp_filter[ current_filter() ]->current_priority();
}
endif;

En myclass.php:

class MyClass {

  public function register() {
    add_action( 'init', [ $this, 'init' ] );
    add_action( 'wp_footer', [ $this, 'footer' ] );
  }

  public function init(){
    //* Add action to current filter at the next priority
    add_action( current_filter(), [ $this, 'register_scripts' ], current_priority() + 1 );
  }

  public function register_scripts(){
    wp_register_script( 'my-script', plugins_url( '/script.js', __FILE__) );
  }

  public function footer(){
    echo( '<div class="style-me">Rawr this is my plugin.</div>' );
  }
}
    
respondido por el Nathan Johnson 01.02.2017 - 20:20

Lea otras preguntas en las etiquetas