私は以下を持っています
カスタム投稿の種類:episode
カスタム分類法:series
real deal
- > season 1
、season 2
、season 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_date
のbefore
プロパティと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;
}
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 );
構文が少しずれています - $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
}