Категория__не_in в index.php шаблона Woocommerce не работает - PullRequest
0 голосов
/ 23 мая 2018

Я новичок в PHP и WordPress, поэтому мой вопрос может быть глупым.Хотя я нашел других с похожими вопросами.

На моей главной странице (index.php) я бы хотел исключить товары определенной категории.Я обнаружил, что можно использовать category__not_in в качестве параметра, передаваемого в переменную $ args.но эта опция не работает.Когда я изменяю другие значения в переменной $ args.они применяются.Т.е. если я изменю post_per_page, то он виден сразу.Я использую код ниже и хочу только исключить категорию 28 (может быть больше в будущем).Я пробовал решения, упомянутые в stackoverflow , но безуспешно.A

Мне было интересно, сможет ли кто-нибудь указать мне правильное направление.Спасибо

<section id="content">
<div class="container woocommerce">

    <?php
    remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );

    global $woocommerce_loop, $woocommerce;
    $meta_query = $woocommerce->query->get_meta_query();
    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',     
        'category__not_in' => array( 28 ),
        'ignore_sticky_posts'   => 1,
        'post__not_in' => $slider_arr,
        'posts_per_page' => 9, 
        'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),

    );  

    $products = new WP_Query( $args );
    //query_posts( $args );

        if ( $products->have_posts() ) : $x = 0; ?>

            <div id="posts_cont">

                <?php while ( $products->have_posts() ) : $products->the_post(); ?>         
                    <?php woocommerce_get_template_part( 'content', 'product-home' ); ?>
                    <?php if ($x == 2) { echo '<div class="home_small_box clear"></div>'; $x = -1; } ?>

                <?php $x++; endwhile; // end of the loop. ?>

            </div><!--//posts_cont-->
        <?php //woocommerce_product_loop_end(); ?>

        <div class="load_more_cont">
            <div align="center"><div class="load_more_text">
            <?php
            ob_start();
            //next_posts_link('<img src="' . get_bloginfo('stylesheet_directory') . '/images/loading-button.png" />');
            next_posts_link('LOAD MORE PRODUCT');
            $buffer = ob_get_contents();
            ob_end_clean();
            if(!empty($buffer)) echo $buffer;
            ?>
            </div></div>
        </div><!--//load_more_cont-->                   
        <?php
        global $wp_query;
        //echo '**' . $wp_query->max_num_pages . '**';  
        $max_pages = $wp_query->max_num_pages;
        ?>          
        <div id="max_pages_id" style="display: none;"><?php echo ceil($wp_query->found_posts / 9); //echo $max_pages-1; ?></div>                    

    <?php endif;
    //wp_reset_query();
    wp_reset_postdata();    

?>              
    <div class="clear"></div>

</div><!--//container-->

1 Ответ

0 голосов
/ 23 мая 2018

category__not_in работает только с категориями WordPress, но не для WC. Категории продуктов

В вашем коде есть ошибки, такие как:

  • Категории продуктов пользовательская таксономия , поэтому вместо нее необходимо использовать Налоговый запрос .
  • С Woocommerce 3 woocommerce_get_template_part() устарел и заменен на wc_get_template_part()
  • $meta_query должен использоваться в вашем запросе…
  • $slider_arr не определено (поэтому я прокомментировал это)

Попробуйте вместо этого:

<section id="content">
<div class="container woocommerce">

    <?php
    remove_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_thumbnail', 10 );

    global $woocommerce_loop;

    $products = new WP_Query( array(
        'post_type'     => 'product',
        'post_status'   => 'publish',
        'tax_query'     => array( array(
            'taxonomy'  => 'product_cat',
            'field'     => 'term_id',
            'terms'     => array( 16 ),
            'operator'  => 'NOT IN',
        ) ),
        'meta_query'    => WC()->query->get_meta_query(),
        // 'post__not_in' => $slider_arr,
        'ignore_sticky_posts' => 1,
        'posts_per_page'      => 9,
        'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1),

    ) );

    if ( $products->have_posts() ) : $x = 0; ?>

        <div id="posts_cont">

            <?php while ( $products->have_posts() ) : $products->the_post(); ?>
                <?php wc_get_template_part( 'content', 'product-home' ); ?>
                <?php if ($x == 2) { echo '<div class="home_small_box clear"></div>'; $x = -1; } ?>

            <?php $x++; endwhile; // end of the loop. ?>

        </div><!--//posts_cont-->
        <?php //woocommerce_product_loop_end(); ?>

        <div class="load_more_cont">
        <div align="center"><div class="load_more_text">
        <?php
        ob_start();
        //next_posts_link('<img src="' . get_bloginfo('stylesheet_directory') . '/images/loading-button.png" />');
        next_posts_link('LOAD MORE PRODUCT');
        $buffer = ob_get_contents();
        ob_end_clean();
        if(!empty($buffer)) echo $buffer;
        ?>
        </div></div>
        </div><!--//load_more_cont-->
        <?php
        global $wp_query;
        //echo '**' . $wp_query->max_num_pages . '**';
        $max_pages = $wp_query->max_num_pages;
        ?>
        <div id="max_pages_id" style="display: none;"><?php echo ceil($wp_query->found_posts / 9); //echo $max_pages-1; ?></div>

    <?php endif;
    //wp_reset_query();
    wp_reset_postdata();   

?>              
    <div class="clear"></div>

</div><!--//container-->

Примечание: Я полагаю, что 'product-home' - это пользовательский шаблон продукта, поэтому явместо этого нужно проверить код с значением по умолчанию 'product', чтобы он заработал, и код работает с ним.

...