Filenameで指定された階層分類内で、異なる levels に異なるテンプレートを使用する方法はありますか。私はtaxonomy-taxonomyname.php
とtaxonomy-taxonomyname-term.php
テンプレートについて知っています。より一般的な「分類レベルごと」ベースの方法を探してください。
したがって、Earthという分類法には、次のものが含まれます。
アフリカ、アジア、ヨーロッパ、南アメリカ用のテンプレート(earth-numbers-level.php
)と、カメルーン、コンゴ、日本、ギリシャ用のテンプレート(earth-bullets-level.php
)を用意する方法はありますか?
いくつかの異なるテンプレート階層のドキュメントを見て、私はそうではないと思います。そうであれば、taxonomy-earth.php
内で分類レベルを区別するための最善の/最も効率的な方法は何ですか? _それぞれに対して異なるテンプレート部分を使用できるようになりますか?
Pieter Goosenの答えに+1を付けましたが、今回は「make it simple」の方法を提唱する人になりたいです。
taxonomy-earth.php
テンプレートでは、クエリされた用語が親としているかどうかを確認でき、必要であれば別のテンプレートが必要です。
この質問をする場合、2つのテンプレートを既に持っている(または作成したい)と思います。
taxonomy-earth-continent.php
taxonomy-earth-country.php
taxonomy-earth.php
ファイルでは、次のことができます。
<?php
$slug = 'taxonomy-earth';
// default to continent
$name = 'continent';
// maybe set specific template to "country" if queried term has a parent
$term = get_queried_object();
if ( is_object( $term ) && ! empty( $term->parent ) )
$name = 'country';
get_template_part( $slug, $name );
これらの6行のテンプレートコードは、「子」用語に異なるテンプレートを必要とするのに十分です。
get_template_part
を使用しているため、テンプレートコードも子テーマに対応しており、フックをトリガーします: get_template_part_taxonomy-earth
を使用してthingsテンプレートが必要な場合。
ここにいくつかの選択肢があります。
taxonomy-{$taxonomy}-{$term->parent}-{$term}.php
子用語が表示されているときに使用するための独自のtaxonomy-{$taxonomy}-{$term->parent}-{$term}.php
テンプレートを作成することによって、独自の階層を作成できます( または実際に既存の階層 を拡張する)。また、taxonomy_template
フィルタを使用して新しい分類テンプレートを階層に追加し、それらが使用されるようにします。
次のような方法を試すことができます。( 注: すべてのコードはテストされておらず、すべてのコードはコメントを付けやすくなっています。 taxonomy-{$taxonomy}-{$term}.php
テンプレート )
add_filter( 'taxonomy_template', function ( $template )
{
// Get the current term object being viewed
$current_term = get_queried_object();
// We can restrict this to a single taxonomy, for example
// if ( $current_term->taxonomy !== 'my_taxonomy' )
// return $template;
/**
* Check if current term is top level, if so, return the default $template which
* should be template taxonomy-{$taxonomy}-{$term}.php if found
*/
if ( $current_term->parent == 0 ) // Top level terms have parent of 0
return $template;
// We made it to here, so the term is not top level
// We need to get the top level term of the current term
$hierarchy = get_ancestors( $current_term->term_id, $current_term->taxonomy );
// The parent ID will always be the last ID in the array returned by get_ancestors
$parent_ID = end( $hierarchy );
// Now we can get the top level term object
$top_level_term = get_term_by( 'id', $parent_ID, $current_term->taxonomy );
/**
* Lets build our custom template name, add subfolder name if template
* is in a subfolder, for example /subfolder/name-of-template.php
*/
$custom_template = 'taxonomy-{$current_term->taxonomy}-{$top_level_term->slug}-{$current_term->slug}.php';
// Check if our custom template exist, if not, return default $template
$locate_template = locate_template( $custom_template );
if ( !$locate_template )
return $template;
// Finally, everything checked out, return our custom template
return $template = $locate_template;
});
必要に応じてコードを調整できます
あなたはあなたのtaxonomy-{$taxonomy}-{$term}.php
テンプレートを作成して、そしてあなたのループの中でテンプレート部分を利用して子供の言葉に従ってテンプレート部分を含めることができます。ここでの最善の方法は、カスタム関数を作成してから、その関数をループ内(get_template_part()
ではなく)で呼び出すことです( または必要な場合は )。
これが機能するためには、次のようにテンプレート部分を呼び出す必要があります。
africa.php
のように、トップレベルの用語は{$ term} .phpになります。
子用語は{$term->parent}-{$term}.php
のようにafrica-cameroon.php
になります
content.php
のようなデフォルト/フォールバックテンプレート。テンプレート名の.php
部分を関数に渡さないようにしてください。
これがコードです
/**
* Function to set template parts according to child term
*
* @param (string) $default Default template part to use like content.php
* @return $template
*/
function get_custom_template_part( $default = '' )
{
// Check if we have a value for $default, if not, return false
if ( !$default )
return false;
// Sanitize the $default value
$default = filter_var( $default, FILTER_SANITIZE_STRING );
// Check if we are on a taxonomy page, if not, return the $default template
if ( !is_tax() )
return get_template_part( $default );
// Get the current term being viewed
$current_term = get_queried_object();
/**
* Set our custom variables
* $top_level_term will hold the top level term object
* $part will hold the current term slug if the current term is not top level
*/
$top_level_term = '';
$part = '';
// Check if current term is top level, if not, get the top level parent
if ( $current_term->parent != 0 ) {
// We need to get the top level term of the current term
$hierarchy = get_ancestors( $current_term->term_id, $current_term->taxonomy );
// The parent ID will always be the last ID in the array returned by get_ancestors
$parent_ID = end( $hierarchy );
// Now we can get the top level term object
$top_level_term = get_term_by( 'id', $parent_ID, $current_term->taxonomy );
$part = $current_term->slug;
}
// We now will set our template's name accordingly
if ( $top_level_term ) {
$name = $top_level_term->slug;
} else {
$name = $current_term->slug;
}
// We will now check if our template parts exist, if not, return our default
if ( $part ) { // This means we have a child term
$template = get_template_part( $name, $part );
} else { // This means top level term
$template = get_template_part( $name );
}
if ( $template )
return $template;
return get_template_part( $default );
}
必要に応じてこれを拡張することができます。また、サブフォルダーにテンプレートパーツを追加してから、関数内で$name
の値にサブフォルダー名を追加することもできます。
taxonomy-{$taxonomy}-{$term}.php
またはtaxonomy-{$taxonomy}.php
テンプレートでは、次のように関数を使用できます。
デフォルトのテンプレート:content.php
get_custom_template_part( 'content' );