在WooCommerce中,根据产品自定义字段和产品类别隐藏“添加到购物车”按钮。

5
我想在WooCommerce产品页面后端添加一个自定义复选框,以在前端隐藏“添加到购物车”按钮。我不想完全取消购买该商品的能力(仍希望能够使用直接添加到购物车URL将该商品添加到购物车并购买),因此我不想使用add_filter('woocommerce_is_purchasable', 'my_woocommerce_is_purchasable', 10, 2);或类似的方法。
目前我已经实现的是:
添加自定义复选框
// Display Checkbox
add_action('woocommerce_product_options_general_product_data', 'product_custom_fields_add');
function product_custom_fields_add(){
    global $post;

    echo '<div class="product_custom_field">';

    // Custom Product Checkbox Field
    woocommerce_wp_checkbox( array(
        'id'        => '_no_addcart_product',
        'desc'      => __('show or hide add to cart', 'woocommerce'),
        'label'     => __('Hide Add To Cart', 'woocommerce'),
        'desc_tip'  => 'true'
    ));

    echo '</div>';
}

// Save Checkbox
add_action('woocommerce_process_product_meta', 'product_custom_fields_save');
function product_custom_fields_save($post_id){
    // Custom Product Text Field
    $no_addcart_product = isset( $_POST['_no_addcart_product'] ) ? 'yes' : 'no';
        update_post_meta($post_id, '_no_addcart_product', esc_attr( $no_addcart_product ));
}

根据类别隐藏“添加到购物车”按钮代码片段。
function remove_product_description_add_cart_button(){
    global $product;      
    $category = 'hide';        
    if ( has_term( $category, 'product_cat', $product->id ) )
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
}

add_action('wp','remove_product_description_add_cart_button');

这两个代码单独使用都能正常工作。但是,我试图将它们结合起来,只有在复选框被勾选时才移除添加到购物车按钮(我不需要检查类别)。我编写了下面的代码,希望它能够工作,但实际上并没有。

function remove_product_description_add_cart_button() {
    if ( is_product() && get_post_meta( $post->ID, '_no_addcart_product', true ) == 'yes' ) {
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
}

add_action('wp','remove_product_description_add_cart_button');

非常感谢任何对正确方向的帮助。
1个回答

4
您可以通过关系运算符OR将两个条件组合起来,如下所示:
add_action( 'woocommerce_single_product_summary', 'remove_product_add_to_cart_button', 4 );
function remove_product_add_to_cart_button(){
    global $product;

    $term_slug = 'hide'; // Product category term slug

    if ( has_term( $term_slug, 'product_cat', $product->get_id() ) || $product->get_meta('_no_addcart_product') === 'yes' )
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
}

代码需要放在您的活动子主题(或活动主题)的function.php文件中。它应该有效。

注意:自Woocommerce 3以来,无法直接访问WC_Product 属性,因此您需要使用WC_Product对象$product可用方法

  • 对于产品ID,您将使用get_id()方法,如:$product->get_id()
  • 对于产品自定义元数据,您还可以使用get_meta()方法

感谢您的帮助。我尝试离开产品类别检查并尝试代码,以便仅在复选框处于活动状态时删除按钮,如下所示:add_action( 'woocommerce_single_product_summary', 'remove_product_add_to_cart_button', 4 ); function remove_product_add_to_cart_button(){ global $product; if ( $product->get_meta('_no_addcart_product') === 'yes' ) remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 ); }但它没有起作用。我在这里漏掉了什么? - Acephalia
抱歉,请忽略上一条评论。要离开类别,请查看下面的代码,它可以正常工作:add_action('woocommerce_single_product_summary','remove_product_add_to_cart_button',4); function remove_product_add_to_cart_button(){global $ product; if($ product-> get_meta('_no_addcart_product')=== 'yes')remove_action('woocommerce_single_product_summary','woocommerce_template_single_add_to_cart',30); }再次感谢您的所有帮助! - Acephalia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接