特定の用語のサブカテゴリにのみ適用されるアーカイブテンプレートを作成しようとしています。私の構造は次のようになります。
私はShow subcat 1
とShow subcat 2
(そして他のサブカテゴリ)がすべて同じアーカイブテンプレートを取得したいと思います。これは私の試みの1つですが、これは絶対にうまくいきません。これが私のfunctions.php
のコードです。
add_filter( 'template_include', 'kd_event_subcategory_archive' );
function kd_event_subcategory_archive( $template ) {
$term = get_queried_object()->term_id;
if ( $term->parent == 'tradeshow' ) {
$event_subcat = locate_template( 'taxonomy-tradeshow-subcategory.php' );
return $event_subcat;
}
return $template;
}
ある用語が自分のtradeshow
用語の子であるかどうかを正しくチェックする方法を理解することはできません。
あなたのチェックを妨げている2つの問題があります。
$term = get_queried_object()->term_id;
if ( $term->parent == 'tradeshow' ) {
で始まります:
$term = get_queried_object()->term_id;
ここで$term
は用語オブジェクトではなく用語のIDを含みます。これが期間数5であると仮定しましょう、結果は次のとおりです。
$term = 5;
if ( $term->parent == 'tradeshow' ) {
これはうまくいきません。 $term
は数値であり、オブジェクトではないので、->parent
はできません。
修正方法は、照会されたオブジェクトを直接使用することです。
$term = get_queried_object();
これは次の問題へと導きます。
if ( $term->parent == 'tradeshow' ) {
親は文字列ではなく、用語IDです。親が存在しない場合は0
、それ以外の場合はWP_Term
を検索すると表示されるように、親用語のIDです。
/**
* ID of a term's parent term.
*
* @since 4.4.0
* @var int
*/
public $parent = 0;
だからあなたはそのIDを見つけるために事前にトレードショーの用語を取得する必要があります。通常、これらのシナリオでは、開発者はスラッグをハードコードするのではなく、代わりに用語を一覧表示する設定を提供し、この種の検索を回避して柔軟性を高めるためのオプションとしてIDを格納します。
しかしこの場合はget_term_by
関数を使うことができます。
$tradeshow = get_term_by('slug', 'tradeshow', 'events')
それから:
$tradeshow->term_id === $term->parent
これらは無関係であることを私が言及したかった追加項目です
var_dump
の内容が何であるかを見るために$term
、デバッガ、またはその他のツールを使用すると、これらの問題が明らかになります。
さらに、PHPエラーログには、PHPにとって意味がない5->parent
と同等のことを試みるためのifステートメントを指す警告と通知がいっぱいになります。エラーログに注意してください。私は、予期しない警告を受け取る簡単な方法として、クエリモニタプラグインを使用することをお勧めします。
このコードはページが読み込まれるたびに実行されます。
add_filter( 'template_include', 'kd_event_subcategory_archive' );
function kd_event_subcategory_archive( $template ) {
$term = get_queried_object()->term_id;
if ( $term->parent == 'tradeshow' ) {
しかし、ユーザーが日付アーカイブまたは作者アーカイブを訪問した場合はどうなりますか?今すぐコードがとにかく実行され、エラーを生成します。そのため、このフィルタでは、ユーザーが分類アーカイブに属しているかどうか、および分類が一致しているかどうかを確認するためのテストが必要です。
それは単数の投稿かもしれません、そしてトレードショーの用語が5の用語IDを持ち、あなたがID 5の投稿またはページにいる場合、分類アーカイブ上に投稿を表示するでしょう。
別の分類法を使用する方が簡単だと思いますが。
https://codex.wordpress.org/Function_Reference/get_queried_object
- 単一の投稿の場合は、投稿オブジェクトが返されます
- あなたがページ上にいる場合、それはページオブジェクトを返します
- アーカイブページを開いている場合は、投稿タイプのオブジェクトが返されます
- あなたがカテゴリアーカイブにいるなら、それはカテゴリオブジェクトを返します
- もしあなたが作者アーカイブにいるなら、作者オブジェクトを返します
- 等.