在WooCommerce Checkout中删除一些基于虚拟产品的挂钩函数 [英] Remove some hooked functions based on virtual products in WooCommerce Checkout
问题描述
当购物车中只有虚拟产品时,我想在结帐页面上删除一些信息.
I want to remove some information on checkout page when there is only virtual products in cart.
以下内容是我要在结帐页面上删除的内容:
The following is removing what I want on checkout page:
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_checkout_privacy_policy_text', 20 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_terms_and_conditions_page_content', 30 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'woocontracts_terms_fields', );
remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
remove_action( 'woocommerce_checkout_after_terms_and_conditions', 'woocontracts_checkout_additional_checkboxes', 10 );
remove_action( 'woocommerce_checkout_process', 'woocontracts_checkout_field_process', 10 );
当购物车中只有虚拟产品时,该如何做?
how to make the same when there is only virtual products in cart?
我尝试了以下内容:
add_filter( 'woocommerce_checkout_after_terms_and_conditions' , 'bbloomer_simplify_checkout_virtualab' );
function bbloomer_simplify_checkout_virtualab( $fields ) {
$only_virtual = true;
foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
// Check if there are non-virtual products
if ( ! $cart_item['data']->is_virtual() ) $only_virtual = false;
}
if( $only_virtual ) {
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_checkout_privacy_policy_text', 20 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_terms_and_conditions_page_content', 30 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'woocontracts_terms_fields', );
remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
return $fields;
}
return $fields;
}
但是它不起作用.有什么建议吗?
But it doesn't work. Any suggestions?
推荐答案
更新2 -在这种情况下使用的正确钩子是 woocommerce_checkout_init
动作钩子:
Update 2 - The right hook to use in this case is woocommerce_checkout_init
action hook:
// Custom conditional function that checks if there is only virtual items in cart
function has_only_virtual_items_in_cart(){
$only_virtual = true;
// Check if there are non-virtual items in cart
foreach( WC()->cart->get_cart() as $cart_item ) {
if ( ! $cart_item['data']->is_virtual() ) {
$only_virtual = false;
break;
}
}
return $only_virtual;
}
// Unhook some functions conditionally
add_action( 'woocommerce_checkout_init', 'simplify_checkout_for_virtual_items_only' );
function simplify_checkout_for_virtual_items_only() {
if( has_only_virtual_items_in_cart() ) {
remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_checkout_privacy_policy_text', 20 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_terms_and_conditions_page_content', 30 );
remove_action( 'woocommerce_checkout_terms_and_conditions', 'woocontracts_terms_fields' ); // <== missing priority
remove_action( 'woocommerce_checkout_after_terms_and_conditions', 'woocontracts_checkout_additional_checkboxes', 10 );
}
}
代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试,可以正常工作.
Code goes in function.php file of your active child theme (or active theme). Tested and works.
然后,您可以在
woocommerce_checkout_field_process()
函数中重新使用自定义的常规函数has_only_virtual_items_in_cart()
.
Then you can reuse the custom contional function
has_only_virtual_items_in_cart()
insidewoocontracts_checkout_field_process()
function hooked inwoocommerce_checkout_process
hook.
这篇关于在WooCommerce Checkout中删除一些基于虚拟产品的挂钩函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!