web-dev-qa-db-ja.com

分類テンプレート...階層レベルで?

Filenameで指定された階層分類内で、異なる levels に異なるテンプレートを使用する方法はありますか。私はtaxonomy-taxonomyname.phptaxonomy-taxonomyname-term.phpテンプレートについて知っています。より一般的な「分類レベルごと」ベースの方法を探してください。

したがって、Earthという分類法には、次のものが含まれます。

  1. アフリカ
    • カメルーン
    • コンゴ
    • セネガル
  2. アジア
    • 日本
    • 韓国
  3. ヨーロッパ
    • ギリシャ
    • ...
  4. 南アメリカ
  5. ...

アフリカ、アジア、ヨーロッパ、南アメリカ用のテンプレート(earth-numbers-level.php)と、カメルーン、コンゴ、日本、ギリシャ用のテンプレート(earth-bullets-level.php)を用意する方法はありますか?

いくつかの異なるテンプレート階層のドキュメントを見て、私はそうではないと思います。そうであれば、taxonomy-earth.php内で分類レベルを区別するための最善の/最も効率的な方法は何ですか? _それぞれに対して異なるテンプレート部分を使用できるようになりますか?

4
Will

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テンプレートが必要な場合。

5
gmazzap

ここにいくつかの選択肢があります。

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' );
5
Pieter Goosen