web-dev-qa-db-ja.com

入れ子になった分類法とテンプレートファイルを含むカスタム投稿タイプ

私はportfolioの書き換えスラグを持つ "Portfolio"のカスタム投稿タイプを持っています。フロントエンドのURLはdomain.com/portfolioです。

私はportfolio/categoryの書き換えスラグを持つ "カテゴリ"のカスタム分類法を持っています。フロントエンドのURLはdomain.com/portfolio/category/<term-slug>/です。

私がdomain.com/portfolio/にアクセスしたとき、Post Typeテンプレートはうまく表示されます。

domain.com/portfolio/category/<term-slug>/にアクセスすると、分類法の用語テンプレートが正しく表示されます。

ただし、domain.com/portfolio/category/にアクセスすると、分類法テンプレートは機能しません。 404エラーが発生します。

私はコアのPost Type:postとコアの分類法:categoryでもテストしました。投稿ページは/blog/に設定されています。

同じこと...

  • domain.com/blog/home.phpテンプレートから提供される投稿を見事に表示します。
  • domain.com/blog/category/<term-slug>/category.phpテンプレートから提供される、ちゃんと表示されます。
  • domain.com/blog/category/ 404エラーを表示します。

私が過去に使ってきた別の方法は、これら404個のエラーに対して "ページ"を作成することです。たとえば、/blog/は既に "ページ"として作成されています。それから/blog/category/を別のページとして作成するので、ユーザーがdomain.com/blog/category/に移動したときに404エラーが発生しません。

これは予想される動作ですか?それらの「分類アーカイブ」のためにページを作成する必要がないための回避策はありますか?

入れ子になった分類法のURLを使用して、taxonomy.phpテンプレート、さらにはarchive.phpテンプレートを使用する方法を教えてください。

1
Michael Ecklund

投稿タイプURLに分類条件を追加する

私はオンラインでランダムな雑多な情報源から一時的な解決策を思いついたと思います。

誰かが私の答えをもっと「弾丸の証拠」になるように拡張するのが大好きです。しかし、短期的には、この解決策は機能します。


現在の書き換え規則を理解してください。

add_action('rewrite_rules_array', 'mbe_rewrite_rules_array', 100);

既存の書き換え規則に新しい書き換え規則を追加します。

function mbe_rewrite_rules_array($rules){
    $new_rules = mbe_get_new_rewrite_rules();
    return ($new_rules + $rules);
}

いくつかの新しい書き換え規則を追加します...(この分野は私が確実に改善する必要があると思うところです - 私は書き換え規則に精通していません。)

function mbe_get_new_rewrite_rules(){

    $post_type = 'mbe-portfolio';
    $post_type_slug = 'portfolio';

    $taxonomy = 'mbe-portfolio-categories';
    $taxonomy_slug = 'category';

    $slug = $post_type_slug.'/'.$taxonomy_slug;

    return array(
        "{$slug}/?$" => "index.php?post_type={$post_type}&taxonomy={$taxonomy}"
    );

}

新しい書き換え規則を追加することで、WordPressはdomain.com/portfolio/category/を404としてではなく、ポストタイプアーカイブとして認識しなくなりました。

taxonomy.phpを表示しているときにdomain.com/portfolio/category/を表示するためにテンプレートシステムに接続します

add_filter('archive_template', 'mbe_taxonomy_template');

function mbe_taxonomy_template($template){

    $templates = array();

    $post_type = 'mbe-portfolio';
    $taxonomy = 'mbe-portfolio-categories';

    if(get_query_var('post_type') == $post_type && !get_query_var('taxonomy')){
        return $template;
    }

    if(get_query_var('post_type') == $post_type && get_query_var('taxonomy') == $taxonomy){
        $templates[] = 'taxonomy.php';
    }

    $templates[] = $template;

    return locate_template($templates);

}

domain.com/portfolio/category/に移動すると、現在アクティブなWordPressテーマディレクトリからtaxonomy.phpをロードします。

だから私は少し考え始めました。 taxonomy.phpがロードされている間は、分類法に関する情報または分類法の用語に関する情報を表示するかどうかを確認するのではなく混乱を避けるため、term.phpという新しいテンプレートファイルを作成することにしました。

term.phpを表示しているときにdomain.com/portfolio/category/<term-slug>を表示するためにテンプレートシステムに接続します

add_filter('taxonomy_template', 'mbe_term_template');

function mbe_term_template($template){

    $templates = array();

    $queried_object = get_queried_object();

    if(property_exists($queried_object, 'term_id')){
        $templates[] = 'term.php';
    }

    $templates[] = $template;

    return locate_template($templates);

}

domain.com/portfolio/category/<term-slug>に移動すると、現在アクティブなWordPressテーマディレクトリからterm.phpをロードします。


結論

  1. domain.com/portfolio/を表示しているとき - デフォルトのアーカイブテンプレートは通常通りロードされます。現在アクティブなWordPressテーマの(archive.phparchive-posttype.phpなど).
  2. domain.com/portfolio/category/を表示しているとき - taxonomy.phpテンプレートファイルはあなたの現在アクティブなWordPressテーマからロードされます。
  3. domain.com/portfolio/category/<term-slug>を表示しているとき - term.phpテンプレートファイルはあなたの現在アクティブなWordPressテーマからロードされます。

これが機能するかどうかを確認するために簡単にテストできます。あなたが必要としているのはあなたの現在アクティブなWordPressテーマディレクトリにある3つのファイルだけです。 (archive.phpまたはarchive-posttype.phptaxonomy.php、およびterm.php

これをarchive.phpまたはarchive-posttype.phpに入れてください

$current_post_type = get_query_var('post_type');

echo '<p><strong>Current View:</strong> Post Type</p>'.PHP_EOL;
echo '<p><strong>Current Post Type:</strong> <code>'.$current_post_type.'</code></p>'.PHP_EOL;

これをtaxonomy.phpに入れてください

$current_post_type = get_query_var('post_type');
$current_taxonomy = get_query_var('taxonomy');

echo '<p><strong>Current View:</strong> Taxonomy</p>'.PHP_EOL;
echo '<p><strong>Current Post Type:</strong> <code>'.$current_post_type.'</code></p>'.PHP_EOL;
echo '<p><strong>Current View:</strong> <code>'.$current_taxonomy.'</code></p>'.PHP_EOL;

これをterm.phpに入れてください

$current_term = get_queried_object();

echo '<p><strong>Current View:</strong> Term</p>'.PHP_EOL;
echo '<p><strong>Current Term Name:</strong> <code>'.$current_term->name.'</code></p>'.PHP_EOL;
echo '<p><strong>Current Taxonomy:</strong> <code>'.$current_term->taxonomy.'</code></p>'.PHP_EOL;

このリンクに直接ジャンプしないでください。しかし、あなたが質問全体を読み、解答を受け入れたとしても、まだ混乱しています。私は ブログ記事 をもう少し詳しく書いたので、もっと理解しやすくなるかもしれません。

1
Michael Ecklund

それは期待されており、 テンプレート階層 の仕組みです。アーカイブのインデックスをコアで導入するかどうかにかかわらず、この問題に関して数年前に発行されたトラックチケットがあったことを私は知っています。 (編集:チケットを見つけました、ここでチェックしてください: チケット#13816分類法のための組み込みのインデックスページがあるはずです)その考えは捨て去られ、核となる光を見ることは決してないでしょう。そのため、テンプレート階層のアーカイブインデックスページには常にギャップがあります。

ただし、ページテンプレートを使用して、すべての個別アーカイブのインデックスページを作成することができます。たとえば、新しいページを作成し、そのページに追加する必要があるものをすべて追加し、それにcategoryのスラッグを割り当てます。さて、あなたがdomain.com/blog/category/を訪問するとき、あなたはあなたが作成した内容/インデックスページを見るでしょう。

それ以外に、私が知っている他の解決策はありません。

3
Pieter Goosen