WooCommerce从我的插件文件夹加载并自定义archive-product.php

时间:2014-03-29 05:46:20

标签: php woocommerce wordpress

我正在尝试从my-plugin文件夹加载模板文件,而不是使用默认的woocommerce模板。我想从my-plugin文件夹模板结构自定义商店页面库,因此我编辑archive-product.php进行评论并检查哪个显示空白页面,但它加载了默认的woocommerce模板(archive-product.php)。我已经将模板文件移动到my-plugin/woocommerce/文件夹这是我试过的代码

 function cc_woocommerce_locate_template($template, $template_name, $template_path) {

        global $woocommerce;
        global $post;
        $plugin_path = untrailingslashit(plugin_dir_path(__FILE__)) . '/woocommerce/';
    //returns my-plugin folder with base file name echo $plugin_path;
               //   echo $template_name;
            if (file_exists($plugin_path . $template_name)) {
                $template = $plugin_path . $template_name;
               // var_dump($template);
                return $template;
            }

        return $template;
    }

我指出的钩子是

add_filter('woocommerce_locate_template', 'cc_woocommerce_locate_template', 1, 3);

2 个答案:

答案 0 :(得分:7)

我测试了提供的代码并且运行没有问题,所以在这种情况下最好重新开始。创建一个新插件并粘贴下面的代码。它包含两个过滤器:

  

wc_get_template_part - 用于循环中使用的模板

     

woocommerce_locate_template - 适用于所有其他模板


//
// get path for templates used in loop ( like content-product.php )
add_filter( 'wc_get_template_part', function( $template, $slug, $name ) 
{ 

    // Look in plugin/woocommerce/slug-name.php or plugin/woocommerce/slug.php
    if ( $name ) {
        $path = plugin_dir_path( __FILE__ ) . WC()->template_path() . "{$slug}-{$name}.php";    
    } else {
        $path = plugin_dir_path( __FILE__ ) . WC()->template_path() . "{$slug}.php";    
    }

    return file_exists( $path ) ? $path : $template;

}, 10, 3 );


// get path for all other templates.
add_filter( 'woocommerce_locate_template', function( $template, $template_name, $template_path ) 
{ 

    $path = plugin_dir_path( __FILE__ ) . $template_path . $template_name;  
    return file_exists( $path ) ? $path : $template;

}, 10, 3 );

现在在插件主文件夹中创建一个子文件夹woocommerce,并复制到原始文件archive-product.phpcontent-product.php中。最后,在该文件中进行一些小修改(回显),看看它们是否已加载。我测试了这个示例,模板在以下层次结构中加载没有问题:

  

theme / template_path / template_name

     

主题/ TEMPLATE_NAME

     

plugin / template_path / template_name

     

默认/ TEMPLATE_NAME

答案 1 :(得分:3)

我从插件中找到了archive-product.php或single-product.php加载的解决方案。我认为它应该有用。

public function include_template_function( $template_path ) {
    if ( get_post_type() == 'product' ) {
        if ( is_single() ) {
            // checks if the file exists in the theme first,
            // otherwise serve the file from the plugin
            if ( $theme_file = locate_template( array ( 'single-product.php' ) ) ) {
                $template_path = $theme_file;
            } else {
                $template_path = plugin_dir_path( __FILE__ ) . 'woocommerce/single-product.php';
            }
        }

        if ( is_archive() ) {
            // checks if the file exists in the theme first,
            // otherwise serve the file from the plugin
            if ( $theme_file = locate_template( array ( 'archive-product.php' ) ) ) {
                $template_path = $theme_file;
            } else {
                $template_path = plugin_dir_path( __FILE__ ) . 'woocommerce/archive-product.php';
            }
        }
    }
    _log($template_path);
    return $template_path;
}

add_filter( 'template_include', array($this, 'include_template_function' ), 100 );