禁用特定 WooCommerce 产品的添加到购物车按钮
我正在尝试禁止将某些产品在产品编辑器上勾选了订购单"复选框(请参阅下面的代码).
I'm trying to disable adding to cart certain products which have the "Call to Order" checkbox ticked (see code below) on the product editor.
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' );
}
}
勾选了复选框的产品实际上是不可购买的,这是预期的结果.
The products that have the checkbox ticked, are in fact not purchasable, which is the desired outcome.
我遇到的问题是,当我在产品目录页面上点击添加到购物车"的可购买产品(那些没有勾选复选框的产品)时,我被重定向到产品页面和默认的 WooCommerce 消息对不起,这个产品无法购买."出现.应该发生的是,当单击添加到购物车"按钮时,产品会自动添加到购物车中.
The problem I'm having is when I click "Add to Cart" for purchasable products (those without the checkbox ticked) on the product catalog page, I am redirected to the product page and a default WooCommerce message "Sorry, this product cannot be purchased." appears. What should be happening is that when the "Add to Cart" button is clicked, the product is automatically added to the cart.
同样从单个产品页面,我可以毫无问题地添加可购买的购物车.
Also from the single product page, I can add the purchasable cart without a problem.
我不确定为什么会这样.有任何想法吗?
I am not sure why this is happening this way. Any ideas?
推荐答案
我已经测试了你的代码,它运行没有问题......我没有你描述的有问题的行为......所以其他事情正在制造麻烦强>:
I have tested your code and it work without problems… I don't have the problematic behavior you describe… So something else is making trouble:
您首先需要进行数据库备份...然后您应该尝试:
You will need first to make a database backup… Then you should try to:
- 检查您的其他自定义设置中是否存在禁用 Ajax 添加到购物车并显示该消息的内容.尝试评论您的其他自定义设置以找出有问题的自定义设置.
- 尝试禁用所有与 Woocommerce 相关的第三方插件(Woocommerce 除外).如果问题解决了,再让他们一个一个地重新启用以找到有罪的.
问题也可能来自主题.
现在自从 Woocommerce 3 并引入了 CRUD 对象,你的代码有点过时了.
Now since Woocommerce 3 and introduced CRUD Objects, your code is a bit outdated.
这是重新访问和增强的代码版本(适用于 Woocommerce 3+):
Here is revisited and enhanced code version (for 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 文件中.它可以工作.
Code goes on function.php file of your active child theme (or active theme). It could works.
相关文章