WordPress程序化股票更新

时间:2020-01-15 作者:Harry

我正在尝试开发一个插件,将超过X天的产品库存量更新为0(缺货)。我使用的逻辑是:

选择修改日期大于X天(例如:10天)的产品

  • 将库存数量更新为0(缺货)
    1. SQL语句:

      Select 
      t1.id as product_id, 
      t1.post_title as product_name,
      t1.post_type as product_variant, 
      t2.min_price as product_cost, 
      t2.stock_quantity as product_stock_qty, 
      t2.stock_status as product_stock_status, 
      t3.user_nicename as vendor_name, 
      t1.post_modified as product_stock_update, 
      t4.frequency as frequency 
      from 
      wp_posts t1 join 
      wp_wc_product_meta_lookup  t2 on 
      t1.id=t2.product_id join 
      wp_users t3 on t3.id=t1.post_author join 
      wp_cc_autostockaudit t4 on t4.author_id = t1.post_author 
      where DATE(DATE_ADD(t1.post_modified, INTERVAL +  t4.frequency DAY )) <= now() LIMIT 500;
      
      (t4.frequency=10天,来自我的自定义表)

      现在,用这个做一个foreach,将indivudial元素折叠起来,并将其丢弃,使其缺货。

      代码:

      foreach($productdatas as $productdata){
          $out_of_stock_staus  = \'outofstock\';
          $product_id          = $productdata->product_id;
          $product_title       = $productdata->product_name;
          $product_vendor      = $productdata->vendor_name;
      
      echo "About to trash $product_id <br>";
      update_post_meta($product_id, \'_stock\', 0);
      update_post_meta( $product_id, \'_stock_status\', wc_clean( $out_of_stock_staus ) );
      wp_set_post_terms( $product_id, \'outofstock\', \'product_visibility\', true );
      
      我的问题:

      产品被正确标记为缺货,但由于我的SQL正在读取上次修改的内容,而没有更新,因此设置cron作业会出错,因为每次都会无限运行

    2. 如果我还包括一个更改post状态的函数,wp\\u update\\u post(数组(\'ID\'=>$product\\u ID,\'post\\u status\'=>\'draft\'),库存更新不起作用。根据我在这段代码上的工作经验,它要么将产品更新为草稿状态,要么将库存转储为0,但决不会同时执行这两项操作

      版本信息:WP:5.3.2,Woocommerce:3.8.1

    1 个回复
    最合适的回答,由SO网友:Harry 整理而成

    Wordpress在wp\\U Posteta上存储三个级别的股票信息。

    每个产品都启用了管理库存,因此将库存数量更新为0效果不佳。

    解决方案:我强制将“管理库存”更新为“是”,然后将数量更改为0,状态为“缺货”。为了进一步实现第二部分,select语句根据上次修改的内容提取数据,我强制将产品推到草稿状态。这将修改日期时间,并且不会参与下一次轮询。

    update_post_meta($product_id, \'_manage_stock\',\'Yes\');
    update_post_meta($product_id, \'_stock\', \'0\');
    update_post_meta($product_id, \'_stock_status\', \'outofstock\');
    
    wp_update_post(
            array( 
                \'ID\' => $product_id, 
                \'post_status\' => \'draft\'
            )
        );