始める前に、ありがとうございます。
Structure:
cpt = corsi
tax = argomenti
tax_term = parent
tax_term_child = child
tax_term_child_granchild = grandchild
現在のコード(taxonomy-argomenti.php上):
$queried_object = get_queried_object();
$cpt = get_post_type( get_the_ID() );
$taxonomy = $queried_object->taxonomy;
$term_id = $queried_object->term_id;
$current_term = get_term_by('id', get_query_var('term'), $taxonomy);
if((int)$current_term->parent)
get_template_part('argomenti', 'child');
else
get_template_part('argomenti', 'parent');
どのレベルの分類用語にどのテンプレートを使用するかを選択します。
例:
localhost\cpt archive-cpt.php
localhost\cpt\parent argomenti-parent.php
localhost\cpt\parent\child argomenti-child.php
localhost\cpt\parent\child1\grandchild argomenti-grandchild.php
私が投稿したような機能で可能ですか?
どうもありがとう。
カスタム投稿タイプアーカイブ用のテンプレートを作成して含めるのは簡単です。archive-{$post_type}.php
テンプレートを作成するだけで、その特定の投稿タイプのアーカイブページにアクセスするたびにWordpressが自動的にそのテンプレートを使用します。投稿タイプを登録するときには、必ずhas_archive
パラメータを設定してください。
分類アーカイブページに関しては、あなたはほとんどそこにいます、それはただ用語がトップレベルであるか子供または孫用語であるかどうか調べる問題です。あなたの質問から私が読むことができるもの、あなたはすでに階層構造に関係なく分類法argomenti
からのすべての用語に使用するtaxonomy-{$taxonomy}.php
テンプレートを作成しました。階層に従って含めるテンプレートパーツを使用しました。
それでは、ここで使用するロジックを見てみましょう。
get_queried_object()
は現在見ている用語のオブジェクトという用語を保持します。これを使って用語の親と用語IDを取得します。
最上位の用語はすべて0
という親IDを持ちます。これは重要です。
0
を超える親IDを持つ用語については、階層のどこに収まるかを判断する必要があります。このために、 get_ancestors
を使います。この関数は用語IDの配列を返します。最初の期間IDはテストされている直接の親になり、最後の期間IDは最上位の期間の親になります。階層のどこに用語が収まるかを判断するには、配列のサイズを取得する必要があります。空の配列は親を、1つのキーを持つ配列は子を、2つのキーを持つ配列は孫を意味します
これですべてのロジックをコードにまとめることができます。分類テンプレートに大量のコードが含まれないようにするために、functions.php
に追加できる関数を作成してから、分類テンプレートに1行を呼び出します。 (注:すべてのコードはテストされていないのでバグがある可能性があるので、デバッグを有効にしてローカルでテストしてください。また、PHP 5.4 +が必要です。
function get_tax_hierarchy_template_part( $template = '', $subfolder = '' )
{
/**
* Make sure we are actually on a taxonomy archive page, if not, return false
*
* Instead of returning false here, you can also set it to return a default template
* Check the section commented out
*/
if ( !is_tax() )
return false;
// return get_template_part( 'content' ); // Return default template
// Get the current term object
$current_term_object = get_queried_object();
// Check if we have a value for $subfolder, if so, sanitize it and add slashes
if ( $subfolder )
$subfolder = '/' . filter_var( $subfolder, FILTER_SANITIZE_STRING ) . '/';
/**
* Check if we have value for $template, if so, sanitize, if not, use the taxonomy name
* Also append the $subfolder to $template
*/
if ( $template ) {
$template = filter_var( $template, FILTER_SANITIZE_STRING );
} else {
$template = $current_term_object->taxonomy;
}
$template = $subfolder . $template;
// Check if current term is top level, if so, return template part for parent terms
if ( $current_term_object->parent == 0 )
return get_template_part( $template, 'parent');
/**
* If we have reached this section, it means our term is not toplevel
* We must now determine where in the hierarchy the term is
*/
$hierarchy = get_ancestors( $current_term_object->term_id, $current_term_object->taxonomy );
// We must now get the size of the array
$hierarchy_depth = count( $hierarchy );
/**
* We will set child when the size of the array is one. For any size more
* than one, we will set grandchild
*
* If you are going to have grand-grandchildren which should have its own
* template, you would need to adjust this section
*/
$part = ( $hierarchy_depth == 1 ) ? 'child' : 'grandchild';
// Return the correct template part according to hierarchy
return get_template_part( $template, $part );
}
分類テンプレートの次のように呼び出すことができます。
get_tax_hierarchy_template_part();
フォールバックを設定している場合は、どこでも使用できます。
要求されたように、私は$template
と呼ばれる関数にパラメータを含めました。テンプレートパーツのテンプレート名を設定できます。これがパラメータに設定されていない場合は、分類名が使用されます。
テンプレートパーツの名前が{$taxonomy}-parent.php
の場合は、次のように関数を呼び出す必要があります。
get_tax_hierarchy_template_part();
あなたのテンプレート部分が他のもの、例えばcontent-parent.php
と呼ばれるならば、あなたは以下のようにあなたの関数を呼ぶ必要があります。
get_tax_hierarchy_template_part( 'content' );
分類名をテンプレート部分のデフォルトとして使用する必要があるという条件のため、サブフォルダーにテンプレート部分を収容するために$subfolder
という2番目のパラメーターを組み込む必要がありました。それに応じてコードを更新しました。
2番目のパラメータとして、サブフォルダ名だけをスラッシュなしで渡す必要があります。テンプレート部分として{$taxonomy}-parent.php
を使用している場合は、最初のパラメータとして空の文字列を渡すことを忘れないでください
例:
get_tax_hierarchy_template_part( '', 'subfoldername' );
content-parent.php
タイプのテンプレートパーツには、
get_tax_hierarchy_template_part( 'content', 'subfoldername' );