テンプレートパーツ名の変数はありますか?


8

get_template_part()(またはlocate_template())でテンプレートを呼び出したものの1つは、現在どのテンプレートにいるかを知る方法です。

たとえばget_template_part('loop','archive');archive.php

そして、あなたのloop-archive.phpファイルで働いています。現在のテンプレートパーツの名前を持つ変数を定義する方法はありますか$template = 'loop-archive'。さらに良いのは、おそらく「ループ」と「アーカイブ」の2つの部分に分かれていますが、文字列を分割することで実現できます。

質問#10537は関連しているようですが、テンプレートパーツをカバーしていないようです。

回答:


2

現在のコンテキストを返すコアグローバル変数はありません。ただし、コンテキストテンプレートの条件タグを使用して、独自のタグを作成できます。以下の手順に従って、WordPressコアと同じ順序でコンディショナルタグをステップ実行できますwp-includes/template-loader.php

出力をカスタムテーマ関数でラップするだけです。ここに私がそれをする方法があります(注意:私はtemplate-loader.phpに厳密に従わないと思います):

function oenology_get_context() {

    $context = 'index';

    if ( is_home() ) {
        // Blog Posts Index
        $context = 'home';
        if ( is_front_page() ) {
            // Front Page
            $context = 'front-page';
        } 
    }else if ( is_date() ) {
        // Date Archive Index
        $context = 'date';
    } else if ( is_author() ) {
        // Author Archive Index
        $context = 'author';
    } else if ( is_category() ) {
        // Category Archive Index
        $context = 'category';
    } else if ( is_tag() ) {
        // Tag Archive Index
        $context = 'tag';
    } else if ( is_tax() ) {
        // Taxonomy Archive Index
        $context = 'taxonomy';
    } else if ( is_archive() ) {
        // Archive Index
        $context = 'archive';
    } else if ( is_search() ) {
        // Search Results Page
        $context = 'search';
    } else if ( is_404() ) {
        // Error 404 Page
        $context = '404';
    } else if ( is_attachment() ) {
        // Attachment Page
        $context = 'attachment';
    } else if ( is_single() ) {
        // Single Blog Post
        $context = 'single';
    } else if ( is_page() ) {
        // Static Page
        $context = 'page';
    }

    return $context;
}

次に、oenology_get_context()パラメーターとして渡すだけです。例:

get_template_part( 'loop', oenology_get_context() );

私はこれらの線に沿った何かがコアの良い候補になると思いますが、実装する最良の方法はわかりません。ただし、パッチを提出したいのですが。


すごいチップ。それはとても、とても滑らかです。そしてあなたのユースケースはまさに私が意図していたものです。パッチに関しては、なぜテンプレートローダーをステップ実行すると同時にこのグローバルな権利を登録しないのですか?
helgatheviking 2012

1
別のグローバルを追加することがコアの「祝福された」アプローチになるかどうか私にはわからないので。おそらく、文字列としてコンテキストを返す関数の方が良いでしょう-しかし、その場合は、おそらくを少し書き換える必要がありますtemplate-loader.php
チップベネット

いいね+1。ただ1つのメモ:indexどちらかis_front_page()またはis_home()トリガーとして、一致することはありません。
カイザー2012

1
もう1つ:「最新の投稿」設定が有効になっていて、フロントページが存在しない場合でもis_home()返されるため、最初にする必要front-pageがあります。ちょうどテストした。
カイザー

@kaiserに同意します。is_home() && 'page'必要に応じて、を使用することもできます。ブログ投稿とフロントページの静的ページの詳細については、私自身の回答をご覧ください。ここでは、wordpress.stackexchange.com / questions / 208503 / です。ところで、@ Chipと@helgathevikingは、switchそれほど多くの代わりにを使用することをお勧めしますelseif(より効率的です;-)。よろしく!
ジェラール

4

答えは純粋なPHPなので

$path_parts = pathinfo(__FILE__);
//var_dump($path_parts); 
echo $path_parts['filename'];

2

get_template_part関数のソースコードを見ると、次のことがわかります。

function get_template_part( $slug, $name = null ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    locate_template($templates, true, false);
}

:それは2テンプレート名の配列を作成{$slug}-{$name}.phpし、{$slug}.phpそして使用load_template(第2パラメータであるテンプレートファイルを見つけて、それを含めるためにtrue、そのファイルが含まれている手段、)。

次のように、この関数を模倣して、テンプレートファイルパスを含める代わりに返すことができます。

function my_get_template_part( $slug, $name = null, $include = false ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    return locate_template($templates, $include, false);
}

使用法:

// Don't load the template
$template = my_get_template_part( 'loop', 'archive', false );

// Or load the template
$template = my_get_template_part( 'loop', 'archive', true );

// Get the file name only
$template = basename( $template );

// Without .php extension
$template = substr( $template, 0, -4 );

もっと遊んで、$template欲しいものを手に入れることができます。


それはかなりきれいです!確かに+1ですが、loop-arhive.phpテンプレート内の$ template情報を知る必要がありました(例に従うため)
helgatheviking

で設定されているグローバル変数を使用してarchive.php、それを再利用できますloop-archive.php
Anh Tran

2

あるすべての条件文をリストする true

すべてのis_*()関数はクエリ変数に同等のものがあるため(関数は単なるラッパーです)、別の方法でそれらにアクセスすることもできますtrue

それらをすべてリストする機能を追加するチケットをコア/トラックに書いた。

その間、リストされている両方の関数を、どのリクエストでどの条件が使用可能かを示すヘルパープラグインとして使用できます。フックvar_dump()でフッターの下(adminとpublicの両方)を印刷しますshutdown

<?php
/** Plugin Name: (#62232) »kaiser« List all conditionals that are true */
function get_conditionals()
{ 
    global $wp_query; 

    foreach ( get_object_vars( $wp_query ) as $is_key => $is_value ) 
    { 
            if ( $is_value && preg_match( "/is_/", $is_key ) ) 
                    $conditionals[] = $is_key; 
    } 

    return var_dump( $conditionals );
} 
add_action( 'shutdown', 'get_conditionals' );

このようにして、単純にループすることができます。

@scribuが独自の機能をチケットに追加しました(興味深い解決策も)。

   

<?php
/** Plugin Name: (#62232) »scribu« List all conditionals that are true */
function get_query_flags( $wp_query = null ) {
    if ( !$wp_query )
        $wp_query = $GLOBALS['wp_query'];

    $flags = array();

    foreach ( get_object_vars( $wp_query ) as $key => $val ) {
        if ( 'is_' == substr( $key, 0, 3 ) && $val )
            $flags[] = substr( $key, 3 );
    }

    return var_dump( $flags );
}
add_action( 'shutdown', 'get_query_flags' );

パフォーマンス

を使用して、テンプレートの途中で各関数のパフォーマンステストを実行しましたtimer_start/*_stop();。公平を期すために、すべての関数の名前を1文字の名前に変更しましたa/b/c()

あなたが見ることができるように、チップスのハードコードされた関数は最も速く、それから私のものになり、最後はこの場合スクリバスです。

ここに画像の説明を入力してください

更新

あなたが私を知っているなら、ループ中に配列全体のコピーではなく、1つの項目のみをメモリに保持できるという、その優雅さ、明確さ、および能力に対する反復子への私の愛を知っています。だから、これはを拡張する簡単なカスタムクラスです\FilterIterator。したがって、1つのメソッドのみを修正する必要があります。

<?php

namespace WPSE;

class ConditionalsFilter extends \FilterIterator
{
    /**
     * Accepts properties that start with `is_` and have a positive boolean value
     * @return bool
     */
    public function accept()
    {
        return 0 === strncasecmp( $this->key(), 'is_', 3 )
            and filter_var(
                $this->current(),
                FILTER_VALIDATE_BOOLEAN,
                FILTER_NULL_ON_FAILURE
            );
    }
}

とても簡単に使えます。$it->current()一方で、値を保持して$it->key()戻り、条件付き/プロパティ名。

$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
    get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
    var_dump(
        $cond->key(),
        $cond->current()
    );
}

1
まあそれは非常に賢いです。ありがとう!作業している他のいくつかの作業を終えたら、これに再度アクセスする必要があります。また、大文字にすることを覚えるのは本当に難しいです!悪い習慣は破るのが難しいです。
helgatheviking 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.