ショートコードの作成方法は、CODEX の ショートコードAPIに詳しく書かれていますので、そちらを参照してください。
古い記事ですが、WordPressのショートコードを自作してみる | webOpixelでは、分かりやすく記述されていますので、合わせて読んでいただくと良いかと思います。
最大の違いは、ショートコード内では、echo で出力を行わず、表示する文字列を作成し、return しなければならない点です。
それ以外は、概ね上記のコードを活かせるはずです。
jim912様
ご教示ありがとうございます。リンクを貼っていただいたページや他のページを参考にしつつショートコードを作成してみました。
希望通りのリストを出力できたのですが、また問題が発生しました。リストがページの上部に表示されます。ショートコードの出力内容は文中に表示したいので、こちらを参照し、書き換えてみたのですが、解消されないままです。
何が問題なのか教えていただけないでしょうか。
function getCatItems($atts, $content = null) {
extract(shortcode_atts(array(
"num" => '',
"cat" => '',
"tag" => '',
), $atts));
global $post;
$oldpost = $post;
$myposts = get_posts('numberposts='.$num.'&order=ASC&orderby=title&category='.$cat.'&tag_id='.$tag);
$html = '';
foreach($myposts as $post) :
setup_postdata($post);
$html.='<li><a href="'.get_permalink().'">'.the_content("","",false).'</a></li>';
endforeach;
return $html;
}
add_shortcode("list", "getCatItems");
[list cat="" tag="" num="-1"]
もう一息ですね。
the_content関数は、実行された時点で出力してしまいますので、まずここを get_the_content 関数に置き換えます。
ただし、CODEXに表示されているように、get_the_content 関数は the_content フィルターを通らないため、改行が付加されなかったり、ショートコードの展開が行われません。
これを通すために
apply_filters( 'the_content', get_the_content() );
として、手動で the_content フィルターを通すようにしてください。
jim912様
ご回答ありがとうございます。
手動で the_content フィルターを通す
とはどのような意味なのでしょうか。
apply_filtersについて調べてみたのですが、語記事が少なく
apply_filters( ‘the_content’, get_the_content() );
をどこに記載すればいいかわかりませんでした。
フィルターフックについての理解は、
WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック
apply_filters については、
WordPressのadd_filterとapply_filtersのまとめ
あたりが分かりやすいと思います。
上記の参考記事で、ちょうど the_content 関数のコードを例に説明されていますが、この関数は、
- get_the_content 関数を用いて、記事の本文を取得し、$content に格納する
- apply_filters 関数で、$content に対して、the_content フィルターの適用を行う
- ]]>の置換処理を行う
- echo で本文の出力を行う
となっています。
apply_filters( 'the_content', get_the_content() );
は、the_content 関数内部の処理の1と2 を同時に行っている処理ですので、この記述は
the_content("","",false)
の部分をそっくり置き換えてください。
無事動くようになりました。
手鳥足取り、詳しく教えていただきありがとうございました。
完成したコードはこちらです。
function getCatItems($atts, $content = null) {
extract(shortcode_atts(array(
“num” => ”,
“cat” => ”,
“tag” => ”,
), $atts));
global $post;
$oldpost = $post;
$myposts = get_posts(‘numberposts=’.$num.’&order=ASC&orderby=title&category=’.$cat.’&tag_id=’.$tag);
$retHtml=’
‘;
$post = $oldpost;
return $retHtml;
}
add_shortcode(“list”, “getCatItems”);
[list cat=”” tag=”” num=”-1″]