是否使用插件覆盖主题中的WooCommerce loop-start.php?

时间:2020-06-03 作者:TVBZ

“我的主题”有一个覆盖内容/主题/主题名/woocommerce/循环/loop-start.php.我想使用插件覆盖此文件。我知道可以使用子主题来完成,但我想使用插件(因为我在1个插件中捆绑了许多其他修改)。

我在堆栈交换上发现了其他一些类似的问题,但无法找到有效的解决方案。以下是我的尝试:

使用theme_file_path:

add_filter( \'theme_file_path\', \'override_woocommerce_loop_template\', 9999);

function override_woocommerce_loop_template( $path, $file = \'\' ) {
    if( \'woocommerce/loop/loop-start.php\' === $file ) {
        $path = plugin_dir_path( __FILE__ ) . \'includes/woocommerce/loop/loop-start.php\';
    }
    return $path;
}
使用template_include:

add_filter(\'template_include\', \'override_woocommerce_loop_template\', 9999);

function override_woocommerce_loop_template($template){  
    if( \'woocommerce/loop/loop-start.php\' === $template ) {
        $template = plugin_dir_path( __FILE__ ) . \'includes/woocommerce/loop/loop-start.php\';
    }   
    return $template; 
}
有什么提示我错在哪里吗?非常感谢!:)

1 个回复
SO网友:user3135691

你错过了一个重要的部分。

在template\\u include挂钩中,需要检查是否存在要覆盖的其他模板文件。然后根据插件添加逻辑。

此外,您还弄乱了路径,首先声明它,然后在输出中再次使用plugin\\u dir\\u path,因此这也有点错误。您需要为原始模板传入变量,然后在将其传递到输出之前捕获它。

我过去通过“template\\u include”挂钩完成了这项工作。过滤器也可以工作,但我不能确认这一点。

这是我的解决方案,它可以在不同的情况下使用插件文件覆盖主题文件。我还没有测试过这个,但应该可以。

<?php

function wpse_template_logic( $original_template ) {
    // Let\'s build a directory variable for the paths
    $dir = plugins_url(\'/your-plugin-folder-name\');

    // Check the theme template for wc loop-start.php
    // Make sure you establish the correct paths by "get_template_directory_uri()" and "plugins_url()" function
    // Also, be sure to "only" trigger the action, when a certain condition is met
    // You don\'t want to trigger this every time, just when the template is requested
    if (is_page(\'whatever_wc_page\') || $whatever_condition_you_want_to_check) {
        // Now check to see, if the file in the folder XY exists, then overwrite it
        // The outer file_exists check will return true or false, if or if not the template exists in your theme folder, if it does, then move to the plugin folder to get the template
        // This logic is up to you more or less, according to your strategy
        // use the $dir variable to get to the your directory and the template
        if(file_exists(get_template_directory_uri().\'/woocommerce/loop/loop-start.php\')){
            return $dir . \'/custom-wc-template-folder-in-your-plugin/loop-start.php\';
    }
    return $original_template;
}
// First argument is the hook, then the function name, which you want to execute, then the priority, then the amount of arguments
add_action( \'template_include\', \'wpse_template_logic\', 10, 1 );
对于开发中遇到的此类问题,我强烈建议安装插件“What the file”。它将显示当前使用的模板名称。另一个很好的插件是“查询监视器”。它还具有向您显示事物(主题和插件)路径的功能,非常非常有用。也许这会有帮助。

我希望我能帮点忙。如果你能接受正确的答案,我会很高兴的,谢谢你。

相关推荐

使用Add_Filters()、Apply_Filter()、Add_action()和do_action()扩展插件

假设我正在开发一个与预订相关的插件。下次我想在那个插件上添加一个附加组件来支付。然后,我为贝宝支付添加了另一个附加组件。假设下面是html中的支付网关UI界面<div class=\"payments-options\"> <div class=\"bank-payment\"></div> <div class=\"cash-on-delivery\"></div> <!--- Here i