2014-08-29 27 views
9

Tôi đang sử dụng phần mở rộng [Tiện ích mở rộng sản phẩm] [1] cho WooCommerce, cho phép các trường tùy chỉnh cho sản phẩm. Điều này tự động hiển thị trên một mẫu sản phẩm duy nhất.WooCommerce: Cách hiển thị các trường từ tiện ích "Tiện ích mở rộng sản phẩm"?

Bằng một số thử nghiệm và lỗi với mẫu sản phẩm đơn lẻ, nó xuất hiện để móc ở đâu đó trong woocommerce_single_product_summary (single_meta?).

Tôi cần nhận cùng một tập hợp các trường biểu mẫu này để hiển thị trên mẫu archive-product (danh sách sản phẩm). Trong trường hợp của tôi, đây là một trường cho một yêu cầu thẻ và một cho ngày giao hàng. Cả hai đều cần thiết trước khi sản phẩm có thể được thêm vào giỏ hàng từ kho lưu trữ sản phẩm. Tôi không chắc chắn nếu có một chức năng tôi có thể gọi cho điều này, nếu nó liên quan đến một số mã hóa tiên tiến hơn.


câu trả lời mỗi Pelmered, tôi đã có thể để có được những add-on lĩnh vực xuất hiện với việc thêm này để functions.php:

add_action('woocommerce_after_shop_loop_item_title', array($GLOBALS['Product_Addon_Display'], 'display'), 10);

1ST mưu toan

Sau đó, vấn đề là kho lưu trữ sản phẩm không tạo ra một phần tử biểu mẫu, chỉ là một liên kết neo cho nút thêm vào giỏ hàng. Vì vậy, tôi đã thử đặt thủ công một biểu mẫu. Mã số từ content-product.php:

<?php do_action('woocommerce_before_shop_loop_item'); ?> 
<h2><?php the_title(); ?></h2> 

<?php // MANUALLY PUT IN FORM, BECAUSE HOOKS ONLY PUT IN A BUTTON AND NO FORM. NEEDED FOR ADD-ON FIELDS ?> 
<form class="cart" method="post" enctype='multipart/form-data'> 
    <?php 
     /** 
     * woocommerce_after_shop_loop_item_title hook 
     * 
     * @hooked woocommerce_template_loop_rating - 5 
     * @hooked woocommerce_template_loop_price - 10 
     */ 
     do_action('woocommerce_after_shop_loop_item_title'); 
    ?>   
    <div itemprop="description"> 
     <?php the_content(); ?> 
    </div> 
    <input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>" /> 
    <button type="submit" class="single_add_to_cart_button button alt"><?php echo $product->single_add_to_cart_text(); ?></button> 
</form> 

<?php //do_action('woocommerce_after_shop_loop_item'); ?> 

Điều này đã làm việc, nhưng loại bỏ sự gửi AJAX và tin nhắn flash. Sau khi nhấp vào nút thêm vào giỏ hàng, trang xuất hiện để làm mới và sau đó có vẻ như không có gì xảy ra. Nhưng khi bạn đi đến một trang khác, nó sẽ hiển thị các tin nhắn (và nhiều có thể ngăn xếp).

2ND mưu toan

Vì vậy, tôi thấy rằng các giỏ nút AJAX gốc (không nằm trong một hình thức) đã sử dụng một chuỗi truy vấn để gửi ID sản phẩm. Vì vậy, bây giờ tôi đang cố gắng để tack vào các thông số bổ sung bằng cách sửa đổi thêm vào giỏ hàng JS. Điều này làm việc. Những gì tôi đã thêm vào làm câu trả lời được chấp nhận.

+1

Câu trả lời từ hỗ trợ WooCommerce là "tùy biến này không được bảo hiểm theo chính sách hỗ trợ của chúng tôi". Thực sự cần một giải pháp cho việc này. – jwinn

Trả lời

4

Tôi đã tìm thấy giải pháp hoạt động, sử dụng jQuery để thêm các giá trị trường biểu mẫu vào yêu cầu AJAX. Điều này đòi hỏi phải ghi đè add-to-cart.js bằng phiên bản của riêng bạn, vì vậy các bản cập nhật trong tương lai cho tệp đó có thể cần phải được hợp nhất.

Trong các chức năng.php

// display add-on fields in woocommerce_after_shop_loop_item_title 
add_action('woocommerce_after_shop_loop_item_title', array($GLOBALS['Product_Addon_Display'], 'display'), 10); 

// Our custom cart JS to allow for product add-on fields on product archive 
add_action('wp_enqueue_scripts', 'load_woo_scripts', 9); 
function load_woo_scripts() { 
    wp_enqueue_script('wc-add-to-cart', get_template_directory_uri() . '/js/add-to-cart.js', array('jquery'), WC_VERSION, true); 
} 

Duplicate /assets/add-to-cart.js từ thư mục woocommerce plugin, và thêm vào thư mục tham chiếu trong load_woo_scripts. Sau đó, thêm thông tin sau đây sau câu lệnh var date = { (dòng 21).

// ========================================================================= 
// ADD PRODUCT ADD-ON FIELDS TO SUBMISSION (to allow from product archive) 
// Store name and value of fields in object. 
var addonfields = {}; 
$(this).parent().find(".after-shop-loop-item-title :input").each(function() { 
    addonfields[this.name] = $(this).val(); 
}); 

// Merge new fields and existing data 
data = $.extend(data, addonfields); 

// Testing: final value of data 
console.log(data); 
// ========================================================================= 

Điều này sẽ thêm tên và giá trị của tất cả các trường nhập trong div .after-shop-loop-item-title. Tôi đã thêm div này/lớp mẫu woocommerce/content-product.php chủ đề của tôi:

<?php do_action('woocommerce_before_shop_loop_item'); ?> 
<h2><?php the_title(); ?></h2> 
<div itemprop="description"> 
    <?php the_content(); ?> 
</div> 

<div class="after-shop-loop-item-title"> 
    <?php 
     /** 
     * woocommerce_after_shop_loop_item_title hook 
     * 
     * @hooked woocommerce_template_loop_rating - 5 
     * @hooked woocommerce_template_loop_price - 10 
     */ 
     do_action('woocommerce_after_shop_loop_item_title'); 
    ?> 
</div> 

<?php do_action('woocommerce_after_shop_loop_item'); ?> 

Lưu ý rằng trong trường hợp của tôi, tôi chỉ sử dụng một textarea và nhập văn bản. Không thay đổi giá. Việc sử dụng nâng cao hơn của tiện ích mở rộng có thể yêu cầu nhiều công việc hơn.

Tôi thực sự hy vọng rằng WooCommerce làm trong tương lai dễ dàng hơn này ...

3

Không thể cung cấp cho bạn giải pháp sao chép chính xác mà không cần truy cập vào mã, nhưng có thể đính kèm cùng một chức năng đang được nối.

Các móc có thêm này đến trang sản phẩm duy nhất có thể trông như thế này:

add_action('woocommerce_single_product_summary', array($this, 'woocommerce_product_add_ons_something')); 

Để đính kèm hành động này để mẫu đạt được cũng có lẽ bạn nên có thể làm một cái gì đó như thế này:

add_action('woocommerce_after_shop_loop_item_title', array('WC_Product_Add_On', 'woocommerce_product_add_ons_something')); 

WC_Product_Add_On là tên lớp của plguin và cần được thay đổi để phù hợp với lớp có chức năng/phương pháp trong hành động. Đặt mã này vào tệp functions.php trong chủ đề của bạn.

Kiểm tra xem nó có hoạt động hay không. Nếu không, hãy cho tôi thêm thông tin và tôi có thể mở rộng câu trả lời của mình.

+0

Cảm ơn thông tin đúng hướng. Tôi đã cập nhật câu hỏi của mình với mã và tôi đang ở đâu. – jwinn

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