M é m o - l a b .
La loop WP est une boucle permettant d’afficher, suivant les réglages abordés dans le chapitre Template hierarchy, le contenu d’une page ou les articles.
Notions abordées : WP_Query(), get_posts(), have_posts().
La compréhension par le code :
La loop WP
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
...
<?php endwhile; endif; ?>
La loop WP personnalisée
<?php
$q = new WP_Query([
// <nom_du_cpt> est égal à 'post' pour les articles
'post-type' => '<nom_du_cpt>'
]);
?>
<?php if ($q->have_posts()) : while ($q->have_posts()) : $q->the_post(); ?>
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
...
<?php endwhile; endif; ?>
Récupérer un contenu par le slug
<?php
// Requête
$q = new WP_Query([
'post_type' => '<nom du cpt>',
'name' => '<slug du contenu>'
]);
// Récupération de l'objet
$post = $q->post;
?>
// Affichage du titre
<?php echo $post->post_title; ?>
// Affichage du contenu
<?php echo $post->post_content; ?>
Récupérer plusieurs contenus par les slugs
<?php
// Requête
$q = new WP_Query([
'post_type' => '<nom du cpt>',
'post_name__in' => '<slug-a, slug-b, slug-c ...>'
]);
// Récupértion d'un tableau d'objets
$posts = $q->posts;
?>
Récupérer une image
<?php
// Requête
$q = new WP_Query([
'post_type' => 'attachment',
'post_mime_type' =>'image',
'name' => '<slug de l'image>'
]);
// Récupération de l'objet
$img = $q->post;
?>
// Affichage de l'image
<?php echo wp_get_attachment_image($img->ID, 'full', false, []); ?>
OU
// pour les fichiers svg
<?php echo file_get_contents(wp_get_attachment_url($img->ID)); ?>
<?php
// $posts retourne un tableau d'objets
$posts = get_posts([
// <nom_du_cpt> est égal à post pour les articles
'post_type' => '<nom_du_cpt>',
// -1 correspond à tous les posts
'posts_per_page' => -1
]);
?>
<?php foreach ($posts as $post) { ?>
<h2><?php echo $post->post_title; ?></h2>
<p><?php echo $post->post_content; ?></p>
<?php }; ?>
get_post()
<!-- Récupération d'un objet par son id -->
<?php $post = get_post(<id>); ?>
Rqe :
$q = new WP_Query
([‘post_type’ => ‘post’]); $posts = $q->posts;
est équivalent à
$posts = get_posts
([‘posts_per_page’ => -1]);
<?php
global $wpdb;
// $wpdb->prefix retourne le préfixe des tables
// Requête préparée retournant les contenus
// de type post (post_type = 'post')*
// publiés (post_status = 'publish')
// du plus récent au plus ancien (ORDER BY id DESC)
// $posts est un tableau d'objets
$q = "SELECT * FROM {$wpdb->prefix}posts WHERE post_type=%s AND post_status=%s ORDER BY id DESC";
$posts = $wpdb->get_results($wpdb->prepare($q, 'post', 'publish'));
?>
<?php foreach ($posts as $post) { ?>
<h2><?php echo $post->post_title; ?> (id=<?php echo $post->ID;?>)</h2>
<p><?php echo $post->post_content; ?></p>
<?php }; ?>
Rqe : La même requête peut être utilisée pour récupérer des cpt en remplacant ‘post’ par ‘<nom du cpt>’.