Отображать каждое сообщение термина таксономии под заголовком «Год и месяц».

У меня есть CPT - "бюллетени" и таксономия "группы бюллетеней"

Я пытаюсь отобразить каждое сообщение под заголовком соответствующего термина со всеми сообщениями с терминами, отображаемыми под ним, с указанием месяца и года, когда они были опубликованы (по дате публикации).

Я думал, что у меня что-то работает, но во время тестирования заметил, что если сообщение имеет тот же «Месяц», он сотрет год и месяц для других сообщений в том же термине, а также для условий ниже него, у меня есть несколько изображений для показа что я имею в виду и код, который я использую до сих пор.

На показанных изображениях я добавил дату публикации к имени файла для ясности, обычно это будет просто имя файла.

Не работает, если месяц даты публикации совпадает Не работает, если месяц совпадает

Работает, если месяц даты публикации отличается

введите здесь описание изображения

Как я могу это решить? мне нужно получить все даты сообщений с отдельным запросом и сохранить это?

Любые примеры приветствуются

/*
 * Custom Template: Archive Newsletters
 */


// Remove stuff
remove_action( 'genesis_loop', 'genesis_do_loop' );

// Add our custom loop
add_action( 'genesis_loop', 'newsletter_archive_loop' );

function newsletter_archive_loop() {


  //fetch the terms for the newsletter-groups taxonomy
  $terms = get_terms( 'newsletter-groups', array (
    'hide_empty' => 'true',
    'exclude' => 67,  //excluding parent term ID 'school-newsletters' - only want to show term children of 'school-newsletters'
  ));

     
  // run a query for each term
  foreach( $terms as $term ) {

    // Define the query
    $args = array(
    'post_type'  => 'newsletters',
    'newsletter-groups' => $term->slug ,
    'posts_per_page' => -1,
    );


    // run the query 

    $query = new WP_Query( $args );
    
    if( $query->have_posts() ) { 

      echo '<div class="letters">'; 
          
        // output the term name in a heading tag    
        echo'<h4 class="term-heading">' . $term->name . '</h4>'; 

        while ( $query->have_posts() ) { $query->the_post();
          
          // get current month
          $current_month = get_the_date('F');
          // get attachements from custom field
          $attachment_id = get_field('newsletter_upload');
          $url = wp_get_attachment_url( $attachment_id );
          $title = get_the_title( $attachment_id );
          // get the filesize
          $filesize = filesize( get_attached_file( $attachment_id ) );
          $filesize = size_format($filesize, 2);

            if( $query->current_post === 0 ) { 
                  echo '<h4 class="date">';
                        the_date( 'F Y' );
                  echo '</h4>';
            
              } else { 

                  $f = $query->current_post - 1;       
                  $old_date =   mysql2date( 'F', $query->posts[$f]->post_date ); 

                  if($current_month != $old_date) {
                    echo '<h4 class="date">';
                          the_date( 'F Y' );;
                    echo '</h4>';
                  }

            } ?>

            <li class="letters-file">
              <a href="<?php echo $url; ?>" title="<?php echo $title; ?>" target="_blank" rel="noopener noreferrer"><?php the_title(); ?></a><span class="letters-file-sz">&nbsp;(<?php echo $filesize; ?>)</span>
            </li> 

        <?php } // endwhile have posts

      echo '</div>'; // close letters div
    
      // use reset postdata to restore orginal query
      wp_reset_postdata();  
      
    } // end if query have posts

  } // end for each

} // end function 

genesis(); // call genesis framework

Удалите оба условия if и else и попробуйте напечатать только echo ''; the_date('F Y'); эхо ''

будут отображаться только даты отдельных сообщений, но не сгруппированные

введите здесь описание изображения

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

введите здесь описание изображения


person andytc    schedule 11.03.2021    source источник
comment
Я думаю, проблема в том, что if($current_month != $old_date) { это условие. потому что в этом случае ваш $current_month будет "март", а $old также будет "март"   -  person Bhautik    schedule 11.03.2021
comment
я бы просто удалить, что еще?   -  person andytc    schedule 11.03.2021
comment
Можете ли вы добавить объяснение вашей логики?   -  person Bhautik    schedule 11.03.2021
comment
Я взял этот раздел кода отсюда - stackoverflow .com/questions/34141251/   -  person andytc    schedule 11.03.2021
comment
Удалите оба условия if и else и попробуйте вывести только echo '‹h4 class=date›'; the_date('F Y'); эхо '‹/h4›'   -  person Bhautik    schedule 11.03.2021
comment
Я отредактировал свой пост, чтобы показать результат этого - дает правильную дату, но не сгруппирован   -  person andytc    schedule 11.03.2021
comment
Если я поменяю их между if( $query->current_post === 0 ) и $f = $query->current_post - 1; на if( $query->current_post -1 и $f = $query->current_post === 0;, все будет работать отлично!   -  person andytc    schedule 11.03.2021
comment
Ну тогда здравствуйте... :)   -  person Bhautik    schedule 11.03.2021
comment
ложная тревога, тестирование показывает, что если я добавляю более 2 сообщений в одну и ту же дату месяца, оно помещает 3-е сообщение отдельно с датой, поэтому получается только 2 сообщения в месяц, а затем начинается сначала ??   -  person andytc    schedule 11.03.2021
comment
это этот раздел - if( $query->current_post -1 ) { , если я изменю это на 2, это сработает, но я предполагаю, что тогда он покажет только 3 сгруппированных, поэтому 4 сообщения не будут работать и т. д. и т. д.   -  person andytc    schedule 11.03.2021
comment
Можете ли вы показать ожидаемый результат в вашем вопросе?   -  person Bhautik    schedule 11.03.2021
comment
Я добавил изображение, чтобы показать ожидаемый результат в конце сообщения.   -  person andytc    schedule 11.03.2021
comment
проверьте мой ответ.   -  person Bhautik    schedule 11.03.2021


Ответы (1)


Вы можете нажать каждый месяц в массиве и проверить, находится ли месяц уже в массиве, а затем не отображать повторяющийся месяц.

/*
 * Custom Template: Archive Newsletters
 */

// Remove stuff
remove_action( 'genesis_loop', 'genesis_do_loop' );

// Add our custom loop
add_action( 'genesis_loop', 'newsletter_archive_loop' );

function newsletter_archive_loop() {

    //fetch the terms for the newsletter-groups taxonomy
    $terms = get_terms( 'newsletter-groups', array (
        'hide_empty' => 'true',
        'exclude' => 67,  //excluding parent term ID 'school-newsletters' - only want to show term children of 'school-newsletters'
    ));
 
    // run a query for each term
    foreach( $terms as $term ) {

        $dates = array();

        // Define the query
        $args = array(
            'post_type'         => 'newsletters',
            'newsletter-groups' => $term->slug ,
            'posts_per_page'    => -1,
        );

        // run the query 
        $query = new WP_Query( $args );
        
        if( $query->have_posts() ) { 

            echo '<div class="letters">'; 
              
                // output the term name in a heading tag    
                echo'<h4 class="term-heading">' . $term->name . '</h4>'; 

                while ( $query->have_posts() ) { $query->the_post();
                  
                    // get current month
                    $current_month = get_the_date('F');
                  
                    // get attachements from custom field
                    $attachment_id = get_field('newsletter_upload');
                    $url             = wp_get_attachment_url( $attachment_id );
                    $title       = get_the_title( $attachment_id );

                    // get the filesize
                    $filesize = filesize( get_attached_file( $attachment_id ) );
                    $filesize = size_format($filesize, 2);

                    if( !in_array(get_the_date( 'F Y' ), $dates ) ){
                        $dates[] = get_the_date( 'F Y' );
                        echo '<h4 class="date">';
                            echo get_the_date( 'F Y' );
                        echo '</h4>';
                    }

                    ?>

                    <li class="letters-file">
                        <a href="<?php echo $url; ?>" title="<?php echo $title; ?>" target="_blank" rel="noopener noreferrer"><?php the_title(); ?></a><span class="letters-file-sz">&nbsp;(<?php echo $filesize; ?>)</span>
                    </li> 

                <?php } // endwhile have posts

            echo '</div>'; // close letters div
        
            // use reset postdata to restore orginal query
            wp_reset_postdata();  
      
        } // end if query have posts

    } // end for each

} // end function 

genesis(); // call genesis framework
person Bhautik    schedule 11.03.2021
comment
Это показывает месяц и год для каждого поста в термине, но не сгруппированные по месяцам и годам, а только по отдельности. - person andytc; 11.03.2021
comment
Виноват. Проверьте мой ответ на редактирование. - person Bhautik; 11.03.2021
comment
Notice: Undefined variable: dates in archive-newsletters.php on line 57 в некоторых терминах даты вообще не указаны - person andytc; 12.03.2021
comment
Подождите... в этот раз я ошибся, не скопировал весь код, пропустил $dates = array();, работает, вы гений, сэр! благодарю вас - person andytc; 12.03.2021