Woocommerce 未捕获错误:在null上调用成员函数get_cart()

Woocommerce 未捕获错误:在null上调用成员函数get_cart(),woocommerce,Woocommerce,在Woocommerce上,我的函数上有一条错误消息,但我不明白为什么会发生这种情况 未捕获错误:在中调用null上的成员函数get_cart()。。。 该函数检查购物车中的类别产品id 该错误显示在后端的订单详细信息中 它在functions.php中使用,在签出页面上执行, 由这些钩子调用: 订单前的商业票据 woocommerce\u checkout\u流程 woocommerce\u结帐\u更新\u订单\u元 woocommerce\u admin\u order\u data\u a

在Woocommerce上,我的函数上有一条错误消息,但我不明白为什么会发生这种情况

未捕获错误:在中调用null上的成员函数get_cart()。。。 该函数检查购物车中的类别产品id

该错误显示在后端的订单详细信息中

它在functions.php中使用,在签出页面上执行, 由这些钩子调用: 订单前的商业票据 woocommerce\u checkout\u流程 woocommerce\u结帐\u更新\u订单\u元 woocommerce\u admin\u order\u data\u after\u billing\u address woocommerce\u电子邮件\u订单\u元密钥

函数在购物车()中{
$found=false;
//查找产品是否位于购物车价格购物车->获取购物车()作为$cart\u item\u key=>$value)
{
$cart_product=$values['data'];
$price=accessProtected($value['data'],'changes')['price'];
如果($price>=40&&$cart\u product->id==969'){$found=true;}
}
如有($已找到){
返回true;
}否则{
返回false;
}
}
添加操作('woocommerce\u checkout\u process'、'wps\u select\u checkout\u field\u process');
函数wps_选择_签出_字段_进程(){
如果(是否在购物车()中)
{
全球商业;
//检查是否已设置,如果未设置,则添加错误。
如果($_POST['dvd']=“空白”)
wc_添加_通知(“Merci de séléctionner联合国DVD”,“错误”);
}
}
//*使用字段值更新订单元
添加操作(“woocommerce\u checkout\u update\u order\u meta”、“wps\u select\u checkout\u field\u update\u order\u meta”);
函数wps\u选择\u签出\u字段\u更新\u订单\u元($order\u id){
如果(是否在购物车()中)
{
如果($发布['dvd'])更新发布元数据($订单id,'dvd',esc属性($发布['dvd']);
}
}
添加操作('woocommerce\u admin\u order\u data\u after\u billing\u address','wps\u select\u checkout\u field\u display\u admin\u order\u meta',10,1);
功能wps\u选择\u签出\u字段\u显示\u管理\u订单\u元($order){
如果(是否在购物车()中)
{
回显“DVD:”。获取“post”meta($order->id,“DVD”,true)。“

”; } } //*将选择字段值添加到电子邮件 添加过滤器(“woocommerce\u email\u order\u meta\u keys”、“wps\u select\u order\u meta\u keys”); 功能wps\u选择\u顺序\u元\u键($keys){ 如果(是否在购物车()中) { $keys['Dvd:']='Dvd'; 返回$keys; } }
我想你应该检查一下,确保购物车在开始工作之前没有空着

还有。。。您可以使用
get_price()
从您正在使用
$values['data']检索的产品对象访问价格

函数在购物车()中{
//确保它只在前端
如果(is_admin())返回false;
$found=false;
//如果购物车为空-保释并返回false
如果(空(WC()->cart->get_cart()){
返回false;
}否则{
foreach(WC()->cart->get_cart()作为$cart\u item\u key=>$value){
$cart_product=$values['data'];
//查找产品是否在购物车价格中获取价格();
如果($price>=40&&$cart\u product->id=='969'){
$found=true;
}
}
如有($已找到){
返回true;
}否则{
返回false;
}
}
}

已更新-添加了
是为了防止在后端运行。

在哪里使用该代码?你什么时候展示结果?在哪一页?用哪一个钩子?好的问题编辑了空条件。关于get_price它不是一个好属性,因为我使用WC name your price,而且价格是动态的,所以我保留了获取它的方法。empty()比is_null()更好吗?
get_cart()以数组形式返回购物车的内容。woocommerce/includes/class wc cart.php:604
所以返回的不是null。所以最好使用empty()?当我遇到错误时,购物车不是空的,因为订单已经完成
function is_in_the_cart() {

    $found=false;

// Find if product is in the cart price <=40
    foreach( WC()->cart->get_cart() as $cart_item_key => $values )
 {
        $cart_product = $values['data'];
        $price = accessProtected($values['data'], 'changes')['price'];
        if ($price >=40 && $cart_product->id=='969') {$found=true;}
  }


if ( $found ) {
        return true;
    } else {
        return false;
    }
}



     add_action('woocommerce_checkout_process', 'wps_select_checkout_field_process');
     function wps_select_checkout_field_process() {
         if (is_in_the_cart())
    {
        global $woocommerce;

        // Check if set, if its not set add an error.
        if ($_POST['dvd'] == "blank")
         wc_add_notice( '<strong>Merci de séléctionner un DVD</strong>', 'error' );
    }
     }

     //* Update the order meta with field value
     add_action('woocommerce_checkout_update_order_meta', 'wps_select_checkout_field_update_order_meta');
     function wps_select_checkout_field_update_order_meta( $order_id ) {
         if (is_in_the_cart())
    {
       if ($_POST['dvd']) update_post_meta( $order_id, 'dvd', esc_attr($_POST['dvd']));
    }
     }


     add_action( 'woocommerce_admin_order_data_after_billing_address', 'wps_select_checkout_field_display_admin_order_meta', 10, 1 );
    function wps_select_checkout_field_display_admin_order_meta($order){
         if (is_in_the_cart())
    {
        echo '<p><strong>DVD: </strong> ' . get_post_meta( $order->id, 'dvd', true ) . '</p>';
    }
    }

    //* Add selection field value to emails
    add_filter('woocommerce_email_order_meta_keys', 'wps_select_order_meta_keys');
    function wps_select_order_meta_keys( $keys ) {
         if (is_in_the_cart())
    {
        $keys['Dvd:'] = 'dvd';
        return $keys;
        }
    }