2016-06-23 198 views
0

我使用此列出所有文章標題...排序按自定義字段日期

<?php 
$args = array(
    'posts_per_page' => -1, 
    'post_type'   => 'post', 
    'post_status'  => 'publish', 
    'orderby'   => 'title', 
    'order'    => 'ASC' 
); 

query_posts($args); 
if (have_posts()) : 
    while (have_posts()) : 
    the_post(); ?> 
<p> 
    <?php the_title(); ?> 
</p> 
<?php endwhile; 
    endif; 
    wp_reset_query(); 
?> 

...這工作正常。

我的每篇文章還有一個自定義字段,名爲start_date。所有這些開始日期都以DD-MM-YYYY格式輸入(例如:10-03-2016)。

我需要做的事情(我不是如果這可以完成的話)是start_date(而不是title)。

爲了進一步說明,如果有3個員額,像這樣的開始日期...

後1:2016年1月11日

後2:2016年3月1日

後3:2016年12月7日

...的職位將顯示在順序....

後2

後3

後1

...因爲這是正確的日期順序。

我希望這是有道理的。

乾杯。

回答

0

在wordpress中WP_Query類接受參數爲後期過濾器提供了更多幫助。 你可以在官方站點文檔中提供自定義元字段接受在查詢參數順序和orderby。

https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

我有兩個方法,在這種情況下處理。

  1. 您在開始日期的日期格式不正確mysql日期格式(YYYY-MM-DD)。如果您的日期格式將同MySQL的格式,所以你只需要改變詢問參數,如:
 
    $args = array(
    'posts_per_page' => -1, 
    'post_type'   => 'post', 
    'meta_key'   => 'start_date', 
    'post_status'  => 'publish', 
    'orderby'   => 'meta_value', 
    'meta_type'   => 'DATE', 
    'order'    => 'ASC' 
); 
  • 如果你不想改變每一個每一個職位的日期格式或者您有許多帖子難以在每個帖子上更改日期格式,因此您可以添加過濾器來覆蓋訂單參數。
  • 完整代碼

    <?php 
        $args = array(
         'posts_per_page' => -1, 
         'post_type'   => 'post', 
         'post_status'  => 'publish', 
         'meta_key'   => 'start_date', 
         'orderby'   => 'title', 
         'order'    => 'ASC' 
        ); 
    add_filter('posts_orderby', function($orderby){ 
    return 'STR_TO_DATE(wp_postmeta.meta_value, "%d-%m-%Y") ASC'; 
    }); 
    query_posts($args); 
    if (have_posts()) : 
        while (have_posts()) : 
        the_post(); ?> 
    <p> 
        <?php the_title(); ?> 
    </p> 
    <?php endwhile; 
        endif; 
        wp_reset_query(); 
    ?> 
    

    希望對英文不好這有助於你感到難過。