WooCommerce-从插件加载所有模板文件的模板

时间:2017-07-10 作者:Ryan Dorn

我读了很多关于overriding the default /woocommerce/ templates 并尝试实施以下内容(这是我所能找到的最好/最相关的内容,但都无济于事):

  • Load WooCommerce templates from my plugin folder first
  • Override WooCommerce Template File Within a Plugin

    • ~/wp-content/my-plugin/templates/woocommerce/single-product.php (看起来它只是不想通过插件加载)
    • ~/wp-content/my-plugin/templates/woocommerce/archive-products.php (看起来它只是不想通过插件加载)
    • ~/wp-content/my-plugin/templates/woocommerce-pdf-invoices-packing-slips/* (我也希望能够override other plugin extension templates 就像我可以在我的孩子主题中一样

      EDIT:

      友好的人们SkyVerge 向我发送了以下代码,我对其进行了测试,并确认其适用于模板零件。

      // Locate the template in a plugin
      function myplugin_woocommerce_locate_template( $template, $template_name, $template_path ) {
      
          $_template = $template;
      
          if ( ! $template_path ) {
              $template_path = WC()->template_path();
          }
      
          $plugin_path = myplugin_plugin_path() . \'/templates/\';
      
          // Look within passed path within the theme - this is priority
          $template = locate_template(
              array(
                  trailingslashit( $template_path ) . $template_name,
                  $template_name
              )
          );
      
          // Modification: Get the template from this plugin, if it exists
          if ( ! $template && file_exists( $plugin_path . $template_name ) ) {
              $template = $plugin_path . $template_name;
          }
      
          // Use default template
          if ( ! $template ) {
              $template = $_template;
          }
      
          return $template;
      }
      add_filter( \'woocommerce_locate_template\', \'myplugin_woocommerce_locate_template\', 10, 3 );
      
      // Helper to get the plugin\'s path on the server
      function myplugin_plugin_path() {
          // gets the absolute path to this plugin directory
          return untrailingslashit( plugin_dir_path( __FILE__ ) );
      }
      
      上述代码适用于以下情况:

      • ~/myplugin/templates/single-product/product-image.php
      但不适用于:

      • ~/myplugin/templates/single-product.php
      我遇到的问题:

      有一些解决方案可以覆盖WC模板的各个部分,但我还没有找到/能够创建一个全面覆盖WC模板的解决方案(即覆盖能力就像子主题一样)

    • 我似乎找不到过滤器挂钩的正确组合;单一产品。php和归档产品。php似乎是由标准WC模板函数之外的函数控制的,请提前感谢!

4 个回复
SO网友:Sally CJ

WooCommerce使用template_include 筛选/挂接以加载主模板,如archive-product.phpsingle-product.php. 和here\'s 处理主模板的类。

该类中有一个过滤器,可用于捕获WooCommerce根据当前请求/页面加载的默认文件(名称)—e、 g。single-product.php 对于单个产品页面。

但是,您不能简单地挂接到该过滤器,返回自定义模板路径并期望使用它(因为该路径必须相对于活动主题文件夹)。但您可以在下面的第二个代码段中执行类似操作(在WoodPress 5.2.2和WooCommerce 3.6.5上进行了尝试和测试,WooCommerce 3.6.5是本文撰写时的最新版本):

首先,一个助手函数:

// Helper function to load a WooCommerce template or template part file from the
// active theme or a plugin folder.
function my_load_wc_template_file( $template_name ) {
    // Check theme folder first - e.g. wp-content/themes/my-theme/woocommerce.
    $file = get_stylesheet_directory() . \'/woocommerce/\' . $template_name;
    if ( @file_exists( $file ) ) {
        return $file;
    }

    // Now check plugin folder - e.g. wp-content/plugins/my-plugin/woocommerce.
    $file = \'full/path/to/your/plugin/\' . \'woocommerce/\' . $template_name;
    if ( @file_exists( $file ) ) {
        return $file;
    }
}
single-product.php):

add_filter( \'woocommerce_template_loader_files\', function( $templates, $template_name ){
    // Capture/cache the $template_name which is a file name like single-product.php
    wp_cache_set( \'my_wc_main_template\', $template_name ); // cache the template name
    return $templates;
}, 10, 2 );

add_filter( \'template_include\', function( $template ){
    if ( $template_name = wp_cache_get( \'my_wc_main_template\' ) ) {
        wp_cache_delete( \'my_wc_main_template\' ); // delete the cache
        if ( $file = my_load_wc_template_file( $template_name ) ) {
            return $file;
        }
    }
    return $template;
}, 11 );
wc_get_template_part()):

add_filter( \'wc_get_template_part\', function( $template, $slug, $name ){
    $file = my_load_wc_template_file( "{$slug}-{$name}.php" );
    return $file ? $file : $template;
}, 10, 3 );
wc_get_template() 或wc_locate_template()):

add_filter( \'woocommerce_locate_template\', function( $template, $template_name ){
    $file = my_load_wc_template_file( $template_name );
    return $file ? $file : $template;
}, 10, 2 );
woocommerce_template_path 筛选那些只想更改默认WooCommerce模板文件夹的用户(woocommerce) <活动主题文件夹中的em>。

SO网友:Syed Abuthahir M

function woo_template_replace( $located, $template_name, $args, $template_path, $default_path ) {

if( file_exists( plugin_dir_path(__FILE__) . \'templates/\' . $template_name ) ) {
    $located = plugin_dir_path(__FILE__) . \'templates/\' . $template_name;
}

return $located;
}


function woo_get_template_part( $template , $slug , $name ) {

if( empty( $name ) ) {
    if( file_exists( plugin_dir_path(__FILE__) . "/templates/{$slug}.php" ) ) {
        $template = plugin_dir_path(__FILE__) . "/templates/{$slug}.php";
    }
} else {
    if( file_exists( plugin_dir_path(__FILE__) . "/templates/{$slug}-{$name}.php" ) ) {
        $template = plugin_dir_path(__FILE__) . "/templates/{$slug}-{$name}.php";
    }
return $template;
}

add_filter( \'wc_get_template\' , \'woo_template_replace\' , 10 , 5 );

add_filter( \'wc_get_template_part\' , \'woo_get_template_part\' , 10 , 3 );
您可以在插件根文件中使用此代码段,并将所有woocommerce模板文件放在templates目录中。

插件结构供参考

plugins
  woo-template-replace (plugin root folder)
     woo-template-replace.php (plugin root file)
     templates (folder)
        single-content.php (woocommerce template file)
        searchform.php (woocommerce template file)

SO网友:Syed Abuthahir M

在这种情况下,您可以使用以下过滤器wc_get_template_part。

挂钩参考链接:wc_get_template_part

如果您不知道如何使用过滤器,请阅读本文wordpress hooks for non developers

SO网友:Maher Aldous

如果你想覆盖WooCommerce的模板,那么我有你的答案。我刚刚为我的客户创建了一个Suplete WooCommerce主题,并支持WooCommerce中的所有内容,所以让我们开始吧。

首先,在做任何事情之前,如果你读得慢一点,这一页是非常好的WooCommerce Overriding the plugins templates.

步骤1:在函数中。php添加WooCommerce支持

if (!function_exists( \'albadrbakelser_setup\')) :
    function albadrbakelser_setup() {

        // Add Woocommerce Support
        add_theme_support(
            \'woocommerce\', array(
                //\'thumbnail_image_width\' => 150,
                // \'gallery_thumbnail_image_width\' => 100,
                //\'single_image_width\'    => 300,

                \'product_grid\'          => array(
                    \'default_rows\'    => 5,
                    \'min_rows\'        => 1,
                    \'max_rows\'        => 10,
                    \'default_columns\' => 4,
                    \'min_columns\'     => 1,
                    \'max_columns\'     => 4,
                    ),
                )
        );
        add_theme_support( \'wc-product-gallery-zoom\' );
        add_theme_support( \'wc-product-gallery-lightbox\' );
        add_theme_support( \'wc-product-gallery-slider\' );


    }
endif;
add_action( \'after_setup_theme\', \'albadrbakelser_setup\' );
如果你不想要任何东西,也可以用这个

function mytheme_add_woocommerce_support() {
    add_theme_support( \'woocommerce\' );
}
add_action( \'after_setup_theme\', \'mytheme_add_woocommerce_support\' );
第二步:覆盖某些内容。

示例:要在单个产品标题副本中添加“Hello”:wp-content/plugins/woocommerce/single-product/title.php to wp-content/themes/yourtheme/woocommerce/single-product/title.php

然后打开标题。沿此方向复制的phpwp-content/themes/yourtheme/woocommerce/single-product/title.php 并在h1 html tag 像这样<h1>Hello</h1>. 然后保存文件

最后一步:去你网站上的单一产品,看看是否有Hello。确保已创建要访问的产品。

Results:

Results

Note:

如果没有任何效果,尝试创建woocommerce。通过以下页面在根目录中创建php文件https://docs.woocommerce.com/document/third-party-custom-theme-compatibility/

这是从添加支持开始的页面https://github.com/woocommerce/woocommerce/wiki/Declaring-WooCommerce-support-in-themes

结束

相关推荐

Custom templates vs page-slug

我目前一直在使用slug来设置页面模板,使用普通的层次结构例如,如果我想更改的页面模板http://www.example.com/about-us, 我会编辑关于我们的页面。php如果客户端要去更改页面slug,它将不再加载正确的模板。在WordPress后端使用“自定义模板”下拉列表是否更好?就这一点而言,最佳做法是什么?非常感谢