記事ページにて「関連記事」や「最新記事」を表示させてセッションを増やす工夫をみなさん既に行っていると思いますが、今回は記事ごとに任意のカテゴリの最新記事を○件表示させるようなプログラムを解説します。
プログラムの概要
- ダッシュボードの投稿ページにカスタムフィールドを追加
- カスタムフィールドにカテゴリ選択ができるリストを作成
- カスタムフィールドで選択したカテゴリをpost_metaに保存
- 記事ページからpost_metaの中身を確認して最新記事を取得
投稿ページにカスタムフィールドを追加する方法
まずはアクションを追加しておきましょう。function.phpに書いてください。
//カスタムフィールドを表示・保存するアクション
add_action('admin_menu', 'add_custom_fields');
add_action('save_post', 'save_custom_fields');
function add_custom_fields() {
add_meta_box( 'my_sectionid', 'カスタムフィールド', 'my_custom_fields', 'post');
add_meta_box( 'my_sectionid', 'カスタムフィールド', 'my_custom_fields', 'page');
}
add_meta_box()は投稿編集画面でカスタムフィールドを表示させる為の関数です。引数の内容についてはリファレンスを参照してください。
カスタムフィールドにカテゴリ選択ができるリストを作成
//カスタムフィールドにプルダウンメニューを表示する
function my_custom_fields() {
global $post;
//post_metaに保存されているカテゴリのIDを取得
$setcate = get_post_meta($post->ID,'setcate',true);
?>
<p>最新記事取得のカテゴリを指定</p>
<select name="setcate">
<option value="-1">指定なし</option>
<?php
//カテゴリ一覧を取得するためのクエリ
$args=array(
'orderby' => 'name',
'order' => 'ASC'
);
//カテゴリ一覧を取得
$categories = get_categories($args);
foreach($categories as $category) {
//カテゴリのIDを取得
$idx = $category->term_id;
$option = '<option value="'.$idx.'"';
//既にカテゴリを選択していた時ようの分岐
if($idx == $setcate){
//既にカテゴリを選択していた場合は投稿画面を開いた時に選択しておく
$option .= ' selected="selected"';
}
$option .= '>'.$category->name.'</option>';
echo $option;
}
?>
</select>
<?php
}
5.get_post_meta()指定したメタデータを取得。詳しくはマニュアルを参照。
プルダウンメニューの<option>タグのvalueにカテゴリのIDを入れます。記事に専用のメタデータが入っていない、もしくは最新記事を取得したくない場合用に「指定なし」のvalueには-1を入れておきます。
17.get_categories()を利用してカテゴリを全て取得するために11-13行目でクエリを作っています。今回はID順ではなく、名前順にしています。
20.$category->term_idカテゴリのIDを取得します。
分岐:5.で取得したIDの時は<option selected=”selected”>として、ページを開いた時に選択されているようにします。
選択したカテゴリをpost_metaに保存する方法
function save_custom_fields( $post_id ) {
if(!empty($_POST['setcate']))
update_post_meta($post_id, 'setcate', $_POST['setcate'] );
else delete_post_meta($post_id, 'setcate');
}
特に解説することはないですね。そのままコピペと雛形整形で使えます。
記事ページから任意のカテゴリの最新記事を取得する方法
//指定カテゴリの最新5記事
function getRecentPosts()
{
$custom = get_post_custom();
//post_metaに入ったカテゴリIDが空もしくは-1だった場合は以降の処理を行わない
if(!empty( $custom['setcate'][0]) && $custom['setcate'][0] != -1) {
$setcate = $custom['setcate'][0];
//テキストでカテゴリー名を表示する為に取得、必須ではない
$catename = get_the_category_by_ID($setcate);
//$the_query用のクエリを作成、今回はカテゴリのみを指定して最新5件
$query = array(
'post_type' => 'post',
'cat' => $setcate,
'posts_per_page' => 5
);
$the_query = new WP_Query($query);
$str = '';
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post();
//以降は出力するHTMLの整形
$plink = get_permalink();
$ptitle = get_the_title();
$str .= '<li><a href="'.$plink.'"><div class="recentImg">'.get_the_post_thumbnail();
$str .= '</div><div class="recentTitle">'.$ptitle.'</div></a></li>';
}
}
echo '<div id="recentPost"><h2>カテゴリ['.$catename.']の最新記事</h2><ul>';
echo $str;
echo '</ul></div>';
}
}
4.get_post_custom()投稿情報に設定されているカスタムフィールド情報をすべて取得する。引数に記事番号を指定、指定しない場合は現在の記事になる。
9.get_the_category_by_ID()引数に渡したカテゴリ番号のカテゴリ名を取得。
後はWP_Queryで回して取得した記事のタイトルとURLなどを整形して出力するだけ。
WP_Queryについてはリファレンスを参照。
全てfunction.phpに書いています。記事ページテンプレートから任意の場所からgetRecentPosts()を実行すればその記事のメタデータに指定したカテゴリの最新記事を取得できます。
少々急ぎ足で解説しましたが、カテゴリの取得、クエリを使った記事の取得、投稿画面のアクションへ処理をフックする方法と応用が効くものばかりなのでしっかり抑えておきましょう。