0

請求先/配送先住所に設定されている場所に基づいて、顧客に配送できる商品のみをリストしたいです。(すべてのユーザーがログインしています)

各ベンダーは特定の国にのみ出荷する可能性があるため、出荷できない製品をユーザーに表示したくありません。

この問題に取り組むために、別の用語メタとして出荷できる国を (複数選択ボックスを介して) 保存するベンダーの編集ページに追加のフィールドを追加しました。

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 を追加するだけです。

乾杯

4

1 に答える 1