web-dev-qa-db-ja.com

ページに基づくカスタム投稿タイプ分類タイプのクエリ

booksというカスタム投稿タイプがあります。このカスタム投稿タイプにはbook_categoryという分類法があります。現時点で、そして近い将来には、各本をフィルタリングできる5つのカテゴリがあります。

さて、これらの各カテゴリには、それぞれのカテゴリに基づいて書籍を検索する独自のそれぞれのページがあります(各カテゴリに関連するその他の補助情報の中で)。

以下の私のコードでは、私はis_page()に基づいて投稿を問い合わせることを試みました。これはうまくいきますが、もっと効率的で適切な対処方法があることがわかります。

<?php
if (is_page('horror')) {
  $theTermBasedOnPage = 'horror';
} elseif (is_page('comedy')) {
  $theTermBasedOnPage = 'comedy';
} elseif (is_page('romantic')) {
  $theTermBasedOnPage = 'romantic';
} elseif (is_page('nonfiction')) {
  $theTermBasedOnPage = 'nonfiction';
} elseif (is_page('drama')) {
  $theTermBasedOnPage = 'drama';
}

$args = array(
  'posts_per_page' => -1,
  'post_type' => 'books',
  'post_status' => 'publish',
  'tax_query' => array(
      array(
          'taxonomy' => 'book_category',

          'terms' => $theTermBasedOnPage,
      ),
  ),
  );
?>

ページに基づいて投稿をクエリする(カスタム投稿タイプ>分類法)最も良い方法は何ですか?

4
Joe

これをより効率的にするために、現在のページのスラッグを議論する代わりに、現在のスラッグをtax_queryの用語値として配置するだけです。何かのようなもの:

global $post;
$args = array(
  'posts_per_page' => -1,
  'post_type' => 'books',
  'post_status' => 'publish',
  'tax_query' => array(
      array(
          'taxonomy' => 'book_category',
          'field'    => 'slug',
          'terms'    => $post->post_name, // which'd be `horror` or `comedy`, etc
      ),
  ),
);

ヒューマンエラーがこのようなことをする可能性が高いことに注意してください。例えば、nonfictionのページを持つがnon-fictionのbook_category用語を持つと、ロジックを壊し問題を引き起こすかもしれません。

あなたが取り組んでいるもののコンテキストはわかりませんが、目標が単に "これらの各カテゴリにはそれぞれのページがある" の場合、このcustom-query-withを作成する必要はありません。各用語の-manual-page-relation。 WordPressの分類法と用語は、 登録 /分類法をpublicpublicly_queryableとして持っていれば、それぞれ独自のURLを持ちます。あなたはおそらくyour-site.com/book_category/horror/を訪れてホラーブックのリストを見ることができます。その後、すべての用語に対してテンプレートファイルをカスタマイズすることも、 WordPressテンプレート階層 を参照として使用して個別にカスタマイズすることもできます。

3
David Sword

カスタム分類ページ:

カスタム分類ページを取得するために$argsを使用してカスタムクエリを作成する必要はありません。 WordPressが提供しているURL構造に従うことができます。

たとえば、次のようにしましょう。

  1. 次のパーマリンク構造を選択しました: enter image description here 

  2. それからカスタム投稿タイプBookを作成しました

  3. カスタム分類法Book Categoryを作成し、Bookとリンクしました。

  4. 次に、Bookの下にMy Horror Storyという名前の新しいHorrorBook Categoryとして作成しました。

  5. そして、Bookの下にMy Comedy Storyという名前の新しいComedyBook Categoryとして作成しました。

他のすべてのデフォルト設定では、WordPressは自動的に次のURLを生成します。

// Book Links
https://example.com/book/my-comedy-story/
https://example.com/book/my-horror-story/

// Book Category Links
https://example.com/book-category/comedy/
https://example.com/book-category/horror/

ご希望のカスタム分類ページにこれらのURLを使用してください。

テンプレート

また、テーマテンプレートファイルを編集して目的のデザインを作成することもできます。 WordPressテンプレート階層 を確認してください。

たとえば、taxonomy-book-category.phpカスタム分類ページを設計するためにBook Categoryという名前のテンプレートファイルを作成できます。

そのテンプレートファイルでは、WordPress テンプレートタグ および The Loop を使用して必要なクエリを実行します。

たとえば、非常に単純なテンプレートファイルは次のようになります。

<?php
    if ( have_posts() ) : while ( have_posts() ) : the_post();
        the_content();
    endwhile;
    else :
        _e( 'Sorry, no book matched your criteria.', 'textdomain' );
    endif;
?>
2
Scott

これを試して:

<?php
// Get post's all terms.
$terms = wp_get_post_terms( get_the_ID(), 'book_category' );

// Get first term ID
$currentPostTermID = $terms[ 0 ]->term_id;

$args = array(
    'posts_per_page' => -1,
    'post_type'      => 'books',
    'post_status'    => 'publish',
    'tax_query'      => array(
        array(
            'taxonomy' => 'book_category',

            'terms' => $currentPostTermID,
        ),
    ),
);
?>
0
bilimokur