これはWordPressに限ったことではないですが、コールバック関数を作成するときにミスってしまいがちなので備忘録しておきます。

リファレンスにも載ってることですが、add_action で渡したコールバック関数には引数が一つ渡されます。do_action でコールバックされるときに、各フックごとに定義された引数を配列にして渡します。このとき注意するべきことは、引数が何も無いことはなく少なくとも空の配列が渡されること。

なので、汎用的な関数をコールバックにも用いたい場合は引数の扱いを慎重にする必要があり、どうしてもそれが不可能な場合はコールバック専用のラッパ関数を作成しなくてはなりません。

たとえば、こんな汎用関数を作成してそれをフックさせても使いたいとします。

function string_of_today( $echo = true )
{
	$str = date( 'Y/m/d' );
	if( $echo )
		echo $str;
	else
		return $str;
}

そして、これをたとえば ‘wp_footer’ にフックさせます。

add_action( 'wp_footer', 'string_of_today' );

この場合、string_of_today に渡される引数は空の配列 array() です。

なので、string_of_today の引数 $echo はデフォルトの true で上書きされることなくそのまま評価されてしまい、期待していた echo $str; は実行されません。

これを正しくしたいなら元の関数を次のように書き換える

function string_of_today( $echo = true )
{
	if( is_array( $echo ) )
		$echo = true;

	$str = date( 'Y/m/d' );
	if( $echo )
		echo $str;
	else
		return $str;
}

か、どうしてもそれを変更したくないならば、次のようなラッパ関数を作成してそれを代わりに渡すことが必要です。

function cb_string_of_today()
{
	return string_of_today( true );
}

add_action( 'wp_footer', 'cb_string_of_today' );