プログラム的にこれを行う方法はありますか?私のローカルホスト上のPHPスクリプトを介しての意味、エクスポートしてからインポートして戻す、あるいはその他の適切な方法。
これが私が話しているものです:
テーブルwp_terms
は私がexclude-from-catalog
を見つけた場所ですterm_id
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;
そして、私がこれに設定した製品をたくさんのコラムで見ることができます。
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_terms
がwp_term_relationships
およびwp_term_taxonomy
と明らかに密接な関係を持っていることを確かめることは、これが単純な仕事になることはないと思います。
さらに、バックエンドで何か(taxonomy
、featured
、meta_id
など)を指定した場合にのみ、outofstock
product_visibility
と共に新しいexclude-from-catalog
のみが作成されるようです。
これは不可能な仕事ですか? WordPress/WooCommerceの用語は構造化されているため、これを行うことはできず、wp-adminでドラフトされた各製品に手動でproduct_visibility
を設定する必要がありますか。
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' );