如何通过子主题使用LOCATE_TEMPLATE()删除父主题中包含的文件?

时间:2013-09-11 作者:JPollock

在我的主题中,我使用locate_template() 加载函数库的各个部分。我正在寻找一种在使用子主题时不包含这些文件的方法。我尝试添加locate_template(\'same_file_name.php\', false); 我的孩子主题的功能。php,但仍包括在内。

澄清编辑:我不想阻止子主题使用此文件。通常,我希望在使用子主题时包含此文件。我正在寻找一些东西来添加到一个孩子的主题,当我不想使用它。

3 个回复
最合适的回答,由SO网友:gmazzap 整理而成

从两个答案中汲取灵感的替代解决方案@Milo@toscho.

创建自己的函数以加载模板,例如。

if ( ! function_exists(\'my_locate_template\') ) {
  function my_locate_template( $template = \'\', $load = false, $once = true ) {
    $filtered = apply_filters(\'allow_child_load_\' . $template, true);
    if ( ! is_child_theme() || $filtered ) return locate_template($template, $load, $once);
    return false;
  }
}
然后在父主题中使用加载文件my_locate_template(\'same_file_name.php\').

这样,您的文件将始终加载到父主题中,当使用子主题时,您可以使用过滤器排除某些文件。

add_filter(\'allow_child_load_disallow-this.php\', \'__return_false\'); 
然后是文件disallow-this.php, 将不会加载到该子主题中。

另请注意,函数包装在if (! function_exists(\'my_locate_template\') ) { 因此,如果需要,可以在子主题中完全替换它。

简单、灵活且具有舒适的默认设置。

SO网友:fuxia

您可以在父主题中为这些文件提供过滤器。然后,您可以在每个子主题中分别决定应加载哪些文件:

$files_to_include = array(
    \'foo.php\',
    \'bar.php\'
);
$files_to_include = apply_filters(
    get_template() . \'_files_to_include\',
    $files_to_include
);

if ( ! empty ( $files_to_include ) )
{
    foreach ( $files_to_include as $file )
        locate_template( $file );
}
在子主题中,您现在可以从该阵列中删除一些文件:

add_filter( get_template() . \'_files_to_include\', function( $files )
{
    $bar_key = array_search( \'bar.php\', $files );

    if ( FALSE !== $bar_key )
        unset( $files[ $bar_key ] );

    return $files;
});

SO网友:Milo

你可以把locate_template 打电话检查is_child_theme 在父主题中,因此它将被忽略:

if( ! is_child_theme() ){
    locate_template( ... );
}

结束

相关推荐

Making custom woo themes

我最近决定加入WordPress,但我需要为电子商务创建一些主题,这些主题目前构建在Open Cart中。我在电子商务方面的经验来自开放式购物车,但我对WordPress完全没有经验。经过几个月的研究,我决定尝试从Woo主题中创建自己的主题Mystile. 我的问题如下:如果制作自定义主题是只修改custom.css?</发布主题更新时,他们是否也会更新.css 文件或是否有正在更新的标准文件集</Woocommerce似乎没有standard 那么有没有比使用Mystile或Artific