当产品变量为

时间:2017-09-11 14:39:23

标签: php wordpress methods woocommerce product

我在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()也失败了,所以它可能是其他的。

1 个答案:

答案 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;并保存(如有必要)enter image description here

您只需在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+上测试的,适用于所有产品类型。