WordPress woocommerce, сортировка по избранным, новым (с диапазоном дат), порядок меню, затем заголовок

#php #wordpress #sorting #woocommerce

#php #wordpress #сортировка #woocommerce

Вопрос:

Я пытаюсь установить сортировку по умолчанию для своих продуктов в WordPress с помощью Woocommerce, чтобы сначала показать мне все рекомендуемые продукты, затем любые новые продукты, которые не старше 120 дней, затем показать все остальное по порядку меню и, наконец, по названию. Ниже приведен мой исходный код, который делает то, что я хочу, но я понятия не имею, как установить диапазон дат 120 дней или новее.

 add_filter('woocommerce_get_catalog_ordering_args', 'am_woocommerce_catalog_orderby');
function am_woocommerce_catalog_orderby( $args ) {
  if(!$_GET['orderby']) {
    $args['orderby'] = array( 
      'meta_value' => 'DESC', 
      'date' => 'DESC', 
      'menu_order' => 'ASC', 
      'title' => 'ASC'
    );      
    $args['meta_key'] = '_featured';
    return $args;
  }
}
  

Обновить

Хорошо, итак, я провел некоторый поиск и нашел некоторый код, который должен перебирать аргументы, а затем удалять дубликаты, будучи новичком, я не уверен, чего мне не хватает. Мой приведенный ниже код выдает ошибку: Fatal error: Call to a member function have_posts() on null итак, я попытался добавить $loop = new WP_Query( $args ); , но затем код ничего не делает. Итак, я потерялся и ищу некоторые подсказки о том, что мне нужно исправить. Спасибо!

 add_filter('woocommerce_get_catalog_ordering_args', 'am_woocommerce_catalog_orderby');
function am_woocommerce_catalog_orderby( $my_post_array ) {
    if(!$_GET['orderby']) {
      //First loop - show featured
      $args['orderby'] = array( 'meta_value' => 'DESC' );
      $args['meta_key'] = '_featured';    


      while ( $loop->have_posts() ) : $loop->the_post();
          $post_id = get_the_ID();
          $my_post = my_post_function($post_id);
          //Store the items in an array
          $my_post_array [] = $my_post;
          query_posts($args); 
      endwhile;


      //Second loop - Show newer than 6 months 
      $args = array(   
          'orderby' => 'date',
          'order' => 'DESC',
          'date_query' => array(
          array(
              'before' => '6 months ago',
              ),
          )
      );

      while ( $loop->have_posts() ) : $loop->the_post();
          $post_id = get_the_ID();
          $my_post = my_post_function($post_id);
          //Store the items in an array
          $my_post_array [] = $my_post;
          query_posts($args); 
      endwhile;

      //Third loop - show everything else and sort by menu_order and title
      $args['orderby'] = array( 'menu_order' => 'ASC', 'title' => 'ASC' );

      while ( $loop->have_posts() ) : $loop->the_post();
          $post_id = get_the_ID();
          $my_post = my_post_function($post_id);
          //Store the items in an array
          $my_post_array [] = $my_post;
          query_posts($args); 
      endwhile;

      //Remove duplicate entries from the array
      array_unique ( $my_post_array, SORT_STRING );

  }
}
  

Обновление 2

Мне еще не повезло, есть ли шанс, что кто-нибудь может взглянуть на мой последний код выше и дать мне несколько идей о том, как попробовать? Похоже, этот цикл не работает для этого фильтра при добавлении в functions.php , может быть, мне нужно сделать что-то другое. Любая помощь приветствуется!

Комментарии:

1. Вероятно, вы не сможете получить это из одного запроса. Вам нужно будет ограничить ВСЕ сообщения публикациями за последние 120 дней, и поэтому, если у вас были какие-либо рекомендуемые продукты старше этого, они будут исключены.

2. @cale_b Могу ли я выполнить 2 или 3 запроса? Я новичок в этом, но что, если я запрашиваю все сообщения и получаю только избранные, а затем только новые, которые не представлены не старше 120 дней, и, наконец, все остальное? Я просто понятия не имею, возможно ли это или как это сделать.

3. Да, это то, что вы хотели бы сделать. Два запроса. И вам, вероятно, нужно будет сделать это в шаблоне (два запроса), а затем загрузить соответствующие части шаблона, чтобы вам не приходилось дублировать код в циклах. Также имейте в виду систему переопределения шаблонов WooCommerce: docs. woocommerce.com/document/template-structure

4. @cale_b Итак, я понимаю большую часть того, что вы говорите, я просто понятия не имею, как это сделать. Я предполагаю, что я бы переопределил шаблон цикла orderby в моей теме, но есть идеи о том, как я буду писать функции? Кажется, я ничего не могу найти о настройке диапазона дат. Мне также нужно будет провести некоторое исследование о том, как выполнять несколько запросов, как я уже сказал, очень новичок в этом. Спасибо!

5. Хорошо, чтобы помочь больше, мне нужно знать, на какой странице вы пытаетесь отобразить это. Это список продуктов «по умолчанию»? Все списки продуктов? Списки категорий? и т.д.