Cronjob Wordpress, чтобы отменить заказы WC для продукта, который был удален? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть проект, в котором пользователь может фактически удалить свой собственный виртуальный продукт, который он выставил на продажу, и на самом деле может быть несколько активных заказов на этот продукт во время его удаления. Я подумал, что лучшим решением было бы добавить cronjob, который запускается каждые 10 минут, используя реальный cron через crontab, а не виртуальный cron Wordpress, который я уже принял, - но вопрос в том, как мне получить все заказывает продукт, а затем изменяет статус всех этих продуктов на отмененные, а не удаляя их, для потомков.

Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 28 августа 2018

Итак, все получилось ... более безопасный и просто лучший способ сделать это. Вместо cronjob вы цепляетесь за удаление постов, а когда продукт действительно удаляется, вы выполняете требуемый запрос. Вы найдете все прикрепленные заказы, которые еще не завершены, и отмените эти предстоящие / ожидающие заказы.

function get_order_ids_by_product_id( $product_id, $order_status = array( 'wc-completed' ) ){
    global $wpdb;
    $results = $wpdb->get_col("
        SELECT order_items.order_id
        FROM {$wpdb->prefix}woocommerce_order_items as order_items
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
        LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID
        WHERE posts.post_type = 'shop_order'
        AND posts.post_status NOT IN ( '" . implode( "','", $order_status ) . "' )
        AND order_items.order_item_type = 'line_item'
        AND order_item_meta.meta_key = '_product_id'
        AND order_item_meta.meta_value = '$product_id'
    ");
    return $results;
}

add_action( 'before_delete_post', 'check_for_active_orders' );
function check_for_active_orders($post_id){
    $WC_Product = wc_get_product( $post_id );
    $orders_ids = get_order_ids_by_product_id( $post_id );
    if(count($orders_ids) > 0){
      foreach($orders_ids as $oid){
        $order = new WC_Order($oid);
        $order->update_status('cancelled', 'This product has been removed.');
      }
    }
}

Надеюсь, это поможет кому-то еще в ближайшем будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...