【问题标题】:Hide Add To Cart Button based on product custom field and product category in WooCommerce根据 WooCommerce 中的产品自定义字段和产品类别隐藏添加到购物车按钮
【发布时间】:2019-02-23 10:04:46
【问题描述】:

我想在 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 ));
}

还有一个隐藏添加到购物车按钮,具体取决于类别 sn-p。

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');

非常感谢您在正确方向上的任何帮助。

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    您可以通过这种方式将这两个条件与关系 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 properties 无法直接访问,因此您需要将 available methodsWC_Product 对象$product

    • 对于产品 ID,您将使用 get_id() 方法,例如:$product-&gt;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-&gt;get_meta('_no_addcart_product') === 'yes' ) remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 ); } 但它不起作用。我会在这里错过什么?
    • 道歉。请丢弃最后一条评论。要离开类别,请查看以下代码:add_action( 'woocommerce_single_product_summary', 'remove_product_add_to_cart_button', 4 ); function remove_product_add_to_cart_button(){ global $product; if ( $product-&gt;get_meta('_no_addcart_product') === 'yes' ) remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 ); } 再次感谢您的帮助!
    猜你喜欢
    • 2020-09-01
    • 2016-04-05
    • 2019-12-13
    • 2018-02-10
    • 1970-01-01
    • 2023-04-07
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多