我需要你的帮助,因为我不明白我在做什么了。目前,我正在向 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混淆...我在这里使用了两个订单,因为将状态更改为已取消,元已更改并且在再次更改状态时不会返回,例如完成。