Автоматическое удаление завершенных заказов старше 3 месяцев в Woocommerce с помощью HPOS

Мне нужно настроить WooCommerce для автоматической очистки завершенных заказов старше 3 месяцев, и я нашел Как автоматически удалять старые завершенные заказы в Woocommerce код ответа, который не работает с активированным хранилищем высокопроизводительных заказов (HPOS).

Вот моя попытка кода:

add_action( 'admin_footer', 'auto_trash_old_completed_orders_345erhwe546' );
function auto_trash_old_completed_orders_345erhwe546() {
    global $nm_theme_options;

    if ( isset( $nm_theme_options['delete_all_woo_orders_older_then_3_months'] ) && $nm_theme_options['delete_all_woo_orders_older_then_3_months'] == 1 ) {
        // Theme option is set to delete old orders

        $completed_order_ids = wc_get_orders( array(
            'limit'         => 100, // By batch of 100 orders
            'status'        => 'completed', 
            'return'        => 'ids',
            'date_created'  => '<' . date( 'Y-m-d', strtotime( '-3 months' ) ),
        ) );

        if ( count( $completed_order_ids ) > 0 ) {
            // Orders found, proceed to delete

            foreach ( $completed_order_ids as $completed_order_id ) {
                $trashed = wp_trash_post( $completed_order_id );
                $deleted = wp_delete_post( $completed_order_id, true );

                // DEBUG
                if ( ! $trashed || ! $deleted ) {
                    echo '<script>alert("Error deleting order ID: ' . $completed_order_id . '");</script>';
                }
                
            }
        }
        
        // DEBUG
        echo '<script>alert("Orders deleted: ' . count( $completed_order_ids ) . '");</script>';
        
    } else {
        
        // DEBUG
        echo '<script>alert("Theme option not set to delete old orders.");</script>';
        
    }
}

Я добавил несколько операторов отладки и получил сообщение «Ошибка удаления идентификатора заказа» для каждого идентификатора заказа. Есть идеи, как это исправить?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда включено высокопроизводительное хранилище заказов (HPOS), классические посты WordPress и метафункции постов использовать не следует. Вместо этого вы можете использовать метод WC_Data delete(), например:

add_action( 'admin_footer', 'auto_trash_old_completed_orders' );
function auto_trash_old_completed_orders(){
    $completed_orders = wc_get_orders( array(
        'limit'         => 100, // By batch of 100 orders
        'status'        => 'completed', 
        'date_created'  => '<' . date("Y-m-d", strtotime("-6 months")),
    ) );

    if ( count($completed_orders) > 0 ){
        foreach( $completed_orders as $completed_order ) {
            $completed_order->delete(true); 
        }
    }
} 

Код находится в файле function.php вашей дочерней темы (или в плагине). Он должен работать.

Обратите внимание, что я уменьшил количество обрабатываемых заказов… Этот аргумент «лимит» должен быть точно настроен в зависимости от хостинга.

спасибо, значит перед удалением мусор больше не нужен?

eva last 06.05.2024 11:52

Никакого мусора больше не нужно…

LoicTheAztec 06.05.2024 14:17

Другие вопросы по теме

Шаг ввода пользовательского количества на основе категории продукта WooCommerce
Правило перезаписи URL-адресов при отправке запроса IIS 10 в приложение WordPress
Как отображать настраиваемые поля переменных продуктов под названием продукта на главной странице продукта
Обновить цену продукта WooCommerce на основе настраиваемого поля ввода
Пользовательский блок Wordpress Gutenberg, viewScript не загружается во внешнем интерфейсе, когда мой блок вставлен
Отключить кнопку размещения заказа WooCommerce Checkout на основе идентификатора пользователя
Проблема с обновлением CSS в WordPress с помощью хостинга
Горячая перезагрузка не работает полностью при использовании плагина Vite/Laravel Vite внутри Wordpress
Создайте собственный фильтр в списке заказов администратора WooCommerce (HPOS)
Изменение цвета фона в списке заказов администратора WooCommerce в зависимости от роли пользователя