使用自定义挂钩时删除了 WooCommerce 自定义订单项键

时间:2021-05-13 20:24:42

标签: php wordpress woocommerce

我需要你的帮助,因为我不明白我在做什么了。目前,我正在向 woocommerce_reduce_order_stock 钩子内的任何订单项添加自定义元数据:

add_action( 'woocommerce_reduce_order_stock', 'woocommerce_reduce_order_stock_action', 10, 1 );
function woocommerce_reduce_order_stock_action( WC_Order $order ): void {
    $order_items = $order->get_items();

    if ( empty( $order_items ) ) {
        return;
    }

    foreach ( $order_items as $order_item ) {
        $data[20] = [
            'number' => 'ABC-2',
            'qty'    => 20
        ];

        $order_item->update_meta_data( '_test_data', $data );
        $order_item->save();
    }
}

因为我想在每个订单项元(邮件、帐户....)中显示我的自定义元,所以我在这里使用这个函数:

add_filter( 'woocommerce_order_item_get_formatted_meta_data', 'filter_woocommerce_order_item_get_formatted_meta_data', 10, 2 );
function filter_woocommerce_order_item_get_formatted_meta_data( array $formatted_meta, WC_Order_Item $order_item ): array {
    if ( $order_item === null ) {
        return $formatted_meta;
    }

    $data = $order_item->get_meta( '_test_data' );

    if ( ! empty( $data ) ) {
        foreach ( $data as $data_set ) {
            $value = $data_set['number'] . ' (' . $data_set['qty'] . 'x)';

            $formatted_meta[] = (object) [
                'key'           => 'test',
                'display_key'   => 'Test',
                'value'         => $value,
                'display_value' => '<p>' . $value . '</p>'
            ];
        }
    }

    return $formatted_meta;
}

到目前为止一切顺利。现在我使用另一个钩子再次删除自定义元数据,当股票恢复时(可以通过将订单设置为取消来触发):

add_action( 'woocommerce_restore_order_stock', 'woocommerce_restore_order_stock_action', 10, 1 );
function woocommerce_restore_order_stock_action( $order ): void {
    $order_items = $order->get_items();

    if ( empty( $order_items ) ) {
        return;
    }
    error_log( print_r( $order_items, true ) );

    foreach ( $order_items as $order_item ) {
        if ( $order_item === null || ! is_object( $order_item ) ) {
            continue;
        }

        $data = $order_item->get_meta( '_test_data' );

        error_log( print_r( $data, true ) );

        $order_item->delete_meta_data( '_test_data' );
        $order_item->save();
    }
}

现在奇怪的是,当设置了元显示过滤器 woocommerce_order_item_get_formatted_meta_data 时,删除不起作用。在这种情况下,自定义元数据以某种方式发生了变化,正如您在此处的日志记录中所看到的:

[7] => WC_Meta_Data Object
    (
        [current_data:protected] => Array
            (
                [id] => 3265
                [key] => test
                [value] => ABC-3 (3x)
            )
        [data:protected] => Array
            (
                [id] => 3265
                [key] => test
                [value] => ABC-3 (3x)
            )
    )

当我禁用过滤器钩子时,我会找回正确的元数据并且可以删除它:

[9] => WC_Meta_Data Object
    (
        [current_data:protected] => Array
            (
                [id] => 3267
                [key] => _test_data
                [value] => Array
                    (
                        [9] => Array
                            (
                                [number] => ABC-3
                                [qty] => 3
                            )
                    )
            )
        [data:protected] => Array
            (
                [id] => 3267
                [key] => _test_data
                [value] => Array
                    (
                        [9] => Array
                            (
                                [number] => ABC-3
                                [qty] => 3
                            )
                    )
            )
    )

为什么?我完全糊涂了,调试了两个小时也没找到原因...

编辑

不要被元ID混淆...我在这里使用了两个订单,因为将状态更改为已取消,元已更改并且在再次更改状态时不会返回,例如完成。

0 个答案:

没有答案