筛选器GET_TEMPLATE_PART()$args数组

时间:2021-03-26 作者:dj.cowan

在设置主题时,我希望能够预先填充get\\u tempate\\u part$args的所有事件。

get_template_part( string $slug, string $name = null, array *$args* = array() )
get_template_part 功能和内部locate_template 它也由get\\u template\\u part、get\\u header、get\\u footer等调用,但不应用任何筛选器。我能做的最好的事情就是修改我的主题调用的每个实例,以获得\\u template\\u part,如下所示:

<?php get_template_part( \'views/loop\', \'index\', apply_filters( \'filter_template_part_args\', [], \'loop\' ) ); ?>
并运行自定义筛选器,如下所示:

add_filter( \'filter_template_part_args\', function( $args, $slug, $name = \'\' ) {

    $defaults = [
        \'id\'        => esc_attr( basename( $slug ) ),
        \'tag\'       => \'div\',
        \'class\'     => \'\',
        \'container\' => \'container\',
        \'row\'       => \'row\',
    ];

    return \\wp_parse_args( $args, $defaults );
    ;
});

上述函数的变通方法(虽然维护工作量很大)适用于在主题中进行的各个teamplate\\u部分调用,但对于来自wordpress默认值(get\\u footer、get\\u header等)的现有调用失败

我是否遗漏了一些关键信息?是的,get\\u header()除了一个$args参数外,其他都会出现,但我的主题很快就被多个代码块填满了,这使得扩展性很痛苦,而且非常不干燥

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

没有这样的过滤器,所以你所做的就是尽你所能做到最好。但是,您可以通过在应用过滤器的同时创建包装模板函数的函数来进行一些优化:

add_filter(
    \'filter_template_part_args\',
    function( $args, $slug, $name = null ) {
        $args = wp_parse_args(
            $args,
            [
                \'id\'        => esc_attr( basename( $slug ) ),
                \'tag\'       => \'div\',
                \'class\'     => \'\',
                \'container\' => \'container\',
                \'row\'       => \'row\',
            ]
        );

        return $args;
    }
)

function mytheme_get_template_part( $slug, $name = null, $args = [] ) {
    $args = apply_filters( \'filter_template_part_args\', $args, $slug, $name );

    get_template_part( $slug, $name, $args );
}

function mytheme_get_header( $name = null, $args = [] ) {
    $args = apply_filters( \'filter_template_part_args\', $args, \'header\', $name );

    get_header( $name, $args );
}
那么你也可以这样做get_sidebar()get_footer(), 您应该了解所有主要模板功能:

function mytheme_get_footer( $name = null, $args = [] ) {
    $args = apply_filters( \'filter_template_part_args\', $args, \'footer\', $name );

    get_footer( $name, $args );
}

function mytheme_get_sidebar( $name = null, $args = [] ) {
    $args = apply_filters( \'filter_template_part_args\', $args, \'sidebar\', $name );

    get_sidebar( $name, $args );
}

相关推荐

如何将Apply_Filters()与类函数一起使用?

我想允许我的用户重写函数。这是一个插件。我相信apply\\u filters()可以用于此。这可以被add\\u filter()覆盖。我对如何使用它感到困惑。如果我有这样的课class Example{ public function hello(){ $title = the_title_attribute(); return $title; } } 我应该做什么更改以允许修改$标题?在哪里放置应用过滤器?谢谢