web-dev-qa-db-fra.com

Afficher les balises avec des vignettes aléatoires à partir de la sélection des publications avec cette balise

Ce que je veux réaliser comprend deux parties:

D'abord un ensemble de conteneurs qui affichent chaque balise (avec nom, description et lien). Ceci est facilement réalisé avec une boucle get_tags et foreach.

<?php
$tags = get_tags( $args );

foreach ( $tags as $tag ) {
    // get tag link
    $tag_link = get_tag_link( $tag->term_id );
    // display content
    echo '<div id="tag-block">'
       . $tag->name
       . $tag->description
       . '<a href="'.$tag_link.'">see tag archive</a>'
       . '</div>';
} 
?>

Maintenant la partie difficile:

Je souhaite afficher (interroger) une image dans chaque conteneur de balises pour illustrer la balise, avec les conditions suivantes (arguments):

pour chaque balise:

  • une sélection d'images (post_thumbnail) est extraite de tous les articles de la balise actuelle.

  • order => 'Rand', chaque rafraîchissement affichera une image différente.

  • un seul est affiché (posts_per_page = 1)

Le seul moyen auquel je puisse penser est de saisir toutes les balises, de les mettre dans une boucle foreach, et dans chaque instance, d'exécuter wp_query distinct avec ces arguments.

Cependant, avec 7 à 8 balises, ce code exécutera trop de requêtes sur une page. Autant que je sache, (et testé), cette performance est terriblement inefficace.

TLDR: Le code suivant fonctionne, mais l'exécution de toutes ces requêtes distinctes est une mauvaise performance. Je pourrais utiliser un coup de main ici.

<?php
$tags = get_tags( $args );

foreach ( $tags as $tag ) {
    // get tag link
    $tag_link = get_tag_link( $tag->term_id );

    // get random image for this tag
    $args = array(
    'post_type' => 'custom_event',
    'order' => 'Rand',
    'tag__in' => array ($tag->term_id),
    'posts_per_page' => 1,
    );

    $query = new WP_query ( $args );

    // hmmm this is probably bad
    while ( $query->have_posts() ) { $query->the_post();

      the_post_thumbnail( $post->id );

    } wp_reset_postdata();

    // display rest of content
    echo '<div id="tag-block">'
       . $tag->name
       . $tag->description
       . '<a href="'.$tag_link.'">see tag archive</a>'
       . '</div>';
} 
?>
1
human1fy

Je songe à tirer parti des wp_cron et transients.

Vous pouvez créer une fonction d'assistance chargée du gros travail et de toutes les requêtes dont vous avez besoin, mais planifiez-la comme toutes les 12 heures - deux fois par jour (ou plus, en fonction de la fréquence des nouvelles publications) à l'aide de l'API wp_cron.

En gros, voici ce dont vous avez besoin:

Fonction d'assistance et WP tâche cron

/**
 * Helper function to update tag transients with post IDs
 */
function wpse317707_update_tag_transients() {
    $tags = get_tags(); // add args

    /** @var WP_Term $tag */
    foreach ( $tags as $tag ) {

        // get random image for this tag
        $args = array(
            'post_type' => 'custom_event',
            'tag__in' => array ( $tag->term_id ),
            'posts_per_page' => -1,
        );

        $query = new WP_query ( $args );
        $post_ids = wp_list_pluck( $query->posts, 'ID' );

        set_transient( $tag->slug . '-tag-posts', $post_ids, DAY_IN_SECONDS );
    }
}

add_action( 'update_tag_transients', 'wpse317707_update_tag_transients' );

/**
 * Schedule WP Cron job
 */
if ( ! wp_next_scheduled( 'update_tag_transients' ) ) {
    wp_schedule_event( time(), 'twicedaily', 'update_tag_transients' );
}

Votre code, ajusté

$tags = get_tags( $args );

foreach ( $tags as $tag ) {
    // get tag link
    $tag_link = get_tag_link( $tag->term_id );

    // get post IDs
    $post_ids = get_transient( $tag->slug . '-tag-posts' );

    // get random ID
    $random_id = $post_ids[ array_Rand( $post_ids, 1 ) ];

    the_post_thumbnail( $random_id );

    // display content
    echo '<div id="tag-block">'
         . $tag->name
         . $tag->description
         . '<a href="'.$tag_link.'">see tag archive</a>'
         . '</div>';
}
0
dboris