Получить идентификаторы заказов, связанные с продуктом, купленным клиентом в Woocommerce - PullRequest
0 голосов
/ 17 октября 2018

У меня есть идентификаторы продуктов в виде массива, и я хотел бы получить список идентификаторов заказов, если клиент приобрел этот продукт.

У меня есть идентификаторы продуктов, купленные у клиента.Почему-то мне нужно получить связанный идентификатор заказа и отменить этот заказ, если клиент покупает новый продукт.

Чтобы проверить, приобрел ли клиент продукт, я использую функцию has_bought_items() из этой ветки ответа: Проверьте, купил ли клиент определенные продукты в WooCommerce

Может быть, его можно настроить, чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 17 октября 2018

Следующая пользовательская функция, созданная с помощью очень простого уникального SQL-запроса, получит все идентификаторы заказов из массива идентификаторов продуктов (или уникальных идентификаторов продуктов) для данного клиента.

На основена код от: Проверьте, купил ли клиент определенные продукты в WooCommerce

function get_order_ids_from_bought_items( $product_ids = 0, $customer_id = 0 ) {
    global $wpdb;

    $customer_id = $customer_id == 0 || $customer_id == '' ? get_current_user_id() : $customer_id;
    $statuses    = array_map( 'esc_sql', wc_get_is_paid_statuses() );

    if ( is_array( $product_ids ) )
        $product_ids = implode(',', $product_ids);

    if ( $product_ids !=  ( 0 || '' ) )
        $meta_query_line = "AND woim.meta_value IN ($product_ids)";
    else
        $meta_query_line = "AND woim.meta_value != 0";

    // Get Orders IDs
    $results = $wpdb->get_col( "
        SELECT DISTINCT p.ID FROM {$wpdb->prefix}posts AS p
        INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
        WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
        AND pm.meta_key = '_customer_user'
        AND pm.meta_value = $customer_id
        AND woim.meta_key IN ( '_product_id', '_variation_id' )
        $meta_query_line
    " );

    // Return an array of Order IDs or an empty array
    return sizeof($results) > 0 ? $results : array();
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы),Протестировано и работает.


ИСПОЛЬЗОВАНИЕ Примеры:

1) Для текущего зарегистрированного клиента (и 2 идентификатора продукта в массиве):

$product_ids = array(37,53);
$order_ids = get_order_ids_from_bought_items( $product_ids );

2) Для определенного идентификатора пользователя и одного идентификатора продукта:

$product_id = 53;
$user_id    = 72;
$order_ids  = get_order_ids_from_bought_items( $product_id, $user_id );
...