2017-03-16 8 views
-1

WooCommerceには、ショップから在庫切れの商品を隠す機能があります。ただし、この機能は、WooCommerceネイティブのショートコードを使用していて、他のプラグインを使用してWebサイトの他の部分に製品を表示している場合にのみ機能します。在庫切れの商品をごみ箱にお送りください

だから、私はこの製品を捨てることは、良いもののための在庫切れ製品を取り除く良い方法だろうと思う。 私は仕事をより簡単にして将来的にそれらの製品を復元したい場合に備えて永久的な削除を望んでいませんが、それ以外の方法がなければ私はそれを歓迎します。

私はちょっとPHPを学んでいます。あなたにアイディアがあれば教えてください。

答えて

0

すべてのもののWordPressのように異なる post_typeでポストとして扱われ、だから、いつでもポスト/製品が​​が と呼ばれる更新されます。

function wh_trashOutOfStockProduct($post_id, $post, $update) { 

    $post_type = get_post_type($post_id); 

    // If this isn't a 'product' post, don't update it. 
    if ('product' != $post_type) 
     return; 
    $product = wc_get_product($post_id); 
    //if product is Out of Stock trash it 
    if (!$product->is_in_stock()) { 
     wp_trash_post($post_id); 
    } 
} 

add_action('save_post', 'wh_trashOutOfStockProduct', 10, 3); 

コードは、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルになります。また、任意のプラグインのPHPファイルにもあります。


UPDATED
ワンタイム利用機能

add_action('wp', 'wh_trashAllProductOnce'); 

function wh_trashAllProductOnce() 
{ 
    $params = [ 
     'posts_per_page' => -1, 
     'post_type' => 'product' 
    ]; 
    $wc_query = new WP_Query($params); 

    if ($wc_query->have_posts()) : 
     while ($wc_query->have_posts()) : 
      $wc_query->the_post(); 
      $product_id = get_the_ID(); 
      $product = wc_get_product($product_id); 
      //if product is Out of Stock trash it 
      if (!$product->is_in_stock()) 
      { 
       wp_trash_post($product_id); 
      } 
     endwhile; 
     wp_reset_postdata(); 
    else: 
     _e('No Products'); 
    endif; 
} 

アクティブテーマfunctions.phpファイルに上記のコードを追加して、一度だけあなたのウェブサイトを実行し、上記のコードを削除し、それ在庫切れの商品はすべて捨ててしまいます。


は、あなたが長い時間のためのコードを保持したい場合は、クエリと実行の時間を短縮させ

を更新しました。

add_action('admin_init', 'wh_trashAllProductOnce'); 

function wh_trashAllProductOnce() { 
    $current_user = wp_get_current_user(); 
    //if loggedin user does not have admin previlage 
    if (!user_can($current_user, 'administrator')) { 
     return; 
    } 
    $params = [ 
     'posts_per_page' => -1, 
     'post_type' => 'product', 
     'post_status' => 'publish' 
    ]; 
    $wc_query = new WP_Query($params); 
    if ($wc_query->have_posts()) : 
     while ($wc_query->have_posts()) : 
      $wc_query->the_post(); 
      $product_id = get_the_ID(); 
      $product = wc_get_product($product_id); 
      //if product is Out of Stock trash it 
      if (!$product->is_in_stock()) { 
       wp_trash_post($product_id); 
      } 
     endwhile; 
     wp_reset_postdata(); 
    endif; 
} 

この関数は、トリガーとなります上記のアクティブなテーマfunctions.phpファイル内のコードといつでもダッシュボードへの管理ログインを追加し、任意のバックエンドのページにアクセスします。

ご注意:それだけ 1時間のために、上記の方法のいずれかを使用することをお勧めします、またはあなただけの必要なときに、関数の使用 それをアンコメントし、再度コメント。

希望します。

あなたがWoocommerceの下で、[ツール]メニューの[ワンクリックでこれを行うことができます
+0

はご協力いただきありがとうございますが、それは製品のゴミ箱はありません。私はここに "if(!$ product-> is_in_stock())"という問題があるかもしれないと思っています。私は少し知識があることを知っている私はそれがIF製品= "外注"であると思うだろうごみ –

+0

@ Ryon:あなたは既存のすべての製品をごみ箱に入れたいですか?あなたは単純な製品または可変製品を持っていますか? 'is_in_stock()'は 'bool'を返すメソッドです。 –

+0

既存の製品はすべてゴミ箱に入れてください。すべての製品はシンプルです。 –

0
add_filter('woocommerce_debug_tools', 'tools'); 
/** 
* Tools we add to WC 
* @param array $tools 
* @return array 
*/ 
function tools($tools) { 
    $tools['delete_products'] = array(
     'name'  => __('Delete OutofStock Products','your-text-domain'), 
     'button' => __('Delete OutofStock products','your-text-domain'), 
     'desc'  => __('This tool will delete OutofStock .', 'your-text-domain'), 
     'callback' => array($this, 'delete_products') 
    ); 
    return $tools; 
} 
/** 
* Delete OutofStock Products 
*/ 
function delete_products() { 
    global $wpdb; 
      $wpdb->query("DELETE p FROM {$wpdb->posts} p join {$wpdb->postmeta} pm on p.ID = pm.post_id WHERE p.post_type = 'product' and pm.meta_key='_stock_status' and pm.meta_value='outofstock'"); 
    echo '<div class="updated"><p>' . sprintf(__('Out of stock Products Deleted', 'your-text-domain')) . '</p></div>'; 
} 

- >システムステータス、スクリーンショットを参照してくださいenter image description here

+0

これはスマートなコーディングです。私はしかし、私は手動で同じものを削除する必要があります。在庫がゼロになると、製品が消えることを目指します。ごみ箱に送る方法がない場合、私は永久削除で作業します。 –

+0

@Ryon有用であれば投票できます –

+0

ありがとうございました。コードは問題を正確に解決しなかったので、代わりに@Raunak Gupta Solutionを使用しました。 –

関連する問題