Woocommerce 未捕获错误:在null上调用成员函数get_cart()
在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元密钥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
函数在购物车()中{
$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;
}
}