Как получить варианты продукта, только если родительский продукт опубликован

Я сделал пользовательский запрос, чтобы получить варианты продуктов, но когда я удаляю продукт, статус его вариантов останется publish, поэтому он выдаст ошибку 404, если клиент попытается просмотреть варианты продукта, удаленные из корзины. Итак, как я могу отфильтровать эти варианты, чтобы получить только те варианты, которые содержат опубликованный родительский продукт?

Мой код:

<?php  
$args = ['post_type'  => ['product_variation'],  
            'orderby'    => 'meta_value_num',
            'order'      => 'DESC',
            'post_status'=>'publish',
            'product_type'=>'variation',
            'meta_query' => [
                [
                    'key'     => 'attribute_pa_flower-type',
                    'value'   => $flower_type,
                    'compare' => '=',
                ]
            ]
        ];
?>

<?php $the_query = new WP_Query( $args );?>

<?php if ( $the_query->have_posts() ) : ?>

    <div class="boxes">
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        ...

person Mohammad    schedule 25.01.2017    source источник


Ответы (1)


Сделайте что-нибудь вроде этого:

//to hold the published product id which has vriation.
$has_variable_ids = [];

$args_parent = [
    'post_type' => ['product'],
    'post_status' => 'publish',
    'posts_per_page' => -1
];

$pubished_post = new WP_Query($args_parent);
if (!empty($pubished_post->posts))
{
    foreach ($pubished_post->posts as $post)
    {
        $_product = wc_get_product($post->ID);
        if ($_product->is_type('variable'))
        {
            // Product has variations
            $has_variable_ids[] = $post->ID;
        }
    }
}


$args = [
    'post_type' => ['product_variation'],
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'post_status' => 'publish',
    'post_parent__in' => $has_variable_ids,
    'meta_query' => [
        [
            'key' => 'attribute_pa_flower-type',
            'value' => $flower_type,
            'compare' => '=',
        ]
    ]
];

$the_query = new WP_Query($args);

Обратите внимание: я не проверял это, но оно должно работать.

Надеюсь это поможет!

person Raunak Gupta    schedule 25.01.2017
comment
да, это работает, что я наконец сделал, так это получил родительский пост для каждого варианта и проверил его статус внутри цикла while, но я изменю свой код на ваш, потому что он быстрее - person Mohammad; 25.01.2017
comment
Я не нашел функции WooCommerce для этого, поэтому я сформировал свои знания о WP. - person Raunak Gupta; 25.01.2017