Дисплей Woocommerce приобрел простые продукты от клиента - PullRequest
1 голос
/ 28 марта 2019

Я показываю купленные продукты на странице их аккаунта пользователем, вошедшим в систему.Я реализовал это, используя инструкции по этой ссылке https://www.codesd.com/item/woocommerce-list-all-the-products-previously-ordered.html. Я хотел бы отображать только купленные продукты с типом продукта "простой" вместо отображения всех купленных продуктов.

Я использовал следующий запрос:

global $wpdb;

$current_user   = wp_get_current_user();
$customer_email = $current_user->user_email;
$customer_data = array( $customer_email );
$statuses      = array_map( 'esc_sql', wc_get_is_paid_statuses() );

$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 ) . "' )
" );

Какой будет правильный SQL-запрос, который будет вставлен в него, чтобы отображать только продукты с типом продукта "простой"?

1 Ответ

1 голос
/ 28 марта 2019

Можно ограничить этот запрос простым продуктом только с помощью следующего кода, где мы выполняем под "запрос таксономии" на основе product_type Таксономия Woocommerce (который управляет типами продукта) для термин слизняк simple (простые продукты) :

<code>global $wpdb;

$current_user   = wp_get_current_user();
$customer_email = $current_user->user_email;
$customer_data = array( $customer_email );
$statuses      = array_map( 'esc_sql', wc_get_is_paid_statuses() );

$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 = '_product_id'
    AND im.meta_value IN (
        SELECT tr.object_id 
        FROM {$wpdb->prefix}term_relationships as tr
        INNER JOIN {$wpdb->prefix}term_taxonomy as tt 
            ON tr.term_taxonomy_id = tt.term_taxonomy_id
        INNER JOIN {$wpdb->prefix}terms as t 
            ON tt.term_id = t.term_id
        WHERE tt.taxonomy = 'product_type' 
        AND t.slug = 'simple'
    )
    AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' )
    GROUP BY im.meta_value
" );

// The raw output (testing
echo '<pre>'; print_r($result); echo '
';

Проверено и работает.

...