Обновление нескольких метаданных для ограниченного числа существующих заказов в WooCommerce

#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 .