web-dev-qa-db-ja.com

1つの投稿ページに1つの用語で次および前の3件の投稿を取得する

私は以下を持っています

  • カスタム投稿の種類:episode

  • カスタム分類法:series

    • サブタームreal deal - > season 1season 2season 3など.

用語は階層的であり、全体がTVシリーズのように構成されることを意図しています(各「シリーズ」には「季節」があります)。

single-episode.phpページに、現在のエピソードを表示したいのですが、AS WELL ASはそのシーズンの次の3エピソードと前の3エピソードへのリンクです。

例として、「シーズン1 - エピソード5」のページであれば、シーズン1のコンテンツを取得する必要があります。

エピソード4,3,2 +シーズン1エピソード6,7,8。

単一のエピソードページのループ内でこれを実行する方法を理解するのに問題があります。

これは私が現在持っているものですが、それはうまくいきません - それはただ単に現在のページのエピソードのタイトルを何度も繰り返します。

非オブジェクトのプロパティを取得しようとしています

エラー。

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

これが私の更新された質問です、まだ進行中の作業です。現時点で何も得られていないようです。合計6件の結果を取得したい、3件を現在の投稿の前に投稿し、3件を現在の投稿の後に投稿する。 post_datebeforeプロパティとafterプロパティの両方にdate_queryを使用しようとしていますが、正しいかどうかはわかりません。

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

編集2:

私は非常に非効率的な方法を使用して私の望ましい効果が働いている - それはうまくいくが、私はそれを最適化するためのいくつかのヒントを聞くのが大好きだ!今のところクエリに関しては非常に高価に思えます。

$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

2番目のアプローチ(EDIT 2)は残念ながら非常にバグが多く非効率的です。また、これを1回のクエリで行うことはありません。

私がすでに述べたように、あなたは この答えでアプローチを見る必要があります 私は最近しました。あなたは最初の編集でほとんどそこにいました、ただ一つの問題はあなたがこれを1回の質問ですることができない、あなたが前の投稿のセットを得るために2つを行わなければならないでしょう。

必要な情報だけを取得するようにコードを最適化しました。 WP_Queryの結果もキャッシュされるので、あなたは本当に効率についてそれほど心配する必要はありません。

私はこの答えですべての詳細をもう一度やり直すつもりはありません、あなたは詳細にリンクされたポストを通って行くべきですが、あなたはこのようなことを試みることができます

$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

構文が少しずれています - $episodesは、配列ではなくWP_Queryのインスタンスです。すべてのテンプレートタグを使用するための本格的なループが必要な場合は、次のようにします。

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

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

wp_reset_postdata(); // Restore current episode

それ以外の場合は、foreachプロパティに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