2013-02-27 56 views
0

我正在構建一個投資組合網站的index.php,在那裏我想按他們的年份和meta_key顯示帖子。元鍵用作「特色項目」選項。按年份獲取帖子,元鍵返回空

在開始時,我做了一個定製的分類標準「Yea​​r」,其中包含不同項目年份的術語,並使用foreach填充旁邊的帖子。

<?php $years = get_terms('year', 'orderby=name&order=desc&hide_empty=1'); ?> 

<?php foreach($years as $year) : ?> 
<div class="front-index"><p><?php echo $year->name; ?></p></div> 

    <?php 
    $year_query = array( 
     'post_type' => 'works', 
     'meta_key' => 'post_h2_mask', 
     'meta_value' => '1', 
     'taxonomy' => 'year', 
     'term' => $year->slug); 
    $year_posts = new WP_Query ($year_query); 
    ?> 

<?php while ($year_posts->have_posts()) : $year_posts->the_post(); ?> 

… 

這並不即使工作了,因爲條件已經具備價值的東西是與它的元價值功能標籤的條款不工作(!?),因爲它仍然輸出年,該帖子沒有meta_value。

...

因此,我認爲,解決辦法可能是使用WordPress的自己「發表」日期由今年來填充崗位。爲此,我找到了一個mysql代碼片段,並且完成了一些工作。

<?php 
$years = $wpdb->get_col(" 
      SELECT DISTINCT YEAR(post_date) 
      FROM $wpdb->posts 
      WHERE post_status = 'publish' 
      AND post_type = 'works' 
      ORDER BY post_date DESC"); 
?> 

    <?php foreach($years as $year) : ?> 
    <div class="front-index"><p><?php echo $year; ?></p></div> 

     <?php 
     $year_query = array( 
      'post_type' => 'works', 
      'meta_key' => 'post_h2_mask', 
      'meta_value' => '1', 
      'year' => $year 
      ); 
     $year_posts = new WP_Query ($year_query); 
     ?> 

    <?php while ($year_posts->have_posts()) : $year_posts->the_post(); ?> 
    <?php  
    $attachments = new Attachments('attachments'); 
    if($attachments->exist()) :  
    ?> 

    <div class="front-work"> 
    <div class="wraptocenter"> 
     <a href="<?php the_permalink() ?>" rel="bookmark"> 
     <?php the_post_thumbnail('front-thumbnail'); ?> 
     <p><?php the_title(); ?><br /><span class="image-count"> 
     <?php 
     $project_cats = get_the_terms($post->ID, 'medium'); 
     $project_cats = array_values($project_cats); 

     for($cat_count=0; $cat_count<count($project_cats); $cat_count++) { 

      echo '<span>'.$project_cats[$cat_count]->name.'</span>'; 
      if ($cat_count<count($project_cats)-1){ 
       echo ', '; 
      } 
     } 
     ?>,  
     <span><?php echo $attachments->total(); ?> images</span></span></p> 
     </a> 
    </div> 
    </div> 

<?php endif; endwhile; ?> 
<?php endforeach ?> 

這得到他們的div的年份,但它只顯示一個鏈接的帖子,這是2006年只有一個!?

如何讓他們的年度所屬,但與meta_key旁邊的帖子?

回答

0

好的。

我想我這次得到了它自己。與第一個問題是:

以上的回報職位的查詢,這在歷史, 即「從X年X月X日的帖子」一個具體的日期時間。他們無法從相對於現在的時間段獲取 帖子,因此諸如「來自過去30天的帖子 」或「來自上一年的帖子」的查詢不可能使用基本查詢的 ,並且需要使用posts_where過濾器要完成 。以下示例使用posts_where過濾器,並且對於大多數與時間相關的查詢應該是可修改的。

通過WordPress CODEX。所以如果你想WP_查詢某一年,你還需要一個月的時間。

對於MYSQL查詢部分,我使用了一個來自wordpress.org論壇的發現代碼,並用它弄了個擺弄。這不可能是最好的,但適合我。

代碼通過一年meta_value讓WordPress的帖子:

<?php 
$years = $wpdb->get_col(" 
      SELECT DISTINCT YEAR(post_date) 
      FROM $wpdb->posts 
      LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 
      WHERE wp_postmeta.meta_key = 'your_meta_key' 
      AND wp_postmeta.meta_value = 'your_meta_vaue' 
      AND post_status = 'publish' 
      AND post_type = 'your_post_type' 
      ORDER BY post_date DESC"); 

    foreach($years as $year) :  
?> 
    <p><?php echo $year ?></p> 

    <?php 
    $months = $wpdb->get_col(" 
       SELECT DISTINCT MONTH(post_date) 
       FROM $wpdb->posts 
       WHERE post_status = 'publish' 
       AND post_type = 'your_post_type' 
       AND YEAR(post_date) = '".$year."' 
       ORDER BY post_date DESC"); 

     foreach($months as $month) : 
    ?> 
     <?php 
     $posts = $wpdb->get_col(" 
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts 
        LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id 
        WHERE wp_postmeta.meta_key = 'your_meta_key' 
        AND wp_postmeta.meta_value = 'your_meta_value' 
        AND post_status = 'publish' 
        AND post_type = 'your_post_type' 
        AND MONTH(post_date) = '".$month."' 
        AND YEAR(post_date) = '".$year."' 
        ORDER BY post_date DESC"); 

      foreach($posts as $post) : 
     ?> 

      <!-- your specific post html & php --> 

     <?php endforeach;?> 
    <?php endforeach;?> 
<?php endforeach;?>