Покупал ли уже пользователь товар?
Нужно сделать проверку сразу для нескольких пользователей, покупали ли они уже товары.
В woocommerce есть функция wc_customer_bought_product для проверки наличия у пользователя купленного товара.
Как сделать такую же проверку, только массовую проверку, т.е. сразу для многих пользователей?
И чтобы был один запрос sql, чтобы не вызывать много раз wc_customer_bought_product
wc_customer_bought_product
$customer_data = array( $user_id );
$customer_data[] = $user->user_email;
$statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );//processing,completed
$result = $wpdb->get_col(
"
SELECT im.meta_value FROM {$wpdb->posts} AS p
INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
AND pm.meta_key IN ( '_billing_email', '_customer_user' )
AND im.meta_key IN ( '_product_id', '_variation_id' )
AND im.meta_value != 0
AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' )
"
);
return in_array( absint( $product_id ), $result, true );
получилось сделать проверку таким способом:
SELECT pm.meta_value, im.meta_value FROM posts AS p
INNER JOIN postmeta AS pm ON p.ID = pm.post_id
INNER JOIN woocommerce_order_items AS i ON p.ID = i.order_id
INNER JOIN woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
WHERE p.post_status IN ( 'wc-completed' )
AND pm.meta_key='_billing_email'
AND pm.meta_value IN ( '[email protected]','[email protected]' )
AND im.meta_key='_variation_id'
AND im.meta_value IN ('1122','1123','3443')
т.е. перед запросом в массив выбираются email и соответствующий данному email variation_id и в php-цикле формируется sql.
но в данном способе все variation_id проверяются для каждого email, т.е. в этой строке AND im.meta_value IN ('1122','1123','3443'). А нужно чтобы для одного email была проверка variation_id который относится именно к данному пользователю.
Как правильно сформировать sql запрос?