Фильтровать продукты WooCommerce по терминам таксономии и пользовательским полям в WP_Query

#php #wordpress #woocommerce #custom-fields #taxonomy-terms

#php #wordpress #woocommerce #пользовательские поля #термины таксономии

Вопрос:

В WooCommerce у меня есть категория товаров boots-2 (термин slug) с 350 товарами в ней.

Мне нужно вернуть все товары из этой категории, которые имеют мета-ключ _translate_lock с мета-значением 1 , как определено в WP_Query ниже:

Вот мой код

 $args = array(
        'posts_per_page' => '400',
        'category' => 'boots-2',
        'post_type'  => 'product',
        'orderby' => 'name',
        'meta_query' => array(
            array(
            'key' => '_translate_lock',
                'value' => '1',
            'compare' => '='
            )
        ),
    );

    $query  = new  WP_Query($args);


    if ( $query->have_posts() ) {

        while ( $query->have_posts() ) {

            $query->the_post();

            $productId = get_the_ID() ;
            println("retrieved product id is $productId");
            
        }
    } 
    wp_reset_query();
  

Этот код возвращает товары, которые не относятся к категории, с помощью category slug boots-2 , я попытался изменить строку запроса на cat=881 где 881 — это tag_id категория, но код по-прежнему возвращает товары из других категорий.

Чего мне не хватает?

Комментарии:

1. Вы используете key дважды в meta_query массиве … возможно, это не причина этой проблемы, но в любом случае стоит изучить 🙂

2. @FluffyKitten конечно, это была опечатка,, я исправляю вопрос.

Ответ №1:

Первая категория продуктов Woocommerce — это пользовательская таксономия, которая не имеет ничего общего с категорией WordPress. Теперь для параметров WP_Query и таксономии лучше использовать налоговый запрос, такой как:

 $query = new WP_Query( array(
    'posts_per_page' => -1,
    'post_type'      => 'product',
    'post_status'    => 'publish',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'meta_query'     => array(
        array(
            'key'       => '_translate_lock',
            'value'     => '1',
            // 'compare'    => '=' // not needed as default value is '='
        )
    ),
    'tax_query' => array(
        array(
            'taxonomy'  => 'product_cat', // Woocommerce product category taxonomy
            'field'     => 'slug', // can be: 'name', 'slug' or 'term_id'
            'terms'     => array('boots-2'),
        )
    ),
) );

$results = []; // Initializing

if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
        $product_id   = get_the_ID();
        $product_name = get_the_title();

        $results[] = $product_name .' ('.$product_id.')'; 
    endwhile;
    wp_reset_postdata();

    // Displaying results
    printf( '<p><strong>Retrieved products are</strong>:<br> %s<p>', implode(',<br>', $results) ); 
else :
    echo '<p>No results found.</p>';
endif;
wp_reset_query();
  

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

Смотрите документацию раздела WP_Query — taxonomy-parameters