首页 文章

WooCommerce - 如何根据类别创建多个单一产品模板?

提问于
浏览
8

你好我对woocommerce相当新,我的商店有四类产品使用相同的单一产品模板 . 我想添加第五类产品,其中产品页面布局与已使用的产品页面布局非常不同 .

这是文件结构 -

  • 主题/ woocommerce /单品/

  • 主题/ woocommerce /单品 - 模拟/

  • theme / woocommerce / single-product-mock / title.php

  • theme / woocommerce / content-single-product-mock.php

  • theme / woocommerce / single-product.php

我创建了一个名为content-single-product-mock.php的文件 . 在single-product.php中使用以下代码

<?php if (has_term( 'mock', 'product_cat' )) {
            woocommerce_get_template_part( 'content', 'single-product-mock' );
        } else{
         wc_get_template_part( 'content', 'single-product' ); 
        } ?>

对于类别mock,它重定向到content-single-product-mock.php,但它使用单产品文件夹中的模板文件 . 如何更改content-single-product-mock.php中的模板路径,以便它使用single-product-mock文件夹中的自定义文件?

1 回答

  • 14

    可能有不止一种方法可以做到这一点,但它们都会转变在包含模板之前过滤模板的想法 .

    您可以完全跳过WooCommerce的 simple-product.php 模板(无需覆盖该模板)并直接转到 simple-product-mock.php 并在那里创建所有内容 . 你可以通过过滤template_include来做到这一点 .

    add_filter( 'template_include', 'so_25789472_template_include' );
    
    function so_25789472_template_include( $template ) {
      if ( is_singular('product') && (has_term( 'mock', 'product_cat')) ) {
        $template = get_stylesheet_directory() . '/woocommerce/single-product-mock.php';
      } 
      return $template;
    }
    

    您可以编辑 single-product-mock.php 以调用 content-single-product-mock.php 并对该文件进行硬编码 . 没有什么要求你继续使用Woo的钩子和功能 . 它们的目的只是为了让您轻松自定义 .

    或者真的很棘手,你可以将 single-product/title.php 等模板复制到 single-product-mock 文件夹...例如: single-product-mock/title.php 然后我们're on a single product template in the mock category, we' ll拦截对 single-product/something.php 模板的调用并将它们重定向到 single-product-mock/something.php 如果它存在并继续指向 single-product/something.php 如果没有 . 我们将通过 woocommerce_locate_template 过滤器执行此操作 .

    add_filter( 'woocommerce_locate_template', 'so_25789472_locate_template', 10, 3 );
    
    function so_25789472_locate_template( $template, $template_name, $template_path ){
    
        // on single posts with mock category and only for single-product/something.php templates
        if( is_product() && has_term( 'mock', 'product_cat' ) && strpos( $template_name, 'single-product/') !== false ){
    
            // replace single-product with single-product-mock in template name
            $mock_template_name = str_replace("single-product/", "single-product-mock/", $template_name );
    
            // look for templates in the single-product-mock/ folder
            $mock_template = locate_template(
                array(
                    trailingslashit( $template_path ) . $mock_template_name,
                    $mock_template_name
                )
            );
    
            // if found, replace template with that in the single-product-mock/ folder
            if ( $mock_template ) {
                $template = $mock_template;
            }
        }
    
        return $template;
    }
    

相关问题