Tout savoir sur WordPress
Tutoriel WordPress

Post Formats : Subdiviser les articles en plusieurs types

Découvrez à travers ce guide complet comment fonctionne les Post Formats de WordPress qui permettent de subdiviser les articles en plusieurs types.

Disponible depuis la version 3.1, les Posts Formats permettent de subdiviser les articles en plusieurs types afin de leur appliquer un style différent en choisissant parmi l’un des types de contenu fournis par WordPress lui-même :

  • aside : article rapide (sans titre)
  • chat : une discussion
  • gallery : une galerie d’images affichant les images d’un post
  • link : Une présentation d’un ou plusieurs liens externes
  • image : une présentation d’une simple image
  • quote : une citation
  • status : un statut, comme Twitter ou Facebook par exemple
  • video : une vidéo
  • audio: un podcast, une musique ou autre sons
La MetaBox des Post Formats dans l'édition d'un article
La MetaBox des Post Formats dans l’édition d’un article

Déclarer les Post Formats

Pour déclarer les Post Formats, il faut utiliser la fonction add_theme_support() de WordPress :
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


add_theme_support('post-formats', $post_formats);

[/pastacode]

'post-formats' indique le support des Post Formats et la variable $post_formats est un array contenant la liste des Post Formats que l’on souhaite utiliser.

Dans l’exemple ci-dessous, on déclare le support des Post Formats video et audio :

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


add_theme_support( 'post-formats', array( 'video', 'audio' ) );

[/pastacode]

Support des Post Formats pour les Custom Post Types

Par défaut, les Post Formats sont déclarés uniquement pour les articles. Pour permettre le support des Post Formats à un Custom Post Type, il faut procéder de la façon suivante :

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


add_post_type_support('mon-custom-post-type', 'post-formats');

[/pastacode]

Une mise en page différente en fonction du Post Format

L’intérêt des Post Formats est de pouvoir personnaliser la mise en page des articles en fonction de leur type de contenu. La fonction has_post_format() permet de détecter si un article contient le Post Format indiqué en tant qu’argument de la fonction.

Dans l’exemple ci-dessous, on affiche le contenu d’un template en fonction du Post Format de l’article :

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


if( has_post_format( 'video' ) )
    get_template_part( 'format', 'video' );	
else if( has_post_format( 'audio' ) )
    get_template_part( 'format', 'audio' );	
else 
    get_template_part( 'format', 'standard' );

[/pastacode]

En général, on place ce code à l’intérieur d’une loop, mais on peut l’utiliser n’importe où en indiquant l’ID de l’article comme ci-dessous :

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


$post_id = 10;
if( has_post_format( 'video', $post_id ) ) {
    // Suite du code	
}

[/pastacode]

Récupérer les articles en fonction de la valeur du Post Format

Dans certains cas, on peut avoir besoin d’afficher les articles en fonction du Post Format. Il faut savoir que les Post Formats font partis des taxonomies présentes par défaut dans WordPress. Par conséquent, il est tout à fait possible d’utiliser une requête personnalisée à l’aide des tax_query pour récupérer des articles possédant un Post Format particulier.

Par exemple, à l’aide du code suivant, on configure la requête afin de récupérer les articles possédant le Post Format gallery ou video :

[pastacode lang=”php” message=”” highlight=”” provider=”manual”]


$args = array(
    'tax_query' => array(
        array(
	    'taxonomy' => 'post_format',
	    'field' => 'slug',
	    'terms' => array('post-format-gallery', 'post-format-video'),
	    'operator' => 'IN'
	)
    )
);

$articles = WP_Query( $args );

if( $articles->have_posts() ) : while ( $articles->have_posts() ) : $articles->the_post();
    // ICI, la suite de votre code	
endwhile; endif;
wp_reset_query();

[/pastacode]

Des informations complémentaires sur les tax_query sont disponibles sur le codex de WordPress :
http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

Améliorer l’interface d’administration des Post Formats

Par défaut, la gestion des Post Formats n’est pas intuitive. En plus d’être minimaliste au niveau de l’encart de sélection du Post Format, il n’existe pas, par exemple, de champ personnalisé permettant d’associer facilement une vidéo ou un son à un article dont le Post Format choisi serait “video” ou “audio”.

Pour résoudre cela, je vous conseille d’installer le plugin WordPress Post Format UI d’Alex King. Il permet d’améliorer de façon considérable la gestion des Post Formats grâce à un système d’onglets assez pratique.

WordPress Post Formats Admin UI
Gestion des Post Formats avec WordPress Post Formats Admin UI

Le plugin n’est pas disponible sur le repository de WordPress, mais vous pouvez le télécharger à partir de Github à l’adresse suivante : https://github.com/crowdfavorite/wp-post-formats

Personnaliser le style des Post Formats

La fonction post_class() contient une class CSS qui permet de cibler un article en fonction de son Post Format : http://codex.wordpress.org/Function_Reference/post_class#Default_Values

Cet article a été mis à jour il y a 4172 jours - Il n'est peut être plus à jour !

Article écrit par Jonathan B.

Jonathan est le co-fondateur de WP Media, startup connue pour être l’auteur de WP Rocket et Imagify. Il est aussi co-organisateur du WordCamp Lyon et Paris.

24 Commentaires

  1. Merci pour l’article !

    Peut-être a t-on déjà répondu des centaines de fois à cette question mais : pourquoi ne peut-on pas ajouter de custom post formats ?

    Ça pourrai être super utile par exemple pour ajouter un format “livre” ou bien un format “plugin”…

  2. @Willy : Je ne suis tout à fait d’accord avec toi. En plus, quand on regarde le code, il suffirait que les dévs de Wp ajoutent qu’un seul petit filtre pour que l’on puisse ajouter les nôtres :/

  3. Super, un bon tuto sur les CPF ! Ya meme une requete en tax-query, on en voit pas tous les jours, bravo !

    Sinon pour le filtre, il ne suffirait pas à te permettre l’ajout de ton CPF, pour preuve, modifie le core, ajoute ce filtre et fait ton bazar, tu rencontreras des difficutés.
    Les CPF sont des custom taxo dans une custom meta box. Et un CPF étant lié à un CPT, mais les CPF étant “en dur”, tu peux switcher d’un thème utilisant les CPF à un autre les utilisant, sans problème, alors que passer d’un theme utilisant son propre CPT à un autre, tu sais que tu perd tes posts. Ici non.
    Je peux te filer un lien, mais c’est full anglais by Nacin : http://nacin.com/2011/01/27/on-standardized-post-formats/ ;)
    Après ça, tu devrais avoir compris pourquoi c’est en dur et qu’un simple filtre ne fait pas ce boulot attendu.
    Ce qui est faisable c’est de sur-traduire les libellés pour les détourner, et dans le code utiliser des DEFINE pour que ça colle, si on dit que “video” devient “livre”, dans le code on fait un DEFINE( ‘livre’, ‘video’ ); comme ça on peut mettre “livre” dans les ” dans le code ;)
    Tu m’as suivi ? ^^
    See you !

  4. Trop d’anglais pour moi =D

    On avait déjà une discussion à ce propos et je n’aime pas trop le fait de feinter avec les libellés des Post Formats.

  5. Je sais bien mais ça reste une solution propre, c’est pas bidouille franchement. Jouer sur de la trad et ajouter des define euh, j’ai vu pire niveau “bidouille” ;)

  6. Non il n’est pas possible de les rendre portable sans conséquences désagréables, ceci est expliqué dans mon commentaire précédent.

  7. Je ne suis pas trop partisan de modifier et triturer le sens des format de posts, l’intérêt est de fournir un format stable et commun pour les thèmes, plugins et même systèmes tierces.

    Les post formats ne sont que des taxonomies, si on a besoin de format spécifiques… autant en créer une.

  8. Va vraiment falloir que je m’y mette à ces “post formats” ! Et surtout à customiser l’affichage Frontend… y a moyen de faire un truc sympa :)

  9. La prochaine mise à jour de wordpress 3 devrait améliorer encore le CPF et c’est tant mieux! L’idée d’Alex King a été retenu – il me semble, et je crois que ça va grandement facilité l’usage des CPF, les rendre populaires et utiles.

    Mais plus j’y réfléchi plus je me dis que les CPF seraient vraiment utiles dans les COMMENTAIRES!
    Et pas pour seulement le visiteur, je pense surtout au webmaster!
    Depuis que je connais le Thème P2, ça me travaille…
    Faudrait aussi mieux intégré OEmbed: certain provider – y compris le site lui-même => obligation d’utiliser certain CPF.
    Autoriser l’utilisation de certain CPF en fonction des roles et y intégrer le mode sticky-post (pour “accrocher en haut” ou faire du “dofollow”) et vous obtenez une sorte de mur “à la Facebook” en lieu et place des commentaires (qui franchement sont vieillissant…)
    Rêvons un peu: arrivera dans WordPress 4?

  10. “aside : article rapide (sans titre)”
    Faudrait trouver un nom français adéquat pour “aside”… je propose “commentaire”

  11. Vos tutos sont d’une rare qualité! Franchement, beau boulot ;)
    Je voudrai savoir comment je pourrais stylisé la mise en page en fonction du Post Format avec du CSS !? je dois utiliser quelle classe, id !?

  12. @Omar : Merci pour le compliment.

    Pour la question, la réponse est présente à la fin de l’article ;)

  13. Bonjour,
    Merci pour ce tuto :-)
    Je n’ai pas trouvé l’info pour en créer un nouveau post-format par une fonction, sans toucher aux fichiers php de WP .
    Comment faire ?

  14. @Hervé: WordPress ne permet pas d’en ajouter de nouveaux pour le moment. On peut le faire, mais c’est du gros bidouillage ^^

  15. Bonjour

    @Jonathan
    Ok j’espère qu’il vont prendre en compte cela, cela pourrait être sympa :-)
    Sinon je voulai détecter au moment de l’affichage d’un article le post_format pour afficher des champs acf correspondant à celui-ci ; link, video …

    J’ai l’impression que l’info n’est pas encore accessible (test en dev dans un plugin)

    Je fais
    $format = get_post_format();
    var_dump($format);

    et il me retourne bool(false)
    Y a t-il un autre moyen de trouver le format déclaré ??

  16. @rvNux: C’est que vous ne devez pas être dans la loop quand vous faîtes l’appel à la fonction get_post_format().