根据Woocommerce

时间:2018-06-02 20:01:16

标签: php wordpress button woocommerce product

我有一个包含父类别和子类别的Woocommerce商店。

例如,父类别是Menswear,它的两个子类别是衬衫和裤子。

我想更改Menswear父类别中所有产品的所有单个产品页面上的“添加到购物车”按钮文本。也就是说,衬衫和裤子子类别中的所有产品。

以下代码实现了这一点,但必须有更好的方法在if语句中使用父类,而不是两个子类。

不幸的是,我不知道该怎么做才有人可以帮忙吗?

add_filter( 'woocommerce_product_single_add_to_cart_text', 'product_cat_single_add_to_cart_button_text', 20, 1 );
function product_cat_single_add_to_cart_button_text( $text ) {

    if( has_term( array('shirts','pants'), 'product_cat') )
        $text = __( 'Buy Menswear', 'woocommerce' );

    return $text;
}

只是为了澄清:

我所希望的是一个解决方案,它使用数组中的父类别(Menswear)而不是子类别Shirts和Pants。在我的网站中,我只有四个父类别,但每个类别都有几十个子类别。我正在寻找一种解决方案,避免必须列出数组中的几十个子类,并且只使用四个父类别。是否可以根据父类别更改添加到购物车文本? (也就是说,属于该父项的子类别中的所有产品都会发生更改。)

进一步澄清:

假设我有四个父类别:红色,黄色,绿色和蓝色。

这些父类别中的每一个都有多个子类别,如下所示:

RED
  Red subcat 1
  Red subcat 2

YELLOW
  Yellow subcat 1
  Yellow subcat 2

GREEN
  Green subcat 1
  Green subcat 2

BLUE
  Blue subcat 1
  Blue subcat 2

我希望Red subcat 1和Red subcat 2中的产品具有添加到购物车文本BUY RED。

我希望黄色子猫1和黄色子猫2中的产品能够添加到购物车文本中购买黄色。

我希望Green subcat 1和Green subcat 2中的产品添加到购物车文本BUY GREEN。

我希望Blue subcat 1和Blue subcat 2中的产品添加到购物车文本BUY BLUE。

在我的实际网站中,每个父类别都有超过50个子类别,因此将这些列为数组是不切实际的。

感谢为什么我正在寻找一种解决方案,根据父类别更改添加到购物车文本。

更新

基于@LoicTheAztec工作代码(谢谢),这是我的最终工作代码:

// Utility function to get the childs array from all parent categories
function get_the_childs( $product_category ){
    $taxonomy = 'product_cat';
    $parent   = get_term_by( 'slug', sanitize_title( $product_category ), $taxonomy );
    return get_term_children( $parent->term_id, $taxonomy );
}

// Changing the add to cart button text for product based on parent category
add_filter( 'woocommerce_product_single_add_to_cart_text', 'product_cat_single_add_to_cart_button_text', 20, 1 );
function product_cat_single_add_to_cart_button_text( $text ) {
    global $product;
    if( has_term( get_the_childs('reds'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Red', 'woocommerce' );
    elseif( has_term( get_the_childs('yellow'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Yellow', 'woocommerce' );
    elseif( has_term( get_the_childs('green'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Green', 'woocommerce' );
    elseif( has_term( get_the_childs('blue'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Blue', 'woocommerce' );

    return $text;
}

进一步更新: 这个解决方案有一个bug。如果其中一个父类别为空,则代码不起作用。

见这里:

Bug in Change Add To Cart button text based on parent product categories in Woo

2 个答案:

答案 0 :(得分:0)

<强>更新

首先,您将在下面找到一个实用程序函数,以从父产品类别中获取子数组。然后你就可以在你的钩子函数中使用它了。

您可以使用不同的文本按钮处理多个父产品类别。

代码:

// Utility function to get the childs array from a parent product category
function get_the_childs( $product_category ){
    $taxonomy = 'product_cat';
    $parent   = get_term_by( 'slug', sanitize_title( $product_category ), $taxonomy );
    return get_term_children( $parent->term_id, $taxonomy );
}

// Changing the add to cart button text
add_filter( 'woocommerce_product_single_add_to_cart_text', 'product_cat_single_add_to_cart_button_text', 20, 1 );
function product_cat_single_add_to_cart_button_text( $text ) {
    global $product;
    if( has_term( get_the_childs('Menswear'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Menswear', 'woocommerce' );
    elseif( has_term( get_the_childs('Womenswear'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Womenswear', 'woocommerce' );
    elseif( has_term( get_the_childs('Childswear'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Childswear', 'woocommerce' );

    return $text;
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。

enter image description here

答案 1 :(得分:0)

感谢@LoicTheAztec的投入。

在编辑了他的代码后,我想出了这个。

经过测试和工作。

// Utility function to get the childs array from all parent categories
function get_the_childs( $product_category ){
    $taxonomy = 'product_cat';
    $parent   = get_term_by( 'slug', sanitize_title( $product_category ), $taxonomy );
    return get_term_children( $parent->term_id, $taxonomy );
}

// Changing the add to cart button text for product based on parent category
add_filter( 'woocommerce_product_single_add_to_cart_text', 'product_cat_single_add_to_cart_button_text', 20, 1 );
function product_cat_single_add_to_cart_button_text( $text ) {
    global $product;
    if( has_term( get_the_childs('reds'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Red', 'woocommerce' );
    elseif( has_term( get_the_childs('yellow'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Yellow', 'woocommerce' );
    elseif( has_term( get_the_childs('green'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Green', 'woocommerce' );
    elseif( has_term( get_the_childs('blue'), 'product_cat', $product->get_id() ) )
        $text = __( 'Buy Blue', 'woocommerce' );

    return $text;
}