WC_get_products Мета-запрос игнорируется - PullRequest
0 голосов
/ 11 февраля 2020

У меня проблемы с wc_get_products мета-запросом. Я пытаюсь исключить продукты, которые имеют clearance или express в SKU, а SKU имеют такой формат; (не мой выбор, что компания решила много лун go!)

Мой клуб - Express - Предмет Мой клуб - Очистка - Предмет Другой клуб - Стандартный - Предмет

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

    'post_status' => array('publish', 'pending', 'draft', 'future', 'private'),
    'parent' => array( 13, 14, 15 ),
    'limit' => 1000,
    'orderby' => 'id',
    'order'   => 'asc',
    'type' => array( 'simple', 'variable' ),
    'meta_query' => array(
                    'relation' => 'and',
                        array(
                            'relation'  => 'or',
                                array(
                                'key' => '_sku',
                                'value' => 'clearance',
                                'compare' => 'NOT LIKE',
                                ),
                            ),
                        array(
                            'relation' => 'or',
                                array(
                                'key' => '_sku',
                                'value' => 'fxpe',
                                'compare' => 'NOT LIKE',
                                ),
                            ),
                        )
);

Я также выполнил шаги по woocommerce (внизу страницы) Добавление поддержки пользовательских параметров , которая выглядит следующим образом:

function handle_custom_query_var( $query, $query_vars ) {
    if ( ! empty( $query_vars['_sku'] ) ) {
        $query['meta_query'][] = array(
            'key' => '_sku',
            'value' => esc_attr( $query_vars['_sku'] ),
        );
    }

    return $query;
 }

 add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handle_custom_query_var', 10, 2 );

Я также пытался отменить мета-запрос и изменить сравнение на like или !=, но ничего не работает или, кажется, не влияет на запрос.

Любая помощь действительно ценится .

Спасибо

ОБНОВЛЕНИЕ ----------------------------- -

Я сделал большую опечатку в первом посте, чтобы подтвердить, что я использую wc_get_products no wp_query

Я пробовал несколько варианты мета-запроса, но пока ничего не работает ...

Просто использование одного мета-запроса, похоже, тоже не работает

'meta_query' => array(
                        'key' => '_sku',
                        'value' => 'express',
                        'compare' => '!=',  // also tried 'NOT LIKE'

                        ),

Из-за i Путаница с запросом Я отмечу вопрос Говарда Е правильным, как и для wp_query, и перепишу в нем правильную информацию.

1 Ответ

1 голос
/ 11 февраля 2020

Попробуйте обновить ваш meta_query. Вы начинаете с того, что говорите «ИЛИ» для отношения как clearance, так и express.

'meta_query' => array(
    'relation' => 'AND',
    array(
        'relation'  => 'OR',
            array(
            'key' => '_sku',
            'value' => 'clearance',
            'compare' => 'NOT LIKE',
            ),
        ),
    array(
        'relation' => 'OR',
            array(
            'key' => '_sku',
            'value' => 'express',
            'compare' => 'NOT LIKE',
            ),
        ),
    )

* Для решения обновленного вопроса *

function handle_custom_query_var( $query, $query_vars ) {
    if ( ! empty( $query_vars['_sku'] ) ) {
        $query['meta_query'][] =  array(
        array(
                'relation'  => 'or',
                    array(
                    'key' => '_sku',
                    'value' => 'fxpe',
                    'compare' => 'NOT LIKE',
                    ),
                ),
            array(
                'relation' => 'or',
                    array(
                    'key' => '_sku',
                    'value' => 'clearance',
                    'compare' => 'NOT LIKE',
                    ),
                ),
            );
    }

    return $query;
 }

Затем просто используйте _sku в запросе продукта со значением ...

$products = wc_get_products(array(
     'post_status' => array('publish', 'pending', 'draft', 'future', 'private'),
    'parent' => array( 13, 14, 15 ),
    'limit' => 1000,
    'orderby' => 'id',
    'order'   => 'asc',
    'type' => array( 'simple', 'variable' ),
    '_sku' => true,
));

, однако добавление этого фильтра отфильтрует любой экземпляр _sku в запросе W C. При необходимости вы можете добавить дополнительные условия.

...