我想在 woocommerce 结帐页面中仅对“lms”类别中的产品进行电话 OTP 验证,然后我创建以下片段:
function hkioh_is_lms_product_in_cart() {
global $woocommerce;
if (! $woocommerce->cart)
return false;
if ( $woocommerce->cart->is_empty())
return false;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $cart_item)
{
$product_id = $cart_item['data']->get_id();
$categories = get_the_terms($product_id, 'product_cat');
if (is_array($categories))
{
foreach ($categories as $category)
{
if ($category->slug === 'lms')
{
return true;
}
}
}
}
return false;
}
add_filter( 'xoo_ml_get_phone_forms', function( $forms ){
if( !hkioh_is_lms_product_in_cart() ){
foreach ($forms as $index => $data) {
if( $data['key'] === 'woocommerce-process-checkout-nonce' ){
unset($forms[$index]);
}
}
}
return $forms;
} );
add_action( 'wp', function(){
if( !is_checkout() || hkioh_is_lms_product_in_cart() ) return;
remove_filter( 'woocommerce_form_field', array( xoo_ml_phone_frontend(), 'wc_checkout_otp_field_html' ), 10, 4 );
remove_filter( 'woocommerce_checkout_fields' , array( xoo_ml_phone_frontend(), 'wc_checkout_add_otp_field' ), 9999 );
} );
它有效,但 debug.log 不断给我以下通知:
[2023 年 11 月 26 日 06:17:33 UTC] get_cart 被错误调用。不应在 wp_loaded 操作之前调用获取购物车。回溯: require_once('wp-load.php'), require_once('wp-config.php'), require_once('wp-settings.php'), do_action('init'), WP_Hook->do_action, WP_Hook-> apply_filters, Xoo_Ml_Phone_Verification->request_otp, Xoo_Ml_Phone_Verification::is_a_phone_form, apply_filters('xoo_ml_get_phone_forms'), WP_Hook->apply_filters, {closure}, hkioh_is_lms_product_in_cart, WC_Cart->is_empty, WC_Cart->get_cart, wc_doing_it_wrong。此消息是在 2.3 版本中添加的。
我尝试将 add_action( 'wp', ... 更改为 add_action('wp_loaded',... 但无法解决问题。所以有什么想法吗?谢谢。
要解决此问题,请尝试以下修改和优化的代码替换:
function hkioh_is_lms_product_in_cart() {
if ( WC()->cart->is_empty() )
return false;
foreach ( WC()->cart->get_cart() as $item ) {
if ( has_term('lms', 'product_cat', $item['product_id']) ) {
return true;
}
}
return false;
}
add_filter( 'xoo_ml_get_phone_forms', function( $forms ){
if( !hkioh_is_lms_product_in_cart() ){
foreach ($forms as $index => $data) {
if( $data['key'] === 'woocommerce-process-checkout-nonce' ){
unset($forms[$index]);
}
}
}
return $forms;
} );
// Early hook targeting checkout page
add_action( 'woocommerce_checkout_init', function(){
if( ! hkioh_is_lms_product_in_cart() ) {
remove_filter( 'woocommerce_form_field', array( xoo_ml_phone_frontend(), 'wc_checkout_otp_field_html' ), 10, 4 );
remove_filter( 'woocommerce_checkout_fields' , array( xoo_ml_phone_frontend(), 'wc_checkout_add_otp_field' ), 9999 );
}
} );
应该可以。