禁用特定 WooCommerce 产品的“添加到购物车”按钮

Posted

技术标签:

【中文标题】禁用特定 WooCommerce 产品的“添加到购物车”按钮【英文标题】:Disabling Add to Cart Button for Specific WooCommerce Products 【发布时间】:2019-08-15 05:39:31 【问题描述】:

我正在尝试禁用将某些产品添加到购物车,这些产品在产品编辑器上勾选了“调用订单”复选框(请参见下面的代码)。

add_action( 'woocommerce_product_options_general_product_data', 'custom_general_product_data_custom_fields' );
/**
 * Add `Call to Order` field in the Product data's General tab.
 */
function custom_general_product_data_custom_fields() 
    // Checkbox.
    woocommerce_wp_checkbox(
        array(
            'id'            => '_not_ready_to_sell',
            'wrapper_class' => 'show_if_simple',
            'label'         => __( 'Call to Order', 'woocommerce' ),
            'description'   => __( '', 'woocommerce' )
            )
    );


add_action( 'woocommerce_process_product_meta', 'custom_save_general_proddata_custom_fields' );
/**
 * Save the data values from the custom fields.
 * @param  int $post_id ID of the current product.
 */
function custom_save_general_proddata_custom_fields( $post_id ) 
    // Checkbox.
    $woocommerce_checkbox = isset( $_POST['_not_ready_to_sell'] ) ? 'yes' : 'no';
    update_post_meta( $post_id, '_not_ready_to_sell', $woocommerce_checkbox );


add_filter( 'woocommerce_is_purchasable', 'custom_woocommerce_set_purchasable', 10, 2);
/**
 * Mark "Not ready to sell" products as not purchasable.
 */
function custom_woocommerce_set_purchasable() 
    $not_ready_to_sell = get_post_meta( get_the_ID(), '_not_ready_to_sell' , true);

    return ( 'yes' == $not_ready_to_sell ? false : true );



add_filter( 'woocommerce_product_add_to_cart_text', 'custom_product_add_to_cart_text' );
/**
 * Change "Read More" button text for non-purchasable products.
 */
function custom_product_add_to_cart_text() 
    $not_ready_to_sell = get_post_meta( get_the_ID(), '_not_ready_to_sell', true );

    if ( 'yes' === $not_ready_to_sell ) 
        return __( 'Call to Order', 'woocommerce' );
     else 
        return __( 'Add to Cart', 'woocommerce' );
    

勾选了复选框的产品实际上是不可购买的,这是预期的结果。

我遇到的问题是,当我在产品目录页面上为可购买的产品(没有勾选复选框的产品)单击“添加到购物车”时,我被重定向到产品页面和默认的 WooCommerce 消息“对不起,这个无法购买产品。”出现。应该发生的是,当单击“添加到购物车”按钮时,产品会自动添加到购物车中。

同样从单个产品页面,我可以毫无问题地添加可购买的购物车。

我不确定为什么会这样。有任何想法吗?

【问题讨论】:

【参考方案1】:

我已经测试了你的代码,它可以正常工作……我没有你描述的问题行为……所以其他问题正在制造麻烦

你需要先做一个数据库备份……然后你应该尝试:

    检查您的其他自定义项中是否存在禁用 Ajax 添加到购物车并显示该消息的内容。尝试评论您的其他自定义设置以找出错误。 尝试禁用所有与 Woocommerce 相关的第三方插件(Woocommerce 除外)。如果问题消失了,再让他们一一找出罪魁祸首。

问题也可能来自主题。


现在因为Woocommerce 3 and introduced CRUD Objects,您的代码有点过时了。

这里是重新访问和增强的代码版本(适用于 Woocommerce 3+):

// Add a custom field in the Product data's General tab (for simple products).
add_action( 'woocommerce_product_options_general_product_data', 'add_general_product_data_custom_field' );
function add_general_product_data_custom_field() 
    woocommerce_wp_checkbox( array( // Checkbox.
        'id'            => '_not_ready_to_sell',
        'label'         => __( 'Call to Order', 'woocommerce' ),
        'wrapper_class' => 'show_if_simple',
    ) );


// Save custom field value
add_action( 'woocommerce_admin_process_product_object', 'save_general_product_data_custom_field', 10, 1 );
function save_general_product_data_custom_field( $product ) 
    $product->update_meta_data( '_not_ready_to_sell', isset( $_POST['_not_ready_to_sell'] ) ? 'yes' : 'no' );


// Make not purchasable, products with '_not_ready_to_sell' meta data set to "yes" (for simple products)
add_filter( 'woocommerce_is_purchasable', 'filter_woocommerce_set_purchasable', 10, 2);
function filter_woocommerce_set_purchasable( $purchasable, $product ) 
    return 'yes' === $product->get_meta( '_not_ready_to_sell' ) && $product->is_type('simple') ? false : $purchasable;



// Change button text to "Call to Order" for simple products not purchasable.
add_filter( 'woocommerce_product_add_to_cart_text', 'filter_product_add_to_cart_text', 10, 2 );
function filter_product_add_to_cart_text( $button_text, $product ) 
    if ( 'yes' === $product->get_meta( '_not_ready_to_sell' ) && $product->is_type('simple') ) 
        $button_text =  __( 'Call to Order', 'woocommerce' );
    
    return $button_text;

代码在您的活动子主题(或活动主题)的 function.php 文件中。它可以工作。

【讨论】:

我添加了你的代码而不是我的,它可以工作!!我在sridharkatakam.com/… 上面找到了 sn-p,所以对于 WooCommerce 3.0+ 来说可能有点过时了。谢谢你的帮助!真的很感激!

以上是关于禁用特定 WooCommerce 产品的“添加到购物车”按钮的主要内容,如果未能解决你的问题,请参考以下文章

隐藏产品价格并禁用 Woocommerce 中特定产品类别的添加到购物车

在 Woocommerce 中根据 IP 地址(GeoLocation)更改添加到购物车按钮

在woocommerce中禁用一种产品的购买

禁用在Woocommerce中编辑特定的管理员自定义字段

通过 WooCommerce 产品设置中的自定义复选框禁用添加到购物车按钮

在 WooCommerce 中根据产品类型隐藏付款方式