web-dev-qa-db-ja.com

分類学用語の各レベルのget_template_part

始める前に、ありがとうございます。

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

私が投稿したような機能で可能ですか?

どうもありがとう。

1
Simo

カスタム投稿タイプアーカイブ用のテンプレートを作成して含めるのは簡単です。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' );

編集2

分類名をテンプレート部分のデフォルトとして使用する必要があるという条件のため、サブフォルダーにテンプレート部分を収容するために$subfolderという2番目のパラメーターを組み込む必要がありました。それに応じてコードを更新しました。

使用法

2番目のパラメータとして、サブフォルダ名だけをスラッシュなしで渡す必要があります。テンプレート部分として{$taxonomy}-parent.phpを使用している場合は、最初のパラメータとして空の文字列を渡すことを忘れないでください

例:

get_tax_hierarchy_template_part( '', 'subfoldername'  );

content-parent.phpタイプのテンプレートパーツには、

 get_tax_hierarchy_template_part( 'content', 'subfoldername' );
2
Pieter Goosen