it-swarm.com.de

Erhalten Sie die nächsten und vorherigen 3 Beiträge in einem Begriff auf einer einzelnen Beitragsseite

Ich habe folgendes

  • Benutzerdefinierter Beitragstyp: episode

  • Benutzerdefinierte Taxonomie: series

    • unterbegriffe real deal -> season 1, season 2, season 3 usw.

Die Begriffe sind hierarchisch und das Ganze soll wie eine Fernsehserie aufgebaut sein (jede "Serie" hat "Jahreszeiten").

Auf der Seite single-episode.php möchte ich die aktuelle Episode sowie Links zu den nächsten drei Folgen und den vorherigen drei Folgen in dieser Staffel anzeigen.

Wenn ich beispielsweise auf der Seite "Staffel 1 - Episode 5" Inhalte für Staffel 1 abrufen möchte,

Folgen 4,3,2 + Staffel 1 Folgen 6,7,8.

Ich habe Probleme herauszufinden, wie dies innerhalb der Schleife auf einer einzelnen Episodenseite getan werden kann.

Hier ist, was ich derzeit habe, aber es funktioniert nicht - es wiederholt nur den aktuellen Titel der Seitenepisode immer und immer wieder mit einem

versucht, das Eigentum eines Nicht-Objekts zu erlangen

error.

<?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:

Hier ist meine aktualisierte Abfrage, die noch in Bearbeitung ist. Es scheint im Moment nichts zu bekommen. Ich möchte insgesamt 6 Ergebnisse erhalten, davon 3 VOR dem aktuellen Beitrag und 3 NACH dem aktuellen Beitrag. Ich versuche, den post_date für die Eigenschaften before und after von date_query zu verwenden, bin mir aber nicht sicher, ob ich es richtig mache.

$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:

Ich habe meinen gewünschten Effekt mit einer sehr ineffizienten Methode erzielt - es funktioniert, aber ich würde LIEBEN, einige Tipps zu hören, um ihn zu optimieren! scheint im Moment sehr teuer in Bezug auf Fragen.

$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

Ihr zweiter Ansatz ( EDIT 2) ist leider ziemlich fehlerhaft und ineffizient. Außerdem werden Sie dies nicht in einer Abfrage tun.

Wie ich bereits sagte, müssen Sie sich die Vorgehensweise in dieser Antwort ansehen , die ich kürzlich durchgeführt habe. Sie waren bei Ihrer ersten Bearbeitung fast da. Das einzige Problem ist, dass Sie dies nicht in einer Abfrage durchführen können. Sie müssen zwei Schritte ausführen, einen, um die vorherige Gruppe von Beiträgen abzurufen, den anderen, um die nächste Gruppe von Beiträgen abzurufen.

Ich habe den Code optimiert, um nur die notwendigen Informationen zu erhalten und nichts mehr. Die Ergebnisse von WP_Query werden ebenfalls zwischengespeichert, sodass Sie sich nicht so viele Gedanken über die Effizienz machen müssen.

Ich werde in dieser Antwort nicht noch einmal alle Details durchgehen, Sie sollten den verknüpften Beitrag im Detail durchgehen, aber Sie können so etwas versuchen CAVEAT: ungetestet. Bitte beachten Sie die Hinweise in der verknüpften Antwort )

$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

Ihre Syntax ist leicht abweichend - $episodes ist eine Instanz von WP_Query, kein Array. Wenn Sie eine vollständige Schleife für die Verwendung aller Vorlagen-Tags wünschen, verwenden Sie:

while ( $episodes->have_posts() ) {
    $episodes->the_post();

    the_title(); // Episode title
    the_content(); // Episode content
}

wp_reset_postdata(); // Restore current episode

Andernfalls können Sie nur foreach für die Eigenschaft posts angeben:

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