php - 为 WooCommerce 中有限数量的现有订单更新多个元数据
问题描述
我为每个订单添加了 4 个新的元数据字段。我可以自己在管理面板中为每个订单更新这些字段,但是有 200 个订单,这需要一段时间。
我需要为每个订单自动填充这些元字段。未来的订单将自动填充,但此时我需要更新所有订单。
我写了以下代码,但它什么也没做:
add_action( 'woocommerce_loaded', 'update_existing_orders_with_new_meta' );
function update_existing_orders_with_new_meta(){
$order_ids = wc_get_order( $order_id );
// Loop through product Ids
foreach ( $order_ids as $order_id ) {
if ( $order_id->payment_method == 'cheque' ) {
$order_id->update_meta_data('ji_payment_status', '');
$order_id->update_meta_data('ji_payment_method', '');
$order_id->update_meta_data('ji_payment_date', '');
$order_id->update_meta_data('ji_payment_notes', '');
} else {
$order_id->update_meta_data('ji_payment_status', '1');
$order_id->update_meta_data('ji_payment_method', 'Credit Card');
$order_id->update_meta_data('ji_payment_date', date('F j, Y'));
$order_id->update_meta_data('ji_payment_notes', '');
}
}
}
有人可以指导我如何做到这一点吗?
解决方案
您正在使用$order_ids = wc_get_order( $order_id );
,而没有$order_id
设置。
如果它实际上涉及 200 个订单,您可以使用以下内容。操作完成后,“完成”将出现在页脚中。然后可以删除代码。
// Run once, delete afterwards
function set_meta_for_orders () {
// Get ALL orders (could be extended with multiple conditions)
// More info: https://github.com/woocommerce/woocommerce/wiki/wc_get_orders-and-WC_Order_Query
$orders = wc_get_orders( array(
'limit' => 200, // Get 200 most recent orders
));
// NOT empty
if ( ! empty ( $orders ) ) {
// Loop
foreach ( $orders as $order ) {
// Payment method = cheque
if ( $order->get_payment_method() == 'cheque' ) {
$order->update_meta_data( 'ji_payment_status', '' );
$order->update_meta_data( 'ji_payment_method', '' );
$order->update_meta_data( 'ji_payment_date', '' );
$order->update_meta_data( 'ji_payment_notes', '' );
} else {
$order->update_meta_data( 'ji_payment_status', '1' );
$order->update_meta_data( 'ji_payment_method', 'Credit Card' );
$order->update_meta_data( 'ji_payment_date', date( 'F j, Y' ) );
$order->update_meta_data( 'ji_payment_notes', '' );
}
// Save
$order->save();
}
// Output
echo 'Done!';
}
}
// Call function
add_action( 'wp_footer', 'set_meta_for_orders' );
注意:这将适用于一些有限的订单。当涉及到很多订单时,建议使用其他解决方案,例如自定义 SQL。
推荐阅读
- java - ServiceLoader 不加载实现 jar
- database-design - 数据库建模 - 避免重复记录的替代方法
- python - 在 Win10 上从 Python 备份 Postgres
- javascript - 如何在 Maps Javascript api 中制作谷歌标记?
- c++ - c++ 多个 if 语句。为什么 else 语句也会执行?
- javascript - 用 PHP 数组填充 slickgrid(JS)
- selenium-webdriver - 量角器 - 无法在配置文件中启动具有功能和 multiCapabilities 的 Firefox
- python - Python os.listdir() 不返回某些文件
- postgresql - 如何使用 pg_read_file 和 missing_ok=true 读取完整文件?
- java - Hibernate 从 SpringBoot MultiModuleProject 在 Postgre 中生成表