web-dev-qa-db-ja.com

親カテゴリのすべて、子カテゴリのグループを選択しますか?

"シリーズ"のカスタム投稿タイプをフォーマットしようとしています。各投稿はエピソードで、各エピソードはシーズンに属し、各シーズンはシリーズに属します(ちょうどテレビ番組のように)。

私は以下を持っています:

  • カスタム投稿の種類: "エピソード"
  • カスタム分類法: "シリーズ"
    • インサイドシリーズ、「リアルディール」の親カテゴリ
      • "Real Deal"カテゴリ、いくつかのサブカテゴリ(IE "Season 1"、 "Season 2" ..)

シリーズ別(IE、上記の「リアルディール」)とシーズン別(IE、リアルディールの「シーズン1」)の両方で自分の「エピソード」を選択できるようにする必要があります。

画像は1000語を話すので、ここに私が意味するものの簡単なモックアップがあります:

enter image description here

何を試したか

ここに私が現在持っているコードがあります、しかし私は私が上で説明したことをするために正しい軌道に乗っているとは思いません。これでシーズン1のすべてのエピソードが表示されますが、各シーズンのすべてのエピソードを取得してから、各シーズンを独自のHTMLコンテナにグループ化する必要があります。

<?php
  $args = [
      'post-type'   => 'episode',
      'post-status' => 'publish',
      'tax_query'   => [
          [
              'taxonomy' => 'series',
              'field'    => 'slug',
              'terms'    => 'season-1'
          ]
      ]
  ];
  $episodes = new WP_Query($args);
  if ( $episodes->have_posts() ) {
    while( $episodes->have_posts() ) {
        $episodes->the_post();
        get_template_part('content','episodes');
    }
  } else {
    get_template_part('content', 'none');
  }
?>

質問

クエリをA)に構成するにはどうすればよいですか。シリーズ別にグループ化されたすべてのエピソードを選択してから、季節別に表示します。

_編集_

Michael Ecklundによって提供された3番目のコードスニペットを使用しましたが、それは私が探していたものを正確に達成することに成功しました。ご協力ありがとうございました!

5
Prefix

これはまっすぐな簡単な解決策です。ただし、WordPressの最新バージョンを入手する必要があります。 (または少なくとも4.1)

入れ子にされた分類法クエリを使用する。

自分の持っているものを取って、それに少し追加するだけです。

$args = array(
    'post-type'      => 'episode',
    'post-status'    => 'publish',
    'posts_per_page' => 4,
    'tax_query'      => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'series',
            'field'    => 'slug',
            'terms'    => array( 'real-deal' ),// Name of the series (in slug format)
        ),
        array(
            'taxonomy' => 'series',
            'field'    => 'slug',
            'terms'    => array( 'season-1' ),// Name of the season (in slug format)
        )
    )
);

$episodes = new WP_Query( $args );

print_r( $episodes->posts );

それはちょうど特定のシリーズに属し、そしてまた特定のシーズンを含む4つの最も最近発表されたエピソードを見つけることを言っています。 (これがあなたのビジュアルモックアップが描写しているように見えるものです)

あなたは「季節」が動的である必要があると述べました。

これが、親カテゴリ(シリーズ)からすべての "サブカテゴリ"(シーズン)を取得し、そのシリーズから4つの最新のエピソードをすべての可能なシーズンで取得する方法です。

$taxonomy = 'series';

$seasons = get_terms( $taxonomy, array(
    'parent' => 1, // TERM ID OF THE SERIES
    'fields' => 'id=>slug'
) );

if ( ! empty( $seasons ) && ! is_wp_error( $seasons ) ) {

    $args = array(
        'post-type'      => 'episode',
        'post-status'    => 'publish',
        'posts_per_page' => 4,
        'tax_query'      => array(
            'relation' => 'AND',
            array(
                'taxonomy' => $taxonomy,
                'field'    => 'slug',
                'terms'    => array( 'industry-news' ),// Name of the "series" (in slug format)
            ),
            array(
                'taxonomy' => $taxonomy,
                'field'    => 'slug',
                'terms'    => array_values( $seasons ),// Name of the "seasons" (in slug format) DYNAMIC
            )
        )
    );

    $episodes = new WP_Query( $args );

    print_r( $episodes->posts );

}

シリーズに3シーズンがあるとしましょう...そして、このシリーズの各シーズンからの最新の4つのエピソードを表示したいとします。

$taxonomy = 'series';

$seasons = get_terms( $taxonomy, array(
    'parent' => 1, // TERM ID OF THE SERIES
    'fields' => 'id=>slug'
) );

$season_episodes = array();

if ( ! empty( $seasons ) && ! is_wp_error( $seasons ) ) {

    foreach ( array_values( $seasons ) as $season ) {

        $season_episodes[ $season ] = array();// Placeholder in-case there's no episodes found.

        $args = array(
            'post-type'      => 'episode',
            'post-status'    => 'publish',
            'posts_per_page' => 4,
            'tax_query'      => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => array( 'industry-news' ),// Name of the "series" (in slug format)
                ),
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => array( $season ),// Name of the "seasons" (in slug format) DYNAMIC
                )
            )
        );

        $episodes = new WP_Query( $args );

        if ( ! empty( $episodes->posts ) ) {
            $season_episodes[ $season ] = $episodes->posts;// Add all episodes found in this season.
        }

    }

}

if ( ! empty( $season_episodes ) ) {
    print_r( $season_episodes );
}

この最後の方法では、シリーズの最新の4エピソードを取り上げて、それら4つの投稿を季節ごとに分類された別々の配列に配置します。

それで、すべてが言ってそして終わった、あなたは4つの最近のエピソードを含むシリーズの各季節のための配列を持つでしょう。あなたがしなければならないのは情報を出力することだけです。

4
Michael Ecklund