2014-09-11 22 views
7

Xin chào Tôi khá mới đối với woocommerce, Cửa hàng của tôi có bốn loại sản phẩm sử dụng cùng một mẫu sản phẩm. Tôi muốn thêm danh mục sản phẩm thứ năm nơi bố cục trang sản phẩm rất khác với bố cục đã sử dụng.WooCommerce - Cách tạo nhiều mẫu sản phẩm duy nhất dựa trên danh mục?

Dưới đây là cấu trúc tập tin -

  • theme/woocommerce/đơn sản phẩm/
  • theme/woocommerce/đơn sản phẩm giả/
  • theme/woocommerce/đơn sản phẩm giả/title .php
  • theme/woocommerce/nội dung đơn sản phẩm mock.php
  • theme/woocommerce/đơn product.php

Tôi đã tạo một tệp có tên là content-single-product-mock.php. Trong đơn product.php sử dụng đoạn mã sau

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

Đối với các loại chế nhạo nó chuyển hướng đến nội dung đơn sản phẩm mock.php, nhưng nó sử dụng các tập tin trong thư mục mẫu đơn sản phẩm. Làm thế nào để thay đổi đường dẫn mẫu trong content-single-product-mock.php sao cho nó sử dụng các tệp tùy chỉnh trong thư mục một sản phẩm đơn?

Trả lời

11

Có thể có nhiều cách để thực hiện việc này, nhưng tất cả đều xoay quanh ý tưởng lọc mẫu trước khi nó được đưa vào.

Bạn thể hoàn toàn bỏ qua simple-product.php mẫu WooCommerce của (mà không cần phải ghi đè lên template đó) và đi thẳng đến simple-product-mock.php và tạo tất cả mọi thứ ở đó. Bạn sẽ làm điều đó bằng cách lọc 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; 
} 

Bạn có thể chỉnh sửa single-product-mock.php gọi content-single-product-mock.php và mã hóa cứng rằng tập tin. Không có gì đòi hỏi bạn phải tiếp tục sử dụng móc và chức năng của Woo. Điểm của họ chỉ là giúp bạn dễ dàng tùy chỉnh. Hoặc thực sự phức tạp, bạn có thể sao chép các mẫu như single-product/title.php vào một thư mục single-product-mock ... ví dụ: single-product-mock/title.php và sau đó bất kỳ lúc nào chúng tôi đang sử dụng một mẫu sản phẩm trong danh mục giả, chúng tôi sẽ chặn cuộc gọi đến mẫu single-product/something.php và chuyển hướng chúng đến single-product-mock/something.phpnếu nó tồn tại và tiếp tục trỏ đến single-product/something.php nếu không. Chúng tôi sẽ thực hiện việc này thông qua bộ lọc 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; 
} 
+0

OMG! Cảm ơn bạn rất nhiều. Đã kết thúc bằng cách sử dụng bộ lọc woocommerce_locate_template. Nó hoạt động tốt :) – user1437251

Các vấn đề liên quan