私は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
テンプレートを使用する方法を教えてください。
私はオンラインでランダムな雑多な情報源から一時的な解決策を思いついたと思います。
誰かが私の答えをもっと「弾丸の証拠」になるように拡張するのが大好きです。しかし、短期的には、この解決策は機能します。
現在の書き換え規則を理解してください。
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
をロードします。
domain.com/portfolio/
を表示しているとき - デフォルトのアーカイブテンプレートは通常通りロードされます。現在アクティブなWordPressテーマの(archive.php
、archive-posttype.php
など).domain.com/portfolio/category/
を表示しているとき - taxonomy.php
テンプレートファイルはあなたの現在アクティブなWordPressテーマからロードされます。domain.com/portfolio/category/<term-slug>
を表示しているとき - term.php
テンプレートファイルはあなたの現在アクティブなWordPressテーマからロードされます。これが機能するかどうかを確認するために簡単にテストできます。あなたが必要としているのはあなたの現在アクティブなWordPressテーマディレクトリにある3つのファイルだけです。 (archive.php
またはarchive-posttype.php
、taxonomy.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;
このリンクに直接ジャンプしないでください。しかし、あなたが質問全体を読み、解答を受け入れたとしても、まだ混乱しています。私は ブログ記事 をもう少し詳しく書いたので、もっと理解しやすくなるかもしれません。
それは期待されており、 テンプレート階層 の仕組みです。アーカイブのインデックスをコアで導入するかどうかにかかわらず、この問題に関して数年前に発行されたトラックチケットがあったことを私は知っています。 (編集:チケットを見つけました、ここでチェックしてください: チケット#13816分類法のための組み込みのインデックスページがあるはずです)その考えは捨て去られ、核となる光を見ることは決してないでしょう。そのため、テンプレート階層のアーカイブインデックスページには常にギャップがあります。
ただし、ページテンプレートを使用して、すべての個別アーカイブのインデックスページを作成することができます。たとえば、新しいページを作成し、そのページに追加する必要があるものをすべて追加し、それにcategory
のスラッグを割り当てます。さて、あなたがdomain.com/blog/category/
を訪問するとき、あなたはあなたが作成した内容/インデックスページを見るでしょう。
それ以外に、私が知っている他の解決策はありません。