カスタムフィールドに入っている日付をプルダウンに入れたい!っていう作業がありまして、the_post()で回して値を集めたらすごいことになりそうだったので、しょうがない$wpdbでポチポチ書きましょうか、書いてみたらMySQLのDATE_FORMATがエラーで動かないよってビビりまくったお話。
$sql = 'SELECT
DATE_FORMAT( meta_value, '%Y%m' ) AS view,
DATE_FORMAT( meta_value, '%Y年%c月' ) AS value
FROM ' . $wpdb->posts . '
LEFT JOIN ' . $wpdb->postmeta . ' ON ' . $wpdb->postmeta . '.post_id = ' . $wpdb->posts . '.id
WHERE post_type = ' 投稿タイプ '
AND ' . $wpdb->posts . '.post_status = 'publish'
AND meta_key = %s
AND meta_value != ''
GROUP BY DATE_FORMAT( meta_value, '%Y%m' )
ORDER BY meta_value DESC';
$query = $wpdb->prepare( $sql, $meta_key );
$result = $wpdb->get_results( $query );
DATE_FORMAT使えないんじゃ、GROUP BYできないじゃないですか、えー!!困り果ててたら、Stack Overflowに答えがありました。さすが!
こたえはこちら
WordPress: $wpdb prepare fails when using mysql DATE_FORMAT
$wpdbオブジェクトで%を使う時は、%でエスケープする必要があるとのこと。たぶん、プレースホルダー(prepare)の%とぶつかるんだと思います。
以上を踏まえてきちんと動く正しいSQLがこちら。もし使われるのであれば$meta_keyを渡してください。
$sql = 'SELECT
DATE_FORMAT( meta_value, '%%Y%%m' ) AS view,
DATE_FORMAT( meta_value, '%%Y年%%c月' ) AS value
FROM ' . $wpdb->posts . '
LEFT JOIN ' . $wpdb->postmeta . ' ON ' . $wpdb->postmeta . '.post_id = ' . $wpdb->posts . '.id
WHERE post_type = ' 投稿タイプ '
AND ' . $wpdb->posts . '.post_status = 'publish'
AND meta_key = %s
AND meta_value != ''
GROUP BY DATE_FORMAT( meta_value, '%%Y%%m' )
ORDER BY meta_value DESC';
$query = $wpdb->prepare( $sql, $meta_key );
$result = $wpdb->get_results( $query );