【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 );