Php woocommerce\u order\u item\u meta\u end hook中的get\u cart()方法出错

Php woocommerce\u order\u item\u meta\u end hook中的get\u cart()方法出错,php,wordpress,woocommerce,orders,email-notifications,Php,Wordpress,Woocommerce,Orders,Email Notifications,我有这段代码,它的功能是在woocommerce订单详细信息电子邮件模板中添加一列,但当我发送发票时,会收到以下错误消息: 致命错误:未捕获错误:在第1245行的http:\mysite.com\functions.php中调用null上的成员函数get() 使用此代码时: add_action( 'woocommerce_order_item_meta_end', 'order_custom_field_in_item_meta_end', 10, 4 ); function order_cu

我有这段代码,它的功能是在woocommerce订单详细信息电子邮件模板中添加一列,但当我发送发票时,会收到以下错误消息:

致命错误:未捕获错误:在第1245行的http:\mysite.com\functions.php中调用null上的成员函数get()

使用此代码时:

add_action( 'woocommerce_order_item_meta_end', 'order_custom_field_in_item_meta_end', 10, 4 );
function order_custom_field_in_item_meta_end( $item_id, $item, $order, $cart_item) {
    global $woocommerce;

    do_action( 'woocommerce_review_order_before_cart_contents' );

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );

        if ( $_product && $_product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'woocommerce_checkout_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
            echo '<td class="td">'.$_product->get_price_html().'</td>';
        }
    }

    do_action( 'woocommerce_review_order_after_cart_contents' );

}
add_action('woocmerce_order_item_meta_end','order_custom_field_in_item_meta_end',10,4);
功能订单\自定义\字段\在\项\元\端($item\ id、$item、$order、$cart\项){
全球商业;
do_action('woocommerce_review_order_before_cart_Content');
foreach(WC()->cart->get_cart()作为$cart\u item\u key=>$cart\u item){
$\u product=apply\u过滤器('woocommerce\u cart\u item\u product'、$cart\u item['data']、$cart\u item、$cart\u item\u key);
如果($商品-&$商品->存在()&&$购物车项目['quantity']>0&&应用过滤器('woocommerce\u checkout\u购物车项目\u visible',true,$cart\u项目,$cart\u项目\u key)){
回显“”。$\u产品->获取价格\u html();
}
}
do_action('woocommerce_review_order_after_cart_Content');
}

我这里的问题是,当我从订单发送发票或任何其他电子邮件通知时,它会收到一个错误

我做错了什么,如何解决


谢谢

问题在于,只有在下订单后才会触发“商业\订单\项目\元\端”操作。因此,WC()->cart的作用域不存在于代码段中

您可以使用$order->get_items()获取订单项目

请以这种方式修改代码以使其正常工作

add_action( 'woocommerce_order_item_meta_end', 'order_custom_field_in_item_meta_end', 10, 4 );
function order_custom_field_in_item_meta_end( $item_id, $item, $order) {
    do_action( 'woocommerce_review_order_before_cart_contents' );

    foreach ( $order->get_items() as $cart_item_key => $cart_item ) {
        // Do something here
    }

    do_action( 'woocommerce_review_order_after_cart_contents' );

}

很抱歉,您不能对订单或电子邮件使用购物车对象,因为购物车已在签出中处理并清空。相反,您可以使用函数在挂接到
woocommerce\u order\u item\u meta\u end
时具有的变量参数,它们是
$item\u id
$item
$plain纯文本

这里不需要任何foreach循环来获取订单项数据,因为您可以直接使用参数
$item
来获取产品的ID

以下是适用于简单或可变产品的正确代码(请参见末尾):

add_action('woocmerce_order_item_meta_end','order_custom_field_in_item_meta_end',10,4);
函数顺序\自定义\字段\在\项\元\端($item\ id,$item,$order,$plain\ text){
do_action('woocommerce_review_order_before_cart_Content');
如果($item['variation_id']>0){
$product=wc_get_product($item['variation_id']);//变量产品
}否则{
$product=wc\U get\U product($item['product\U id']);//简单产品
}
//在使用标签之前,确保有相应的“每个成本”列
回显“”。$product->get_price_html();
do_action('woocommerce_review_order_after_cart_Content');
}
如果您的“Cost each”列以前未创建(或定义),则不能使用html
标记

代码位于活动子主题(或主题)的function.php文件或任何插件文件中


代码经过测试并正常工作。

请告诉我您的第1245行的功能。php@DhruvinMoradiya这是一行:foreach(WC()->cart->get\u cart()作为$cart\u item\u key=>$cart\u item){您能告诉我您的要求是什么吗?事实上,只有当我通过订单发送电子邮件发票并将其指向该行时,错误才会发生,我使用了$product->get_cart(),并且它不起作用。我只需要在电子邮件模板上显示每个产品的价格,请参见上图
add_action( 'woocommerce_order_item_meta_end', 'order_custom_field_in_item_meta_end', 10, 4 );
function order_custom_field_in_item_meta_end( $item_id, $item, $order, $plain_text ) {

    do_action( 'woocommerce_review_order_before_cart_contents' );

    if( $item['variation_id'] > 0 ){
        $product = wc_get_product($item['variation_id']); // variable product
    } else {
        $product = wc_get_product($item['product_id']); // simple product 
    }

    // Be sure to have the corresponding "Cost each" column before using <td> tag
    echo '<td class="td">'.$product->get_price_html().'</td>';

    do_action( 'woocommerce_review_order_after_cart_contents' );

}