Hook WordPress comprendre add_action(), add_filter() et do_action()
Après pas mal de recherche sur le net, j’ai trouvé de nombreux articles les hooks WordPress mais peu d’article qui donne des explications satisfaisantes. Cet article est là pour vous donner une définition des hook, des exemples pour comprendre comment ces fonctions interagissent entre elles.
Hook définition :
En anglais, hook signifie crochet ou hameçon. Plus précisément, un hameçon est une pointe en fer qui est accroché au d’un fils en nylon, lui-même attaché à une canne à pêche qui va permettre d’attraper un poisson.
En terminologie WordPress, un hook WP est une fonction qui va permettre de modifier une action existante grâce à un comportement nouveau. Si je continue sur la métaphore de la pêche :
- le hook WordPress va jouer le rôle de la pointe en fer qui va relier
- le comportement nouveau peut être considéré comme le fil, la canne à pêche
- l’action existante qui peut être considéré comme le poisson
Hook WordPress, comment ça marche :
Pour mettre en place un hook, il faut utiliser add_action()
La syntaxe de add_action est la suivante :
<?php add_action( $tag, $callback_function, $priority, $accepted_args ); ?>
Si je continue sur la métaphore de la pêche, voici une représentation alternative de la fonction add_action :
Et do_action() ?
…
Liste des actions existantes fréquemment hookées :
Front Office :
tag action | description |
---|---|
wp_head | |
wp_footer | |
the_title | |
exemple utilisation :
add_filter( 'the_title', function( $title ) { return '<b>' . $title . '</b>'; } ); |
|
comments_open | |
exemple utilisation :
function wpc_comments_closed( $open, $post_id ) { $post = get_post( $post_id ); if ('page' == $post->post_type) $open = false; return $open; } add_filter('comments_open', 'wpc_comments_closed', 10, 2); |
|
Backoffice :
tag action | description |
---|---|
admin_menu | |
exemple utilisation :
function remove_menus(){ if(get_current_user_id()<>1){ remove_menu_page( 'index.php' ); //Dashboard remove_menu_page( 'edit.php' ); //Posts remove_menu_page( 'upload.php' ); //Media remove_menu_page( 'edit.php?post_type=page' ); //Pages remove_menu_page( 'edit-comments.php' ); //Comments remove_menu_page( 'themes.php' ); //Appearance remove_menu_page( 'plugins.php' ); //Plugins remove_menu_page( 'users.php' ); //Users remove_menu_page( 'tools.php' ); //Tools remove_menu_page( 'options-general.php' ); //Settings } } add_action( 'admin_menu', 'remove_menus' ); |
|
wp_before_admin_bar_render | |
exemple utilisation :
function remove_admin_bar_links() { if(get_current_user_id()<>1){ global $wp_admin_bar; $wp_admin_bar->remove_menu('comments'); // Remove the comments link $wp_admin_bar->remove_menu('new-content'); // Remove the content link } } add_action( 'wp_before_admin_bar_render', 'remove_admin_bar_links' ); |
|
wp_dashboard_setup | |
exemple utilisation :
function kill_all_dash_widgets() { global $wp_meta_boxes; //Widget de Press Minute unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']); unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_activity']); //Widget des liens entrants unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']); //Widget des statistiques: nombre d'articles, de pages, etc. unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']); //Widget des news sur les plugins WordPress unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); //Widget de brouillons recents unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']); //Widget des commentaires recents unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']); //Widget des infos "Blog WordPress" unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); //Widget des autres actualités de wordpress unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); } add_action( 'wp_dashboard_setup', 'kill_all_dash_widgets' ); |
|
manage_posts_columns | |
exemple utilisation :
function remove_comments_columns($columns) { // Remove comments column unset($columns['comments']); unset($columns['wm-thumb']); return $columns; } add_filter('manage_posts_columns', 'remove_comments_columns'); |
|
Trouver les hooks utilisables :
….