#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