Как я могу получить только те категории, в которых есть товары в продаже? - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь запрашивать категории продуктов woocommerce, но только те, которые есть в продаже. Есть ли возможности? Результатом является иерархия parent> child. Я хочу показать как родителя, так и его ребенка. например, если у ребенка есть продукт в продаже, распечатайте и родительскую категорию.

Вот код, который я написал до сих пор

    <ul class="accordion list-group sub-catalog">
<?php  $terms = get_terms('product_cat', array( 'parent' => 0, 'exclude' => '15' ));
     if( $terms ): 
     $original_query = $wp_query;
     foreach ( $terms as $key => $term ):
     $child = get_terms(
              'product_cat',
               array(
                   'child_of' => $term->term_id,
                   'hide_empty' => true
               )
          );
        ?>
        <li class="accordion-card list-group-item">
                                        <div class="acc-card-title">
                                            <a href="<?php echo get_term_link($term); //echo $term->name; ?>"><?php echo $term->name; ?></a>
                         <?php if ( ! $child ){ ?>                              
<?php 
} else {
    ?>
    <span class="fa fa-plus"></span>
    <?php
}
?>
                                        </div>
          <ul class="accordion list-group sub-catalog">
          <?php
          $child_terms = get_terms(
              'product_cat',
               array(
                   'child_of' => $term->term_id,
                   'hide_empty' => true
               )
          );
          foreach ( $child_terms as $child_term  ) {
             $re_child_terms = get_terms(
                 'product_cat',
                 array(
                     'child_of' => $child_term->term_id,
                     'hide_empty' => true
                 )
             );
             if ( ! $re_child_terms ){
             ?>
                <li class="accordion-card list-group-item">
                                                <div class="acc-card-title">
                                                    <a href="<?php echo get_term_link($child_term);?>"> <?php echo $child_term->name; ?></a>
                                                </div>
                                            </li>
        <?php
        }
     }
     ?>
     </ul>
  </li>
<?php
endforeach;
$wp_query = null;
$wp_query = $original_query;
?>
</ul>
<?php endif; ?>

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Код ниже решил проблему.

<ul class="accordion list-group sub-catalog">
                                                                                <?php
        $args = array(
            'post_type'      => 'product',
            'posts_per_page' => -1,
            'orderby' => 'rand',
            'meta_query'     => array(
                    'relation' => 'OR',
                    array( // Simple products type
                        'key'           => '_sale_price',
                        'value'         => 0,
                        'compare'       => '>',
                        'type'          => 'numeric'
                    ),
                    array( // Variable products type
                        'key'           => '_min_variation_sale_price',
                        'value'         => 0,
                        'compare'       => '>',
                        'type'          => 'numeric'
                    )
                )
        );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ) {

$alreadyDisplayed = [];
            while ( $loop->have_posts() ) : $loop->the_post();


$term_list = wp_get_post_terms($post->ID, 'product_cat', array("all"));
foreach($term_list as $term_single) {
    if ( !in_array( $term_single->name, $alreadyDisplayed) ) {
        echo ' <li class="accordion-card list-group-item">
                                        <div class="acc-card-title"><a href="'.get_term_link($term_single).'" class="salecats">';
        echo $term_single->name;
        echo '</a><br></div>
            </li>';
        $alreadyDisplayed[] =  $term_single->name;
    }
}
            ?>
<?php

            endwhile;
        } else {
            echo __( '' );
        }
        wp_reset_postdata();
    ?>  </ul> 
0 голосов
/ 21 января 2020
<ul class="accordion list-group sub-catalog">
                                                                                <?php
        $args = array(
            'post_type'      => 'product',
            'posts_per_page' => -1,
            'orderby' => 'rand',
            'meta_query'     => array(
                    'relation' => 'OR',
                    array( // Simple products type
                        'key'           => '_sale_price',
                        'value'         => 0,
                        'compare'       => '>',
                        'type'          => 'numeric'
                    ),
                    array( // Variable products type
                        'key'           => '_min_variation_sale_price',
                        'value'         => 0,
                        'compare'       => '>',
                        'type'          => 'numeric'
                    )
                )
        );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ) {
$terms = [];
            while ( $loop->have_posts() ) : $loop->the_post();

            $terms = array_diff($terms,wp_get_post_terms( get_the_id(), 'product_cat',['fields'=>'ids'] ) );
$term  = reset($terms);

            ?>
            <li class="accordion-card list-group-item">
                                        <div class="acc-card-title">
                                            <a href="<?php echo get_term_link($term);  ?>"><?php echo $term->name; ?></a>
                                        </div>
            </li>
                <?php

            endwhile;
        } else {
            echo __( '' );
        }
        wp_reset_postdata();
    ?>  </ul>

так я получаю товары в продаже и получаю название их категории. где использовать функцию array_diff

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...