Изменение продукта Запрос WP с категорией продукта в Woocommerce
С помощью Woocommerce я пытаюсь создать WP_Query для типа публикации вариантов продуктов с категорией продуктов "Apple".
$args = array(
'product_cat' => 'Apple',
'post_type' => array('product', 'product_variation'),
'post_status' => 'publish',
'key' => '_visibility',
'value' => 'visible',
'posts_per_page' => 100,
'taxonomy' => 'pa_size',
'meta_value' => '39',
'meta_query' => array(
array(
'key' => '_stock',
'value' => 0,
'compare' => '>'
)
)
);
Но я не могу заставить его работать в этом запросе. Если я удалю 'product_cat' => 'Apple'
, запрос сработает. Почему?
1 answers
В этом WP_Query
есть много ошибок, касающихся продуктов Woocommerce:
- Для категории продукта и атрибута продукта вам лучше обычно использовать вместо
tax_query
. - Для Видимости продукта , начиная с Woocommerce 3, это обрабатывается
product_visibility
таксономией для'exclude-from-search'
и'exclude-from-catalog'
терминов.
Важные примечания о вариантах продукта:
- Категории товаров (или теги товаров) являются обрабатывается не вариациями продукта, а родительской переменной product
- Атрибуты продукта для вариаций обрабатываются как после метаданных с
meta_key
перед "attribute_
" иmet_value
, что является термином slug. - Видимость продукта не обрабатывается в вариантах продукта , так как они не отображаются на страницах архивов.
- Они не отображаются на страницах архива (как упоминалось ранее).
Поэтому при использовании WP_Query
вы не может запрашивать одновременно тип записи "продукт" и тип записи "product_variation" , поскольку они действительно разные.
Чтобы ваш запрос работал для типа записи "product_variation", вам нужна небольшая функция полезности, которая получит родительскую переменную product для категории продукта (или любую пользовательскую таксономию в качестве тегов продукта...):
// Utility function to get the parent variable product IDs for a any term of a taxonomy
function get_variation_parent_ids_from_term( $term, $taxonomy, $type ){
global $wpdb;
return $wpdb->get_col( "
SELECT DISTINCT p.ID
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}posts as p2 ON p2.post_parent = p.ID
INNER JOIN {$wpdb->prefix}term_relationships as tr ON p.ID = tr.object_id
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 p.post_type = 'product'
AND p.post_status = 'publish'
AND p2.post_status = 'publish'
AND tt.taxonomy = '$taxonomy'
AND t.$type = '$term'
" );
}
Вводится код function.php файл вашей активной дочерней темы (или активной темы). Проверено и работает. Необходимо для WP_Query
ниже...
Здесь WP_Query
код для вариантов продукта ( только), относящийся к определенной категории продуктов и определенным значениям атрибутов вариации:
// Settings
$cat_name = 'Apple'; // Product category name
$attr_taxonomy = 'pa_size'; // Product attribute
$attribute_term_slugs = array('39'); // <== Need to be term SLUGs
$query = new WP_Query( array(
'post_type' => 'product_variation',
'post_status' => 'publish',
'posts_per_page' => 100,
'post_parent__in' => get_variation_parent_ids_from_term( $cat_name, 'product_cat', 'name' ), // Variations
'meta_query' => array(
'relation' => 'AND',
array(
'key' => '_stock',
'value' => 0,
'compare' => '>'
),
array(
'key' => 'attribute_'.$attr_taxonomy, // Product variation attribute
'value' => $attribute_term_slugs, // Term slugs only
'compare' => 'IN',
),
),
) );
// Display the queried products count
echo '<p>Product count: ' . $query->post_count . '<p>';
// Displaying raw output for posts
print_pr($query->posts);
Протестировано и работает.