日付がdd/mm/yyyyという形式の日付カスタムフィールドで投稿を並べ替えるためにクエリを作成しようとしています。
この例のようにget_results
でデータベースに直接問い合わせることで動作します。
$querystr = "
SELECT *
FROM wp_posts, wp_postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = 'my_cutom_date'
AND wp_posts.post_status = 'publish'
AND wp_posts.post_type = 'post'
ORDER BY STR_TO_DATE(wp_postmeta.meta_value, '%d/%m/%Y') ASC
";
しかし、WP_Query
フィルタを使って、この振る舞いをposts_where
に置き換えたいと思います。私はこれまでのところ得た:
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 10,
'meta_key' => 'my_custom_date'
);
function filter_orderby( $orderby = '' ) {
global $wpdb;
$orderby .= " ORDER BY STR_TO_DATE($wpdb->postmeta.meta_value, '%d/%m/%Y') ASC ";
return $orderby;
}
add_filter( 'posts_orderby', 'filter_orderby' );
しかし、それは何も返さないようです。何が足りないの?
posts_orderby
のフィルタはORDER BY
で始まらない文字列を返すべきです、WordPress はそれ自身を追加します 。
デフォルトではWordPressはpost_date
でフィルタリングします。そうしたくない場合は、order句を上書きして、追加しないでください。だからあなたのフィルタはこのように見えるはずです:
function filter_orderby( $orderby ) {
global $wpdb;
return " STR_TO_DATE({$wpdb->postmeta}.meta_value, '%d/%m/%Y') ASC ";
}