Мне нужно настроить 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>';
}
}
Я добавил несколько операторов отладки и получил сообщение «Ошибка удаления идентификатора заказа» для каждого идентификатора заказа. Есть идеи, как это исправить?
Когда включено высокопроизводительное хранилище заказов (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 вашей дочерней темы (или в плагине). Он должен работать.
Обратите внимание, что я уменьшил количество обрабатываемых заказов… Этот аргумент «лимит» должен быть точно настроен в зависимости от хостинга.
Никакого мусора больше не нужно…
спасибо, значит перед удалением мусор больше не нужен?