我正试图使用一个钩子更新WooCommerce中的订单状态,但我收到了一个PHP通知,上面写着

Notice: Function ID was called incorrectly. Order properties should not be accessed directly. auto_complete_specific_product_order, WC_Order->update_status, WC_Order->save, WC_Order->status_transition, do_action('woocommerce_order_status_completed'), WP_Ho in C:\Websites\mysite\www\wp-includes\functions.php on line 5865

这就是我的函数,它似乎正在触发PHP通知.我看不出我到底做错了什么,所以任何建议或建议都将不胜感激.

// Hook the function to the order status change specifically for "completed"
add_action('woocommerce_order_status_completed', 'transfer_product_status_complete', 10, 2);
function transfer_product_status_complete($order_id)
{
    global $wpdb;

    // Retrieve the order
    $order = wc_get_order($order_id);

    // Check if the desired product is in the order
    $found = false;

    foreach ($order->get_items() as $item)
    {
        $product_id = $item->get_product_id();
        
        if ($product_id === 825 || $product_id === 885)
        {
            $found = true;
            break;
        }
    }

    // Execute the code only if the desired product is found
    if ($found)
    {
        // Retrieve the order user ID
        $order = wc_get_order($order_id);
        $new_owner_id = $order->get_user_id();

        // Retrieve and update custom fields when order becomes complete
        $serial_number_transfer = get_post_meta($order_id, 'serial_to_be_transferred', true);

        if (metadata_exists('post', $order_id, 'serial_to_be_transferred'))
        {
            // save the serial number
            update_post_meta($order_id, 'hash_data', $serial_number_transfer);

            // remove the serial from the custom field of the old owner 
            $orders = wc_get_orders(array(
                'customer' => $current_owner_id,
                'limit' => -1, // Retrieve all orders
            ));

            foreach ($orders as $order)
            {
                $order_id_sender = $order->ID;
                $serial_numbers = get_post_meta($order_id_sender, 'hash_data');

                $new_meta_value = str_replace($serial_number_transfer, '', $serial_numbers[0]);

                // Update the post meta with the new value
                update_post_meta($order_id_sender, 'hash_data', $new_meta_value);
            }

            // delete the custom field called serial_to_be_transferred
            delete_post_meta($order_id, 'serial_to_be_transferred');
        }
    }
}

推荐答案

您的代码正在try 访问Order属性,如下所示

$order->id

而不是

$order->get_id()

您需要查看堆栈跟踪,找出发生这种情况的位置,并相应地进行修复.我不知道它是id还是其他属性,因为它不会发生在您共享的代码块中.如果您需要进一步的帮助,您将需要共享更多的代码,特别是在try 直接访问订单属性的情况下.

Php相关问答推荐

419注册期间Laravel 11中的错误

Woocommerce自定义变体html表仅显示带值的列

自定义通知在Woocommerce我的帐户自定义端点页面上不起作用

将带有值的属性添加到WooCommerce产品,保留现有属性

在WooCommerce中禁用客户用户角色的纳税计算

PHP-带POST验证的for循环

如何将隐式乘法添加到PHPPEG基本计算器语法中?

将客户重定向到自定义感谢页后的空白页

Symfony5:如何在不登录的情况下使API路由可访问?

用GUZLE模拟Read_Timeout

WooCommerce中特定付款方式的变更订单预留库存时间

单个产品页面 WooCommerce 订阅价格字符串的更改

多个产品类别 Select 自定义 WooCommerce 插件设置页面

通过ajax发送数据到下拉列表未完全设置为所选

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

Laravel auth()->id() 在生产服务器中不工作

使用 PHP 正则表达式从仅包含具有现有顺序的顶级标签的 XML 文档中搜索和创建数组

Laravel 测试 assertJsonMissing 不适用于唯一的键.为什么?

PHP for each 函数打印 td

正则表达式抓取递归括号的内容