如何避免 PHP 注意:在 wp_loaded 操作之前不应调用 Get cart

问题描述 投票:0回答:1

我想在 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',... 但无法解决问题。所以有什么想法吗?谢谢。

php wordpress woocommerce hook-woocommerce cart
1个回答
0
投票

要解决此问题,请尝试以下修改和优化的代码替换:

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

应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.