J'ai le suivant
Type de message personnalisé: episode
Taxonomie personnalisée: series
real deal
-> season 1
, season 2
, season 3
, etc.Les termes sont hiérarchiques et le tout est censé être structuré comme une série télévisée (chaque "série" a des "saisons").
Sur la page single-episode.php
, je souhaite afficher l'épisode en cours, ainsi que des liens vers les 3 prochains épisodes et les 3 précédents épisodes de cette saison.
Par exemple, si sur la page "Saison 1 - Épisode 5", je dois obtenir du contenu pour la saison 1,
Épisodes 4,3,2 + Saison 1 Épisodes 6,7,8.
J'ai du mal à comprendre comment faire cela dans la boucle sur une seule page d'épisode.
Voici ce que j'ai actuellement, mais cela ne fonctionne pas - il répète le titre de l'épisode de la page en cours encore et encore avec un
en essayant d'obtenir la propriété de non-objet
erreur.
<?php
$args = array(
'post-type' => 'episode',
'post-status' => 'publish',
'posts_per_page' => 6,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'series',
'field' => 'slug',
/* Name of the "series" (in slug format) */
'terms' => array( 'season-1' ),
),
array(
'taxonomy' => 'series',
'field' => 'slug',
/* Name of the "seasons" (in slug format) DYNAMIC */
'terms' => array( $term->slug ),
)
)
);
$episodes = new WP_Query( $args );
foreach( $episodes as $episode ) {
echo get_the_title($episode->id);
}
?>
EDIT:
Voici ma requête mise à jour, toujours un travail en cours. Il ne semble rien avoir pour le moment. Je veux obtenir un total de 6 résultats, 3 postés AVANT au post en cours, 3 postés APRÈS le post en cours. J'essaie d'utiliser le post_date
pour les propriétés before
et after
de date_query
, mais je ne suis pas sûr si je le fais correctement.
$args = [
'tax_query' => [
'relation' => 'AND', [
'taxonomy' => 'series',
'field' => 'slug',
/* Name of the "series" (in slug format) */
'terms' => ['season-1'],
]
],
'posts_per_page' => 6,
/* make query more efficient */
'no_found_rows' => true,
/* dont let filters/pre_get_posts modify query */
'suppress_filters' => true,
'date_query' => [
[
'before' => $post_object->post_date,
'after' => $post_object->post_date,
],
'inclusive' => false
]
];
$q = new WP_Query( $args );
return $q->posts;
EDIT 2:
J'ai obtenu l'effet souhaité en utilisant une méthode très inefficace - cela fonctionne, mais j'aimerais entendre quelques astuces pour l'optimiser! semble très coûteux en termes de requêtes en ce moment.
$orig_post = $post;
$orig_terms = wp_get_post_terms($orig_post->ID, 'series');
$current_post = $post;
$adjPost = [
'prev' => [],
'next' => []
];
for($i = 1; $i <= 3; $i++){
$post = get_previous_post(true, '', 'series'); // this uses $post->ID
if ( $post ) {
$these_terms = wp_get_post_terms($post->ID, 'series');
if ( $these_terms[1]->slug === $orig_terms[1]->slug) {
array_Push( $adjPost['prev'], $post );
}
}
}
$post = $current_post;
for($i = 1; $i <= 3; $i++){
$post = get_next_post(true, '', 'series'); // this uses $post->ID
if ( $post ) {
$these_terms = wp_get_post_terms($post->ID, 'series');
if ( $these_terms[1]->slug === $orig_terms[1]->slug) {
array_Push( $adjPost['next'], $post );
}
}
}
$post = $current_post;
echo "<h1>Prev:</h1>";
foreach ( $adjPost['prev'] as $prev ) {
echo '<br>';
echo $prev->post_title;
}
echo "<h1>Next:</h1>";
foreach ( $adjPost['next'] as $next ) {
echo '<br>';
echo $next->post_title;
}
Votre seconde approche ( EDIT 2) est assez buggée et inefficace, malheureusement. En outre, vous n'allez pas faire cela en une seule requête.
Comme je l'ai déjà dit, vous devez regarder l'approche dans cette réponse que j'ai récemment faite. Vous y étiez presque lors de votre première édition, le seul problème est que vous ne pouvez pas le faire dans une requête, vous devrez en faire deux, un pour obtenir l'ensemble précédent de messages, l'autre pour obtenir le prochain ensemble.
J'ai optimisé le code pour ne recevoir que les informations nécessaires et rien de plus. Les résultats WP_Query
sont également mis en cache, vous n'avez donc pas à vous soucier de l'efficacité.
Je ne vais pas relire tous les détails dans cette réponse, vous devriez passer en revue le message lié en détail, mais vous pouvez essayer quelque chose comme ceci ( CAVEAT: Non testé. Veuillez voir les notes dans la réponse liée. )
$post_object = get_queried_object();
$terms = wp_get_post_terms( $post_object->ID, 'series', array( 'fields' => 'ids' ) ); // Set fields to get only term ID's to make this more effient
$args = [
'post_type' => $post_object->post_type,
'tax_query' => [
[
'taxonomy' => 'series',
'terms' => $terms,
]
],
'posts_per_page' => 3,
'order' => 'ASC' // CHANDE TO DESC IF NOT CORRECT
/* make query more efficient */
'no_found_rows' => true,
/* dont let filters modify query */
'suppress_filters' => true,
'date_query' => [
[
'before' => $post_object->post_date,
'inclusive' => false
],
]
];
$q1 = new WP_Query( $args );
var_dump( $q1->posts );
$args1 = [
'post_type' => $post_object->post_type,
'tax_query' => [
[
'taxonomy' => 'series',
'terms' => $terms,
]
],
'posts_per_page' => 3,
'order' => 'DESC' // CHANDE TO ASC IF NOT CORRECT
/* make query more efficient */
'no_found_rows' => true,
/* dont let filters modify query */
'suppress_filters' => true,
'date_query' => [
[
'after' => $post_object->post_date,
'inclusive' => false
],
]
];
$q2 = new WP_Query( $args1 );
var_dump( $q2->posts );
Votre syntaxe est légèrement différente - $episodes
est une instance de WP_Query
, pas un tableau. Si vous voulez une boucle complète pour utiliser toutes les balises de modèle, utilisez:
while ( $episodes->have_posts() ) {
$episodes->the_post();
the_title(); // Episode title
the_content(); // Episode content
}
wp_reset_postdata(); // Restore current episode
Sinon, vous pouvez simplement foreach
sur la propriété posts
:
foreach ( $episodes->posts as $episode ) {
echo get_the_title( $episode ); // Most template tags accept a post object
echo get_the_post_thumbnail( $episode->ID ); // Only accepts post ID
echo get_the_content(); // Does not accept a post argument, you'd need the loop above to set up the global post object
}