2014-08-29 15 views
9

Używam rozszerzenia [Product Add-ons] [1] dla WooCommerce, które umożliwia niestandardowe pola dla produktów. To automatycznie wyświetla się w szablonie pojedynczego produktu.WooCommerce: Jak wyświetlać pola z rozszerzenia "Product Add-ons"?

Przez próbę i błąd w szablonie pojedynczego produktu, wygląda na to, że hakuje gdzieś w woocommerce_single_product_summary (single_meta?).

Potrzebuję uzyskać ten sam zestaw pól formularza, aby wyświetlić szablon archive-product (lista produktów). W moim przypadku jest to pole dla wniosku o kartę i jeden dla daty dostawy. Oba są potrzebne, zanim produkt zostanie dodany do koszyka z archiwum produktu. Nie jestem pewien, czy istnieje funkcja, którą mogę wzywać do tego, jeśli wiąże się to z bardziej zaawansowanym kodowaniem.


ODPOWIEDŹ W Pelmered za, udało mi się dostać dodatek na polach, aby pokazać się z dodanie tego do functions.php:

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

1. podejściu

Następnie, Problem polegał na tym, że archiwum produktów nie tworzyło elementu formularza, a jedynie link do zakotwiczenia przycisku Dodaj do koszyka. Próbowałem więc ręcznie wstawić formularz. Kod z 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'); ?> 

To działało, ale swego rodzaju bałagan wiadomości Składanie i flash, AJAX. Po kliknięciu przycisku Dodaj do koszyka strona wygląda na odświeżoną, a następnie wygląda na to, że nic się nie stało. Ale kiedy przejdziesz do innej strony, wyświetla ona komunikaty (i wiele może się układać).

2. podejściu

Tak widziałem, że oryginalny AJAX Przycisk koszyk (nie w formie) został przy użyciu ciąg kwerendy wysłać identyfikator produktu. Tak więc próbuję teraz dostosować dodatkowe parametry, modyfikując JS dodawany do koszyka. To zadziałało. Co dodałem jako zaakceptowaną odpowiedź.

+1

Odpowiedzią ze wsparcia woocommerce było „to dostosowanie nie jest objęty naszą polityką wsparcia”. Naprawdę potrzebuję rozwiązania tego. – jwinn

Odpowiedz

4

Znalazłem rozwiązanie, które działa, za pomocą jQuery, aby dodać wartości pola formularza do żądania AJAX. Wymaga to nadpisania pliku add-to-cart.js z własną wersją, więc przyszłe aktualizacje tego pliku mogą wymagać scalenia.

W funkcjach.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); 
} 

Duplikat /assets/add-to-cart.js z folderu wtyczek woocommerce i dodać do folderu mowa w load_woo_scripts. Następnie dodaj po instrukcji var date = { (wiersz 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); 
// ========================================================================= 

Dodaje nazwy i wartości wszystkich pól wejściowych w przedziale .after-shop-loop-item-title div. Dodałem ten div/klasę do mojego motywu woocommerce/content-product.php szablonu:

<?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'); ?> 

pamiętać, że w moim przypadku, ja tylko używam textarea i wprowadzania tekstu. Żadne z nich nie zmienia ceny. Bardziej zaawansowane użycie rozszerzenia może wymagać więcej pracy.

Naprawdę mam nadzieję, że to sprawia, że ​​łatwiej woocommerce w przyszłości ...

3

Nie można podać dokładnego rozwiązania do kopiowania i wklejania bez dostępu do kodu, ale powinno być możliwe podłączenie tej samej funkcji, która jest podłączana.

Hak że dodaje to do strony, pojedynczy produkt prawdopodobnie wygląda tak:

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

Aby dołączyć tę czynność do achive szablonie także powinieneś być w stanie zrobić coś takiego:

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

WC_Product_Add_On to nazwa klasy plagina i należy ją zmienić, aby była zgodna z klasą, która ma funkcję/metodę w akcji. Umieść ten kod w pliku functions.php w motywie.

Sprawdź, czy to działa. Jeśli nie, daj mi więcej informacji i mogę poszerzyć moją odpowiedź.

+0

Dzięki za informacje we właściwym kierunku. Zaktualizowałem moje pytanie za pomocą kodu i miejsca, w którym się znajduję. – jwinn

Powiązane problemy