【WP】$wpdbオブジェクトでMySQLのDATE_FORMATがエラーになる

【WP】$wpdbオブジェクトでMySQLのDATE_FORMATがエラーになる

カスタムフィールドに入っている日付をプルダウンに入れたい!っていう作業がありまして、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 );