web-dev-qa-db-ja.com

URLパラメータを使用して、カテゴリおよびカスタム分類法からの投稿を一覧表示する

たとえば、http://example.com/?cat=6&tag=booksは、カテゴリID 6に属し、「本」というタグが付けられた投稿(つまり、両方の条件を満たす投稿)を一覧表示します。

同様に、http://example.com/feed/?cat=6&tag=booksはフィードに対しても同じことを行います。

さて、私のブログには「edition」というカスタム分類法があり、その下に「usa」、「uk」、「china」などの用語があります。 URL http://example.com/?edition=usa,chinaには、エディション「usa」と「china」の両方に属する投稿がリストされています。

そしてhttp://example.com/category/cars/?edition=usaは、カテゴリ[Cars] からの、カスタム分類学用語「usa」にも属する投稿をリストします。

問題

私は私のfunctions.phpで以下のコードを使用します。

add_filter('pre_get_posts','better_editions_archive');
function better_editions_archive( $better_editions_query ) {

    /* Looks like this line needs to be changed, not sure how */
    if ( $better_editions_query->is_tax( 'edition' ) && $better_editions_query->is_main_query() ) {

        $better_editions_terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
        $better_editions_query->set( 'post_type', array( 'post' ) );
        $better_editions_query->set( 'tax_query',
            array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => $better_editions_terms,
                    'operator' => 'NOT IN'
                )
            )
        );

    }

    return $better_editions_query;
}

このコードは、投稿がどのEditionにも割り当てられていない場合(つまり、投稿がカスタム分類 'edition'に属する用語に割り当てられていない場合)、その投稿はすべての用語の下に表示/一覧表示されるカスタム分類法 'edition'のアーカイブ/フィード。

現在、http://example.com/category/cars/?edition=usaはカテゴリ「cars」に属し、具体的に 'usa'(カスタム分類法 'edition'に属する用語)とマークされている投稿のみを一覧表示します。カスタム分類法「エディション」のどの用語にも割り当てられていない投稿は表示されません。これをどのように修正しますか?

PS:投稿にデフォルトの用語を設定する は後から追加のエディションを追加する可能性があるため、オプションではありません。)


解決しましたが...

私はあなたがこの質問に対する答えとして見ることができる解決策を考え出しました。賞金はまだ立っているので、お気軽に。 :)

4
its_me

一般的な状況では、URLパラメータを使用して、次のように特定のカテゴリとカスタム分類法に属する投稿を一覧表示できます。

http://example.com/category/cars/?edition=usa

ここで、categoryはあなたがあなたのサイトのカテゴリに使っているカテゴリベースです(WordPressダッシュボード>設定>パーマリンク>カテゴリベース)。 editionはカスタム分類法の基本/スラッグです。 usaはカスタム分類法に基づく用語です。

複数のカテゴリ/カスタム分類法を含める場合は、これらが役立ちます。

http://example.com/category/cars/?edition=usa,india
http://example.com/?category_name=cars,books&edition=usa,india

とフィード:

http://example.com/category/cars/?edition=usa,india&feed=rss2
http://example.com/?category_name=cars,books&edition=usa,india&feed=rss2

参考文献:


しかし...

私の質問で説明されたように、私のものは複雑なケースです、それで私は簡単な回避策を開発しました。ここに行きます...

  1. 問題のコードブロックは、投稿がどのエディションにも割り当てられていない場合(つまり、投稿がカスタム分類 'edition'に属する用語に割り当てられていない場合)、その投稿はすべての用語アーカイブの下に表示/一覧表示されます。カスタム分類法「エディション」のフィード。

    しかし今、私はそのコードを削除しました。その後、カスタム分類法 'edition'の下に 'intl'(International)という新しい用語を作成しました。 all Editionsの下に表示したい投稿は 'intl'に割り当てられます。しかし、 'intl'に割り当てられたすべての投稿が私のカスタム分類法のすべてのタームアーカイブ/フィードに表示されるようにするにはどうすればよいですか。

    そのために、私は今このコードを使用します(functions.phpに入ります):

    add_filter('pre_get_posts','better_editions_archive');
    function better_editions_archive( $query ) {
        if ( $query->is_tax( 'edition' ) && $query->is_main_query() ) {
            $query->set( 'post_type', array( 'post' ) );
            $query->set( 'tax_query',
                array(
                    'relation' => 'OR',
                    array(
                        'taxonomy' => 'edition',
                        'field' => 'slug',
                        'terms' => 'intl',
                        'operator' => 'IN'
                    )
                )
            );
        }
        return $query;
    }
    

    だから今、例えば、http://example.com/edition/usa/は 'usa'か 'intl'(私のカスタム分類法 'edition'の下の用語です)に属する投稿をリストします。そのフィード、http://example.com/edition/usa/feed/も同じことをします。

  2. 問題の主な問題に戻ります。 URLパラメータを使用して、特定のカテゴリおよびエディションに属する投稿を一覧表示する方法を教えてください。

    たとえば、カテゴリ「cars」およびエディション「usa」に属する投稿をどのようにリスト表示できますか?

    これがURLの表示形式です。http://example.com/category/cars/?edition=usa,intl(すべてのエディションの下に表示される投稿、つまり用語「intl」に割り当てられている投稿も必要です)。フィードに関してはhttp://example.com/category/cars/feed/?edition=india,intl

それでおしまい!

@kaiser に感謝します。)


ノート

テンプレート内でメインのクエリ/ループを厳密に修正したい場合は、 taxonomy-edition.php(私の場合)、これがどのように行われるかについての例です:

<?php
$edition_term = get_term( get_queried_object(), 'edition' )->slug;
$better_editions = new WP_Query(
    array(
        'post_type' => 'post',
        'tax_query' => array(
            array(
                'taxonomy' => 'edition',
                'field' => 'slug',
                'terms' => array( $edition_term, 'intl' )
            )
        )
    )
);
?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php if ( $better_editions->have_posts() ) : ?>

    <?php /* Start the Loop */ ?>
    <?php while ( $better_editions->have_posts() ) : $better_editions->the_post(); ?>
        <?php get_template_part( 'content', get_post_format() ); ?>
    <?php endwhile; wp_reset_postdata(); ?>

<?php else : ?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php endif; ?>

それにもかかわらず、あなたが本当に、本当にしなければならないのでなければ、pre_get_postsを使ってください。

3
its_me