模板部件名称是否有变量?

时间:2012-08-18 作者:helgatheviking

一个调用模板的get_template_part() (或locate_template()) 有没有办法知道你的模板是什么。

例如,如果你打电话get_template_part(\'loop\',\'archive\'); 从…起archive.php

然后在循环存档中工作。php文件。是否有方法定义具有当前模板部件名称的变量。。。。所以$template = \'loop-archive\'. 更好的是,可能分为“循环”和“归档”两部分,但我可以通过一些字符串拆分来实现这一点。

Question #10537 似乎有点相关,但似乎没有涵盖模板零件。

4 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

没有返回当前上下文的核心全局变量。但是,您可以使用上下文template conditional tags. 您可以按照与WordPress core相同的顺序单步遍历条件标记,方法如下wp-includes/template-loader.php.

只需将输出包装在自定义主题函数中即可。Here\'s how I do it (注意:我不认为我严格遵循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() );
我认为这方面的东西将是core的一个很好的候选者,尽管我不确定最好的实现方式。不过,我很想提交一个补丁。

SO网友:helgatheviking

有点像facepalm,因为答案是用纯PHP实现的

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

SO网友:Anh Tran

如果您查看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 查找模板文件并将其包含在内(第二个参数为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 得到你想要的。

SO网友:kaiser

列出所有条件true

全部is_*() 函数在查询变量中有其等价物(函数只是包装器),您也可以通过另一种方式访问它们:简单地获取所有true.

我写了张罚单core/trac 这就添加了一个函数来列出所有这些内容。

同时,您可以使用这两个列出的函数作为助手插件,向您显示哪个请求的条件可用。它将打印var_dump() 页脚下方(管理和公共)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();. 公平地说,我将所有函数重命名为一个字符的名称a/b/c().

正如您所见,芯片硬编码功能最快,其次是我的,最后一个是scribus。

enter image description here

如果你了解我,那么你就知道我喜欢迭代器,因为它优雅、清晰,并且能够在内存中只保存一个项目,而不是在循环时复制整个数组。下面是一个快速自定义类,它扩展了\\FilterIterator, 因此,只需要一种方法进行返工。

<?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()
    );
}

结束

相关推荐