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.
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>';
}
?>
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>';
}