web-dev-qa-db-ja.com

WooCommerceですべてのドラフトを 'カタログから除外'に設定する

プログラム的にこれを行う方法はありますか?私のローカルホスト上のPHPスクリプトを介しての意味、エクスポートしてからインポートして戻す、あるいはその他の適切な方法。

これが私が話しているものです:

テーブルwp_termsは私がexclude-from-catalogを見つけた場所ですterm_id

enter image description here

1つの製品ページをバックエンドでテストしてから、MySQL/PHPMyAdminでこのクエリを実行しました。

SELECT *
FROM wp_posts p
INNER JOIN wp_postmeta pm ON ( pm.post_id = p.ID AND pm.meta_key='_visibility' )
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN wp_terms t ON (t.term_id = tt.term_id)
WHERE p.post_type = 'product'
and t.term_id = 7;

そして、私がこれに設定した製品をたくさんのコラムで見ることができます。

enter image description here

post_id/object_idはどちらもカタログから除外するように手動で設定した商品ページIDを参照しています。

私の問題は、私がこのような質問をするならば、です

SELECT *
FROM wp_posts p
INNER JOIN wp_postmeta pm ON ( pm.post_id = p.ID AND pm.meta_key='_visibility' )
INNER JOIN wp_term_relationships tr ON (p.ID = tr.object_id)
INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
INNER JOIN wp_terms t ON (t.term_id = tt.term_id)
WHERE p.post_type = 'product'
and post_status = 'draft';

すべてのページのすべてのインスタンスのすべての投稿メタを返しています...そのクエリはほぼ400,000件の結果を返しています。

wp_termswp_term_relationshipsおよびwp_term_taxonomyと明らかに密接な関係を持っていることを確かめることは、これが単純な仕事になることはないと思います。

さらに、バックエンドで何か(taxonomyfeaturedmeta_idなど)を指定した場合にのみ、outofstockproduct_visibilityと共に新しいexclude-from-catalogのみが作成されるようです。

これは不可能な仕事ですか? WordPress/WooCommerceの用語は構造化されているため、これを行うことはできず、wp-adminでドラフトされた各製品に手動でproduct_visibilityを設定する必要がありますか。

1
bbruman

wp_set_object_terms() を調べてください。

あなたはの行に沿って何かをすることができます:wp_set_object_terms( $post_id, 'exclude-from-catalog', 'product_visibility' );

すべての投稿をステータス別に取得するには、 Wp_Query を使用します。投稿オブジェクト全体を集めるのではなく、クエリをIDのみに制限するために'fields' => 'ids'パラメータを追加しました。

ステータスとして下書きまたは保留を持つ、または自動下書きである投稿の配列

 function catalog_exclude_drafts() {
 $args = array(
               'post_type'   => 'product',
               'post_status' => array( 'pending', 'draft', 'auto-draft' ),
               'posts_per_page' => -1, 
               'fields'      => 'ids'
               );
            $drafts = new WP_Query( $args );
            $ids    = $drafts->posts;

            $map    = array_map( 'wrapper_for_set_obj', $ids );
 }

function wrapper_for_set_obj( $post_id ) {
    wp_set_object_terms( $post_id, 'exclude-from-catalog', 'product_visibility' );     
}

上記の (またはいくつかの完成した亜種)をinitにフックしてlocalhostなどで1回実行することができます。ドラフトを将来証明するには、 save_post にフックします。実際、WP 3.7からsave_post_productsが導入されたため、save_post{post_type}にフックすることができます。

ワンタイムアップデート:add_action( 'init', 'catalog_exclude_drafts' );

今後:add_action( 'save_post_products', 'wrapper_for_set_obj' );

2
hwl