web-dev-qa-db-fra.com

Obtenir les 3 articles suivants et précédents d'un terme sur une seule page

J'ai le suivant

  • Type de message personnalisé: episode

  • Taxonomie personnalisée: series

    • sous-termes 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;
}
1
Prefix

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 );
1
Pieter Goosen

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
}
0
TheDeadMedic