Слияние 2 запросов продукта woocommerce - PullRequest
0 голосов
/ 25 марта 2020

У меня есть следующий код:

add_action( 'woocommerce_product_query', array($this, 'b2bking_hide_products_category_visibility') );



function b2bking_hide_products_category_visibility($q ){

        $tax_query = (array) $q->get( 'tax_query' );
        $tax_query[] = array(
               'taxonomy' => 'product_cat',
               'field' => 'slug',
               'terms' => $visiblecategories, 
               'operator' => 'IN'
        );
        $q->set( 'tax_query', $tax_query );

        // Set query to only select products that are in "default" category mode, not manual visibility mode
        $q->set('meta_query', array(
                array(
                    'key'   => 'b2bking_product_visibility_override',
                    'value' => 'default',
                )
            ));



        /* SEPARATE META QUERY 
        $q->set('meta_query', array(
                    'relation' => 'AND',
                    array(
                        'relation' => 'OR',
                        array(
                            'key' => 'b2bking_group_'.$currentusergroupidnr,
                            'value' => '1'
                        ),
                        array(
                            'key' => 'b2bking_user_'.$currentuserlogin,
                            'value' => '1'
                        )
                    ),
                    array(
                        'key' => 'b2bking_product_visibility_override',
                        'value' => 'manual',
                    )
                ));
        */


            }
        }

В настоящее время у меня есть (налоговый запрос и мета-запрос)

Я хотел бы иметь (налог запрос И мета-запрос) ИЛИ (отдельный мета-запрос)

Как этого добиться? Можно ли это сделать с помощью действия "woocommerce_product_query"? Если да, то каков правильный синтаксис?

Спасибо

1 Ответ

0 голосов
/ 25 марта 2020

Я понял:

Вы используете

$q->set('post__in', $postIDs);

Это заставляет WooCommerce отображать точный массив продуктов в массиве $ postIDs;

Окончательный код выглядит например:

add_action( 'woocommerce_product_query', array($this, 'your_product_function') );
function your_product_function(){
            /* MAKE YOUR 2 CUSTOM PRODUCT QUERIES AS WP QUERIES */
            $queryA = new WP_Query($queryAparams);
            $queryB = new WP_Query($queryBparams);

            $postIDs= array_merge($queryA->posts,$queryB->posts);

          /* IMPORTANT, if the ARRAY is EMPTY, ALL PRODUCTS WILL BE SHOWN. A quick bypass is to pass an array of invalid ids as you can see below */
            if(!empty($allTheIDs)){
                $q->set('post__in',$postIDs);
            } else {
                $q->set('post__in',array('invalidid'));
            }

}

Очень важно, чтобы в параметрах передавались «поля» -> «идентификаторы», чтобы получить только идентификаторы. Так выглядят отдельные запросы

$queryBparams = array(
                'posts_per_page' => -1,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query'=> array(
                        'relation' => 'AND',
                        array(
                            'relation' => 'OR',
                            array(
                                'key' => 'b2bking_group_'.$currentusergroupidnr,
                                'value' => '1'
                            ),
                            array(
                                'key' => 'b2bking_user_'.$currentuserlogin,
                                'value' => '1'
                            )
                        ),
                        array(
                            'key' => 'b2bking_product_visibility_override',
                            'value' => 'manual',
                        )
                    ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...