par

Les « Hooks »

Que ce soit pour les plugins ou la création du thème lui-même, le développement pour WordPress s’appuie essentiellement sur les « hooks » qui permettent soit :

  • D’exécuter du code à un endroit précis de l’exécution du code principal, ce sont les actions.
  • De manipuler une variable avant de la renvoyer au code principal. ce sont les filtres.

Toutes les actions & filtres natifs n’étant pas encore documentés, il est important consulter le plus souvent possible le code source de WordPress. Cette particularité du développement pour WordPress fera l’objet d’une attention toute particulière en formation.

Actions de base  :  wp_head et wp_footer

wp_head et wp_footer sont vraisemblablement les deux premières actions que vous rencontrerez à l’occasion de la création et / ou de la modification d’un thème. La première permet d’exécuter du code et d’afficher des données dans l’entête html de votre thème (entre les balises head). La seconde permet d’exécuter et/ou d’afficher du code dans le pied de page de votre thème.

Concrètement, une action est déclenchée à l’appel de la fonction do_action(« nom de l’action ») ce qui aura pour conséquence de déclencher toutes les fonctions php branchées sur cette action via la fonction add_action(« nom de l’action », »nom de la fonction »). Les fonctions seront exécutées selon l’ordre de priorité défini par l’utilisateur. A titre d’exemple, nous allons utiliser le hook wp_head pour afficher des commentaires HTML dans l’entête de notre site. Un premier commentaire en tout début d’entête et le second tout en bas.

Pour cela, nous nous placerons dans le fichier functions.php de notre thème. Mais la même chose aurait été possible via un plugin.

<?php //functions.php

add_action('wp_head','display_html_very_high', 1);

function display_html_very_high(){

echo "<!-- Grâce à la priorité 1 passée en argument, je suis placé tout en haut -->";

};

add_action('wp_head','display_html_very_low', 999);

function display_html_very_low(){

echo "<!-- Grâce à la priorité 999 passée en argument, je suis placé tout en bas -->";

}

A noter qu’il est également possible depuis PHP 5.4 de passer par des fonctions « anonymes ». C’est le cas dans la vidéo d’exemple ci-dessous.

Concernant les actions, il est important de retenir dans un premier temps que l’essentiel du code chargé par votre thème ( via le fichier functions.php) doit être exécuté après l’action after_setup_theme.

https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme

Dans l’exemple précédent, notez la création de la sidebar est déclenchée sur l’action widget_init.

Concernant le développement de plugin, c’est après l’action plugins_loaded.

https://codex.wordpress.org/Plugin_API/Action_Reference/plugins_loaded

Comprendre sur quelle action doit s’exécuter son code est primordiale. Un code déclenché trop tôt pourra par exemple déclencher une erreur fatale si l’on s’appuie sur des fonctions ou des classes non encore chargées. L’ordre de chargement est parfaitement décrit ici :

https://codex.wordpress.org/Plugin_API/Action_Reference

Pour bien comprendre et prolonger l’exemple de la sidebar, vous constaterez que dans le chargement global de WordPress, widget_init intervenant après after_setup_theme, il est tout à fait possible de procéder de déclencher la création de sidebar sur widgit_init à l’intérieur même de l’action after_theme_setup.

Le concept est illustré par un thème codé sous forme de « class singleton » en page suivante.

<?php

//functions.php

class My_Theme {

const SIDEBARS = array(

'Main Sidebar'=>'main-sidebar',

'Footer Sidebar'=>'footer-sidebar'

);

private static $instance;
public static function get_instance() {

if ( null === self::$instance ) {

self::$instance = new self();

}

return self::$instance;

}

protected function __construct() {

add_action( 'after_setup_theme', array( $this, 'init' ) );

}

public function init() {

add_action( 'widgets_init', array( $this, 'register_sidebar' ) );

}

public function register_sidebar() {

foreach (self::SIDEBARS as $name => $id) {

register_sidebar( array('name' => $name,'id' => $id ));

}

}

}

return My_Theme::get_instance();

Ecrire un Commentaire

Commenter