記事内に特定カテゴリの新着一覧を出すショートコード

記事の中で新着記事一覧を出したりというプログラムを書けたら便利だと思うことはありませんか?
WordPress標準でショートコードというものがあり、これを使うと記事やページ中で特定のプログラムを呼び出すことが可能になります。
標準で使われているのは、画像ギャラリーを出すための[gallery]とか、キャプション付き画像を出すための[caption]などです。

このショートコードという機能を利用して、独自のプログラムを記事中に埋め込むことが可能です。
ここでは、記事内に特定のカテゴリの新着記事一覧を出力するショートコードの作り方をご紹介します。

まず、テンプレートのfunctions.phpに以下のようにプログラム部分を記述します。

function getCatItems($atts, $content = null) {
	extract(shortcode_atts(array(
		"num" => '5',
		"cat" => ''
	), $atts));
	global $post;
	$oldpost = $post;
	$myposts = get_posts('numberposts='.$num.'&order=DESC&orderby=post_date&category='.$cat);
	$retHtml='<ul>';
	foreach($myposts as $post) :
		setup_postdata($post);  
		$retHtml.='<li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>';
	endforeach;
	$retHtml.='</ul>';
	$post = $oldpost;
	return $retHtml;
}
add_shortcode("list", "getCatItems");

簡単に解説すると、$attsにショートコードに設定されたパラメータが入ります。
ここでは、numは件数、catはカテゴリIDとしています。

記事中で呼び出すことを想定し、処理中の$post変数は$oldpostに待避しておき、処理終了後に$postに戻します。
処理の中身は、get_postsを使いcatで指定したカテゴリの新着記事をnum件取得して出力するhtmlを返すというだけのシンプルなものです。

functionの外にadd_shortcodeという関数がありますが、これがショートコードをハンドリングして関数を呼び出す役割を果たします。
引数のlistがショートコードの名前、getCatItemsが呼び出されるfunctionの名前です。

実際の呼び出しは、記事中にhtmlモードで、[list cat="1" num="10"]のように書きます。

記事内に特定カテゴリの新着一覧を出すショートコードへのコメント

素晴らしい情報サンキューです!!

投稿者: takashi

お役に立てたようで嬉しく思います。
今後ともよろしくお願いいたします!

投稿者: jun

はじめまして。ご紹介のものが求めていた内容にぴったりだったので喜んで飛びついたのですが、functions.phpに上記のコードを追加したところ
”Fatal error: Call to undefined function add_shortcode() in /home/******/public/www/wp_test/wp-includes/functions.php on line 4317”
となりうまくいきません。
該当の4317行目には
”add_shortcode(“list”, “getCatItems”); ”が記述されています。
Wordpressのバージョンは3.01の英語版です。PHP素人で申し訳ないのですが、何かアドバイスがいただければ嬉しいです。

投稿者: himpotan

コメントおよびTwitterでのフォローありがとうございます。
undefined functionとのエラーは、文字通りadd_shortcode()という関数が定義されていませんという意味です。
英語版のcodexも確認してみましたが、add_shortcode自体は存在するようですので、テンプレートの展開時にこの関数を呼び出せるはずです。

パスがwp-includes/functions.phpとなっていますが、WordPressのコアファイル側に追加しても動かないかもしれません。(未検証です)
ご使用中のテンプレートのfunctions.php側に追加してみてください。
パスで言うと、wp-content/themes/(テーマ名)/functions.phpです。(日本語版の場合ですが、英語版でも同じだと思います)

投稿者: jun

丁寧なご回答ありがとうございます!
ちゃんと「テンプレートの」と本文中にも書いてらっしゃいましたね!!!ちゃんと見ろよですね、本当にスミマセンでした。
お陰さまで、きちんと表示できるようになりました。
すばらしい、感激です。余計なプラグインを入れたくなかったので、とても嬉しいです。
どうもありがとうございました!

投稿者: himpotan

うまく行ったみたいで良かったです。
今後ともよろしくお願いします。

投稿者: jun

はじめまして。素晴らしいショートコードの解説ありがとうございます。

タイトルに加えて本文を出力させる事ってできるでしょうか?

下記のようにコードを書いてみたのですが、なにやら表示がおかしくなってしまって。

foreach($myposts as $post) :
setup_postdata($post);
$retHtml.='<a href=”‘.get_permalink().'” rel=”nofollow”>’.the_title(“”,””,false).'</a>’.the_content().”;
endforeach;

the_content()をループ内で使うのはNG、と言うことなんでしょうか?

投稿者: datomo

コメントありがとうございます。
the_content()の場合は出力までしてしまうので、$post->post_content ではダメでしょうか。
ループ内で使うというより、ショートコード内ではNGというイメージです。

投稿者: jun

さっそくのご返信ありがとうございます。おかげさまでうまく表示することができました。

ヘタなコーディングで恥ずかしいですが、下記、一応の成功例を。

$retHtml.='<a href=”‘.get_permalink().'” rel=”nofollow”>’.the_title(“”,””,false).'</a>’.mb_substr($post->post_content, 0, 1000).”;

その後、カスタムフィールドを使ってそのページに表示するカテゴリーを指定する方法が分かったので、結局はそちらを使うことになりました。

投稿者: datomo

情報共有いただきありがとうございます。
実現したいことに対していろいろな方法があると思いますので、機能やパフォーマンスで一番適した方法を選ばれると良いと思います。

※URLがオーバーフローしてリンク切れになってしまっていましたので編集させていただきました。

投稿者: jun

[…] 的に更新できるようにする」なんてことは到底無理!というか、ヤル気なし! ということでググってみたら、ありました! 記事内に特定カテゴリの新着一覧を出すショートコード:APPOFIT […]

[…] WPショートコードについて WPのショートコードは、Ver.2.5から追加された機能で、自作関数を投稿記事上で使えるようにしたものです。今回取り上げた内容は初心者向けで、WEBで紹介されている方も多い項目となっています。一応、まとめたものをPDF化していますので、興味ある方はPDFをご覧下さい。また、当日最後に紹介したショートコードによる新着記事の表示については、参考にしたサイトがありますので、こちらを記載しておきます。APPOFIT-記事内に特定カテゴリの新着一覧を出すショートコード- Comments (0) […]

[…] 参考記事 : 記事内に特定カテゴリの新着一覧を出すショートコード:APPOFIT […]

[…] 参考サイト:記事内に特定カテゴリの新着一覧を出すショートコード https://o-84.com/article/101/ […]

記事内に特定カテゴリの新着一覧を出すショートコードにコメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です