代码之家  ›  专栏  ›  技术社区  ›  Grant

一个wordpress cronjob来取消删除产品的wc订单?

  •  1
  • Grant  · 技术社区  · 6 年前

    我有一个项目,在这个项目中,用户实际上可以删除他们为销售而准备的自己的虚拟产品,并且在删除该产品时,可能确实有一些活动订单。我认为最好的解决方案是通过crontab添加一个每10分钟运行一次的cronjob,使用一个真正的cron,而不是我已经制定的wordpress虚拟cron,但问题是,我如何获得一个产品的所有订单,然后将所有这些产品的状态更改为取消,而不是删除它们,对于po肥胖。

    任何帮助都将不胜感激,谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Grant    6 年前

    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.');
          }
        }
    }