web-dev-qa-db-ja.com

カテゴリとタグの両方でアーカイブをフィルタする方法は?

各カテゴリ/タグのアーカイブがあります。今度は、次のURL構造を使用してカスタムアーカイブを作成します。

http://example.com/cat1/subcat1/tag/tag1

これは、タグtag1を持ち、cat1subcat1に属するすべての投稿を表示します。

このアーカイブを作成する方法

1
Diaa

あなたが探しているものは書き換え規則によって作成することができるカスタム検索です。 URLにクエリを追加するルールを作成します。

まず、WordPressがカスタムURLを認識するように書き換えタグを定義しましょう。

function my_rewrite_tag() {
  add_rewrite_tag('%custom-categories%', '([^&]+)');
}
add_action('init', 'my_rewrite_tag', 10, 0);

ここで、データを別のパスにリダイレクトするための規則を作成します。

function my_rewrite_rule() {
  add_rewrite_rule(
      '^custom-categories/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?',
      'index.php?post_type=post&customCat=$matches[1]&customSubCat=$matches[2]&customTag1=$matches[3]&customTag2=$matches[4]',
      'top'
  );
}
add_action('init', 'my_rewrite_rule', 10, 0);

それでは、アクセスしようとすると:

http://example.com/custom-categories/cat1/subcat1/tag/tag1

私たちは実際にリダイレクトされます。

http://example.com/index.php?post_type=post&customCat=cat1&customSubCat=subcat1&customTag1=tag&customTag2=tag1

これは通常の投稿タイプのアーカイブです。今がトリックです。これらのデータが設定されている場合は、クエリを変更します。

// We only want to do this if every data is set, so let's check for them all
if(isset($_['customCat']) && isset($_['customSubCat']) && isset($_['customTag1']) && isset($_['customTag2'])) {
    // Now alter the main query
    function photogram_include_blog_posts($query) {
        if ( !is_admin() && $query->is_main_query() && $query->is_archive() ) {
            // Set the tags
            $query->set('tag__in', array($_['customTag1'],$_['customTag2']));
            // Set the categories
            $query->set('category__in', array($_['customSubCat'],$_['customCat']));
        }
    }
    add_action( 'pre_get_posts', 'photogram_include_blog_posts' );
}

そのため、カスタムクエリを実行するアーカイブページにリダイレクトされます。完了しました。

0
Jack Johansson