#php #wordpress #woocommerce #metadata #orders
#php #wordpress #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', '');
}
}
}
Может кто-нибудь рассказать мне, как это сделать?
Ответ №1:
Вы используете $order_ids = wc_get_order( $order_id );
, пока не $order_id
установлено значение no.
Если это действительно касается 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.
Комментарии:
1. Спасибо, это сработало. Для других пользователей обратите внимание, что мне пришлось очистить мой плагин WordPress cache после добавления кода в functions.php .