Voici un modèle classique de page single.php permettant d’afficher un post (article) WordPress :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php get_header(); ?> <div id="main"> <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?> <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <h1><?php the_title(); ?></h1> <div class="entry-content"> <?php the_content(); ?> </div><!-- .entry-content --> <?php comments_template( '', true ); ?> </div><!-- #post-## --> <?php endwhile; // end of the loop. ?> </div><!-- #main --> <?php get_sidebar(); ?> <?php get_footer(); ?> |
Vous connaissez cela par coeur. Et vous savez que dans la boucle (while ( have_posts() ) : the_post();), vous pouvez appeler différentes fonctions qui utilisent les données récupérées par la requête principale WordPress dans l’objet $post.
Ainsi
1 | the_content(); |
équivaut à :
1 | $post->post_content; |
Etc.
WordPress extraie d’emblée une série de données relative au post (article) dans sa requête principale (son titre, son contenu, son extrait, sa date de publication, etc.). Voici un exemple de contenu d’un objet $post pour un article de ce site :
1 2 3 4 5 6 7 8 9 | WP_Post Object ( [ID] => 688 [post_author] => 1 [post_date] => 2013-04-10 22:00:06 [post_date_gmt] => 2013-04-10 21:00:06 [post_content] => La barre d'administration, nouveauté apparue avec la version 3.1 de WordPress, s'affiche par défaut à la fois côté administration et côté site dès qu'un utilisateur est connecté et quels que soient ses droits d'accès. Evidemment, un simple abonné qui clique sur la barre d'administration pour passer du côté administration ne verra pas grand chose, mais son impression sera pourtant bien celle d'être "passé de l'autre côte de la barrière". Dans bien des cas, il est logique de faire une différence entre les utilisateurs administrateurs ou éditeurs de WordPress et les utilisateurs de plus bas niveaux (abonnés, etc.) qui accèdent à des fonctions spéciales du site Web et se distinguent en cela des utilisateurs non connectés (simples visiteurs) mais qui n'ont pour autant rien à faire du côté administration. Pour désactiver la barre d'administration en ne l'affichant que si l'utilisateur connecté est un administrateur: if (!current_user_can('manage_options')) { add_filter('show_admin_bar', '__return_false'); // intervient sur le filtre show_admin_bar et retourne false } Qu'est-ce que ce __return_false? Très utile ! WordPress propose une valeur "spéciale" pour les filtres, qui permet de "court-circuiter" la chaîne des actions de filtre pour retourner directement une valeur, sans se préoccuper des éventuels traitements ultérieurs. En un mot, utiliser __return_false, dans ce contexte (celui d'un filtre), c'est avoir la certitude que la valeur retournée sera bien false au final (et non une autre valeur, suite aux diverses modifications opérées par les fonctions ultérieures du filtre, qui auraient repris la valeur false et, en lui appliquant d'autres transformations, auraient abouti à une autre valeur). Il en existe d'autres : __return_true, __return_zero ou __return_empty_array. Par défaut, la capacité manage_options n'est attribuée qu'aux super-administrateurs ou administrateurs. Donc pas aux éditeurs. Si vous souhaitez l'afficher aussi pour les éditeurs, vous pouvez par exemple utiliser la capacité moderate_comments. Référez-vous au tableau des correspondances entre capacités et rôles dans le Codex WordPress : http://codex.wordpress.org/Roles_and_Capabilities#manage_options [post_title] => Supprimer la barre d'administration pour les utilisateurs WordPress qui ne sont pas des administrateurs [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => supprimer-la-barre-dadministration-pour-les-utilisateurs-wordpress-qui-ne-sont-pas-des-administrateurs [to_ping] => [pinged] => [post_modified] => 2013-04-10 22:26:52 [post_modified_gmt] => 2013-04-10 21:26:52 [post_content_filtered] => [post_parent] => 0 [guid] => http://macadamcodeboys.com/?p=688 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) |
Cela fait pas mal d’informations. En général, dans un template de post, on se sert d’une bonne partie de cela (notamment les informations de contenu).
Mais savez-vous que WordPress récupère bien d’autres données au passage, à l’aide de son propre mécanisme de cache ?
Vous pouvez non seulement manipuler l’objet $post, mais aussi un autre objet qui se trouve à disposition aussi et s’appelle $wp_object_cache. Que contient-il? En refaisant l’essai pour le même article, on obtient 5 ou 6 fois plus de données mises en cache qu’il n’y en a dans l’objet $post ! Faites l’essai sur l’un de vos articles :
1 |
Vous aurez quelques surprises! Une foule de données ont été collectées et mises en mémoire. Et il est même possible de récupérer les données insérées dans vos champs personnalisés (custom fields) directement en récupérant les entrées du tableau cache de cet objet, comme ceci :
1 |
Voilà tous vos champs personnalisés qui défilent!
Inutile de générer des requêtes supplémentaires pour récupérer les données des champs personnalisés. C’est bien le principe du cache. Ah, mais d’ailleurs WordPress fonctionne précisément ainsi, son objet $wp_object_cache sert à éviter de multiplier les aller-retour vers la base de données. Si vous examinez la fonction get_post_meta dans les fichiers core de WordPress, vous verrez qu’elle appelle get_metadata qui s’occupe elle-même directement de scruter dans l’objet $wp_object_cache et qu’elle ne réalise pas (sauf en l’absence de cache, justement) de nouvelle requête sur la base de données.
Bon très bien. Pourquoi je vous dis tout ça alors? Simplement pour expliquer ce qui se passe à l’arrière-plan et pourquoi, ce qui peut aider notamment quand on se pose des questions. Toutes les fonctions get_post_meta, get_post_custom et get_metadata s’appuient sur ce mécanisme de cache (elles vont d’abord vérifier dans l’objet cache si les données s’y trouvent et ne font de véritable requête à la base de données que dans le cas contraire). Ce sont donc des fonctions que vous pouvez utiliser de manière répétitive dans les contextes des boucles : dans une boucle qui charge une série de posts, toutes les métadonnées de tous les articles de la boucle sont mises en cache. Vous pouvez donc appeler 100 fois get_post_meta afin de récupérer des données de champs personnalisés sans paniquer : il n’y aura vraisemblablement aucun appel supplémentaire à la base de données puisque tout est déjà là, dans l’objet $wp_object_cache et ces fonctions opèrent la vérification pour vous.
La preuve, voici le commentaire, dans le fichier core WordPress post.php, pour la fonction get_post_custom :
1 2 3 | * The post meta fields are retrieved from the cache where possible, // les champs personnalisés de post sont récupérés depuis le cache dès que cela s'avère possible * so the function is optimized to be called more than once. // la fonction est donc optimisée pour être appelée plusieurs fois |
C’est tout pour aujourd’hui.


