Ma question est très simple mais je n'ai pas encore trouvé cette réponse. Voici un exemple:
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>');
}
}
Voici à quoi ressemble mon code et il échoue. Il affiche le div mais le javascript n'est pas appliqué. Je me suis donc demandé si mon problème fonctionnait avec la fonction init()
dans l'action init, puis en ajoutant register_scripts()
à l'action init, mais je suis déjà dans cette action. Est-ce possible?
Vous devez utiliser une priorité ultérieure (plus élevée). Utilisez donc current_filter()
pour obtenir le hook et la priorité actuels, ajoutez 1 à cette priorité et enregistrez l’action suivante:
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!';
}
Oui, c'est probablement le problème. Pourquoi utilisez-vous cette approche?
Pourquoi ne pas simplement faire ce qui suit?
public function init(){
wp_register_script('my-script', plugins_url('/script.js', __FILE__));
}
Je sais que la question est ancienne, mais dans la version 4.7, WordPress a changé la façon dont ils traitaient les points d'ancrage, de sorte que la réponse ci-dessus ne fonctionnera plus.
La différence pertinente se trouve dans le fichier my-functions.php
qui contient une fonction qui renverra la priorité actuelle d'un point d'ancrage pour les versions antérieures et ultérieures à 4.7.
(Remarque: je n'aime pas ajouter de points d'ancrage dans le constructeur. J'ai donc pris la liberté de structurer le plugin un peu différemment, mais cela fonctionnera de la même manière.)
Dans my-plugin.php:
require_once( PATH_TO . '/my-functions.php' );
require_once( PATH_TO . '/my-class.php' );
add_action( 'plugins_loaded', [ new MyClass(), 'register' ] );
Dans 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;
Dans 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>' );
}
}