2017-09-11 4 views
1

Je suis aux prises avec une boucle et un type de produit simple/variable dans Woocommerce 3.1.2. Toutes les boucles passent par loop/add-to-cart.php qui est la coutume dans mon thème (pas fait par moi) et va quelque chose comme ceci:La propriété WooCommere product_type retourne simple lorsque le produit est variable

global $product; 

echo '<li class="cart_view">'; 
     echo apply_filters('woocommerce_loop_add_to_cart_link', 
      sprintf('<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" data-quantity="%s" class="button %s product_type_%s">%s</a>', 
       esc_url($product->add_to_cart_url()), 
       esc_attr($product->id), 
       esc_attr($product->get_sku()), 
       esc_attr(isset($quantity) ? $quantity : 1), 
       $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '', 
       esc_attr($product->product_type), 
       esc_html($product->add_to_cart_text()) 
      ), 
     $product); 
     echo '</li>'; 

Tout (ID, href, etc.) fonctionne (correctement?) À l'exception du $product->product_type, qui renvoie simple même si c'est variable. À l'exception d'un produit, qui renvoie une variable.

Je ne peux pas comprendre pourquoi, car il a la même configuration que les autres. L'exécution de la condition simple/variable dans un seul produit fonctionne bien.

J'ai déjà essayé d'autres méthodes telles que has_child() et elles échouent également.

Qu'est-ce qui ne va pas ici? Des idées sur où commencer?


EDIT:get_type() au lieu de product_type() se comporte de la même manière. add_to_cart_text() échoue également, il pourrait donc être autre chose.

+1

avez-vous essayé $ product-> get_type() à la place? [source de ma conjecture] (https://github.com/woocommerce/woocommerce/issues/13142) – Cashbee

Répondre

0

Depuis WooCommerce 3+ propriétés WC_Product ne peuvent pas être directement accessibles:

  • $product->id est remplacé par: $product->get_id()
  • $product->product_type est remplacé par $product->get_type()

Conclusion: Le WooCommerce modèles dans votre thème sont dépassés.
Vous pouvez vérifier que dans WooCommerce Paramètres> État: À la fin de la page dans la section « Modèles », vous pourrez voir ce que les modèles sont obsolètes ...

D'abord, vous devez mettre à jour votre thème la dernière version qui doit être compatible avec WooCommerce 3.1+

documentation officielle: Template Structure + Overriding Templates via a Theme


Essayer de résoudre votre problème:

Dans la sprintf() fonction, lorsque l'on compare le code que vous avez avec le code du modèle de WooCommerce original (loop/add-to-cart.php), la seule différence entre eux est que votre code supprime 'ajax_add_to_cart' à partir de l'attribut class.
Toutes les autres choses sont les mêmes.

Donc il y a 2 façons de le résoudre (en utilisant la dernière mise à jour le code du modèle de WooCommerce):

1. Par WooCommerce Paramètres généraux> Produits> Affichage.

Vous devez désactiver « Activer AJAX ajouter aux boutons de panier sur les archives » et enregistrez (si nécessaire): enter image description here

Et vous aurez juste à ajouter dans le code du modèle d'origine WooCommerce votre html <li> tags:

if (! defined('ABSPATH')) { 
    exit; 
} 

global $product; 

echo '<li class="cart_view">'; 

echo apply_filters('woocommerce_loop_add_to_cart_link', 
    sprintf('<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>', 
     esc_url($product->add_to_cart_url()), 
     esc_attr(isset($quantity) ? $quantity : 1), 
     esc_attr($product->get_id()), 
     esc_attr($product->get_sku()), 
     esc_attr(isset($class) ? $class : 'button'), 
     esc_html($product->add_to_cart_text()) 
    ), 
$product); 

echo '</li>'; 

2. L'autre façon est d'utiliser la fonction PHP str_replace() cette façon:

if (! defined('ABSPATH')) { 
    exit; 
} 

global $product; 

echo '<li class="cart_view">'; 

echo apply_filters('woocommerce_loop_add_to_cart_link', 
    sprintf('<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>', 
     esc_url($product->add_to_cart_url()), 
     esc_attr(isset($quantity) ? $quantity : 1), 
     esc_attr($product->get_id()), 
     esc_attr($product->get_sku()), 
     esc_attr(isset($class) ? str_replace(' ajax_add_to_cart', '', $class) : 'button'), 
     esc_html($product->add_to_cart_text()) 
    ), 
$product); 

echo '</li>'; 

Ceci est testé sur WooCommerce version 3.1+ et fonctionne pour tous les types de produits.

+0

Merci beaucoup Loic! Donnez-moi quelques jours pour mettre à jour le thème et les modèles et revérifier votre solution. C'est vrai qu'ils sont dépassés mais je ne pense pas que ce soit résoudre le problème par lui-même. Avec votre code ci-dessus (même que core et aussi 'str_replace()' + ajax add to cart désactivé), il sélectionne toujours 'product-type-simple' dans le cadre de' $ class' quand il devrait être variable. –

+0

Hola @AlejandroTena ... Je viens juste te voir pour voir si tu as le temps de tester mon code. J'ai d'autres suggestions en cas de ... Vous pouvez me contacter on_Skype chat mon id est 'marsloic' (si nécessaire) et je parle espagnol aussi. – LoicTheAztec