昨日、ショートコード作ったけど思った場所に表示されない!という質問があったので回答しました。
ああ、単純な話で
echo したんじゃないかな?
答えは return なんですよ
サンプルショートコード
サンプルコード見るとこうなっています。
// [foobar]
function foobar_func( $atts ){
return "foo and bar";
}
add_shortcode( 'foobar', 'foobar_func' );
…たしかに foobar_func 関数の中で
return してますよね。
HTML出力しようとしてみましょう
ちょっとHTML足しちゃうと…
// [foobar]
function foobar_func( $atts ){
?>
<table>
<tr><th>名前</th><th>住所</th></tr>
<tr>
<td>さとーさん</td>
<td>にっぽんのどこか</td>
</tr>
</table>
<?php
}
add_shortcode( 'foobar', 'foobar_func' );
こういうコードになりがちです。
すると return していないんです。
厳密に言うと echo してるんですね。
これだとだめです。
echo ではなく return
echo してると、echo だけに…
出ますよ。どこかには(笑)
これが正解
この場合は下記のようにします。
// [foobar]
function foobar_func( $atts ){
ob_start();
?>
<table>
<tr><th>名前</th><th>住所</th></tr>
<tr>
<td>さとーさん</td>
<td>にっぽんのどこか</td>
</tr>
</table>
<?php
$html = ob_get_contents();
ob_end_clean();
return $html;
}
add_shortcode( 'foobar', 'foobar_func' );
こんな感じです。
一旦バッファに出力したものをためて return !
これでOK!