Mémos

M é m o - l a b .

Les requètes et la loop WP

Notions abordées : WP_Query(), get_posts(), have_posts().

La compréhension par le code :

La classe WP_Query()





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)); ?>

La fonction get_posts()





<?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]);

La requête manuelle





<?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>’.