請求先/配送先住所に設定されている場所に基づいて、顧客に配送できる商品のみをリストしたいです。(すべてのユーザーがログインしています)
各ベンダーは特定の国にのみ出荷する可能性があるため、出荷できない製品をユーザーに表示したくありません。
この問題に取り組むために、別の用語メタとして出荷できる国を (複数選択ボックスを介して) 保存するベンダーの編集ページに追加のフィールドを追加しました。
update_term_meta($term_id, 'vendor_data_shipping_countries', $selected_shipping_countries);
等...
そのデータはすべて正常に保存され、 を呼び出すと次のように出力されますget_term_meta($term->term_id, 'vendor_data_shipping_countries')[0]
。
Array
(
[0] => FR
[1] => GB
)
私が今問題を抱えているのは、アクション「woocommerce_product_query」でユーザーに出荷できる製品のみを表示するように製品ループ クエリをフィルタリングすることです。
function ac_vendor_show_deliverable_products($query)
{
// magical query filter here...
// if users location matches any of the vendor products ship to countries then output the product to the user
// $query->set(); ... something...
}
add_action('woocommerce_product_query','ac_vendor_show_deliverable_products');
これは私のスキルレベルが私を失敗させるところです。私はWCにかなり慣れていないので、アクションでクエリを操作するのが苦手です。完全な SQL を書くだけの方が良いですが、他の多くのことを台無しにするので、フィルタリングが最善の方法です。
誰かの薫風は私のものよりずっと強いと思います!誰でもこれを理解できますか?
誰かが助けてくれることを願っています。
アップデート:
SQLでやりたいことを正確に書くことができました
SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id)
LEFT JOIN wp_termmeta ON (wp_termmeta.term_id = wp_term_taxonomy.term_id)
WHERE wp_termmeta.meta_key = 'vendor_data_shipping_countries'
AND wp_termmeta.meta_value LIKE '%"GB"%'
AND wp_posts.post_type = 'product'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.menu_order ASC, wp_posts.post_title ASC LIMIT 0, 12
これは、出荷可能な国として GB を追加した製品のみをリストしています。
meta_value はシリアル化された配列として格納されるため、一致させる最も簡単な方法はa:2:{i:0;s:2:"FR";i:1;s:2:"GB";}
、たとえば値が格納されているときに LIKE を実行することであることに注意してください。
そのSQLをフックに入れる方法を誰かが理解できればwoocommerce_product_query
、それは素晴らしいことです。しかし、私は一生、これがどのように可能であるかを理解することはできません...
https://codex.wordpress.org/Class_Reference/WP_Queryのすべては、私が見ることができる wp_termmeta ではなく wp_postmeta の SQL を追加するだけです。
乾杯