我在Woocommerce 3.1.2中挣扎着循环和简单/可变的产品类型。所有循环都经过 loop/add-to-cart.php
,这是我主题中的自定义(不是由我制作),并且是这样的:
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>';
所有内容(ID,href等)都正常工作(正确?),$product->product_type
除外,即使它变量也会返回简单。
除了一个产品,它返回变量。我无法理解为什么,因为它与其他设置相同。
在单个产品中执行单个/可变条件可以正常工作。
我已经尝试了其他方法,例如has_child()
,但它们也失败了。
这里可能出现什么问题?关于从哪里开始的任何想法?
编辑: get_type()
代替product_type()
的行为方式相同。 add_to_cart_text()
也失败了,所以它可能是其他的。
答案 0 :(得分:0)
由于WooCommerce 3+ WC_Product属性无法直接访问:
$product->id
被替换为:$product->get_id()
$product->product_type
已被$product->get_type()
结论:主题中的WooCommerce模板已过时。
您可以在WooCommerce设置&gt;中查看状态:在&#34;模板&#34;中的页面末尾部分,您将能够看到哪些模板已过时 ...首先,您应该将主题更新为必须与WooCommerce 3.1 +兼容的最新版本
官方文件:Template Structure + Overriding Templates via a Theme
尝试解决您的问题:
在 sprintf()
功能中,比较您拥有的代码与原始WooCommerce模板代码(loop/add-to-cart.php
)时,唯一的区别它们之间的您的代码正在从'ajax_add_to_cart'
属性中删除class
。
所有其他事情都是一样的。
因此有2种解决方法(使用最新的woocommerce模板代码):
<强> 1。通过WooCommerce一般设置&gt;产品&gt;显示。
您需要停用&#34;启用AJAX添加到档案中的购物车按钮&#34;并保存(如有必要):
您只需在WooCommerce原始模板代码中添加html <li>
标记:
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。另一种方式以这种方式使用PHP函数str_replace()
:
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>';
这是在WooCommerce版本3.1+上测试的,适用于所有产品类型。