Изменение продукта Запрос 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', запрос сработает. Почему?

Author: LoicTheAztec, 2018-03-18

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);

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

 4
Author: LoicTheAztec, 2018-05-08 20:20:36