2013-09-27 3 views
2

Я хочу, чтобы показать все Wordpress сообщения на одной странице, и есть результаты, показывающие, как в этом примере:получить WordPress сообщения, сгруппированных по месяцам

сообщений за сентябрь (текущий месяц)

1- первый пост 2- второй пост 3- третье сообщение

Сообщения на следующий месяц

2- первый пост 2- второй пост 3- третий пост

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

<?php 
$month = date('M'); 
$arrgs = array('orderby' => $month); 
$myposts = get_posts($arrgs); 
foreach($myposts as $post) : 
setup_postdata($post); 
?> 
<div class="post-item"> 
    <div class="post-info"> 
     <h2 class="post-title"> 
      <a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"> 
       <?php the_title(); ?> 
      </a> 
     </h2> 
     <p class="post-meta">Posted by <?php the_author(); ?> Published in <strong><?php echo $month; ?></strong></p> 
    </div> 
</div> 
<?php endforeach; wp_reset_postdata(); ?> 

ответ

2

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

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>    
<ul> 
    <?php 
    $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_status = 'publish' ORDER BY post_date ASC"); 

    foreach($years as $year) : ?> 

    <h4><li><a href="<?php echo get_year_link($year); ?> "><?php echo $year; ?></a> 
    <ul> 
     <?php $months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC"); 

     foreach($months as $month) : ?> 

     <h4> 
     <li> 
     <a href="<?php echo get_month_link($year, $month); ?>"><?php echo date('F', mktime(0, 0, 0, $month));?></a> 
     <ul> 
      <?php $theids = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish' AND MONTH(post_date)= '".$month."' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC"); 

      foreach ($theids as $theid): ?> 

      <h4 style= font-style:italic;><li><a href="<?php bloginfo('url'); ?>?p=<?php echo $theid->ID; ?>"><?php echo $theid->post_title; ?></a></li></h4> 

      <?php endforeach; ?> 

     </ul>     
     </li></h4> 

     <?php endforeach;?> 

     </ul> 
    </li></h4> 

    <?php endforeach; ?> 

    </ul> 
    </div> 
</div> 

Theres также this плагин. Он отлично работает, но уровень настройки клещей не на одном уровне. Это, безусловно, работает, хотя и будет самым быстрым и простым решением вашей ситуации.

Счастливое кодирование!

+0

Отлично, это сработало. Спасибо. – user2751886

+0

Downvoting для использования нескольких запросов внутри циклов. Это просто неправильно. –

+0

@iKindred, позаботьтесь о предоставлении более адекватного решения? – zillaofthegods

5

@zillaofthegods вот мое решение: я бы использовал только 1 запрос, чтобы получить все сообщения, которые я хочу отобразить, а затем использовать PHP для тяжелой работы. Хорошей идеей было бы спросить год и месяц как дополнительные столбцы, так как нам это понадобится позже.

global $wpdb; // Don't forget 

$collection = $wpdb->get_results(" 
    SELECT YEAR(p.post_date) AS post_year, MONTH(p.post_date) AS post_month, p.* 
    FROM {$wpdb->posts} AS p 
    WHERE p.post_type = 'post' AND p.post_status = 'publish' 
    ORDER BY p.post_date DESC 
", OBJECT); 

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

// Loop once to grab the years 
foreach ($collection as $year): 

    // Loop for a second time to grab the months inside a year 
    foreach ($collection as $month): 

    // Continue unless years match 
    if ($month->post_year != $year) continue; 

    // Loop one more time to grab the posts inside the month, inside the year 
    foreach ($collection as $post): 

     // Continue unless months and years match 
     if ($post->post_year != $year || $post->post_month != $month) continue; 

     // You can use the posts data here 

    endforeach; 

    endforeach; 

endforeach; 

В чем польза? Вы ударяете свою БД один раз, и все остальное делается PHP как часть рендеринга шаблона, который можно легко кэшировать.

+1

upvoting для более эффективного решения. спасибо, что взял мой запрос! – zillaofthegods

+0

Добро пожаловать :) –

Смежные вопросы