バッドノウハウかもしれないシリーズです。
タイトルだけだと何を言っているのか全く分からないと思いますので(それはそれでタイトルの付け方が悪いのですが)、本文の「実現したいこと」をご覧頂ければと思います。
が、いつもどうり自分用のメモが主目的なので、自分が後で分かる程度の曖昧さですからその点はご勘弁を。
実現したいこと
実現したいことは以下の通り。
- 1ページにカテゴリーごとの記事一覧を複数設置
- カテゴリーはそのページの投稿画面のカスタムフィールドで変更可能
- テンプレートは見やすくしたい
上記をもう少し具体的にする為に、下記のような仮の状態を設定します。
- TOPページを固定ページで構築
- TOPページに3つのカテゴリーの新着記事を5件づつ並べる
- 3つのカテゴリーは管理画面から設定や変更が可能にするためにカスタムフィールドを用いる
- 専用にtop.phpを作成
- カテゴリーのスラッグと名称を同じにし、それぞれ「cat-a」「cat-b」「cat-c」とする
- top.phpにループを3つ作ることは避けてすっきりさせる
上記を実現することを目的とします。
カスタムフィールドの設定
カスタムフィールドはfunctions.phpで設定したり、プラグインを使う方が分かりよいのですが、特別なことをしなくても最初からある機能で設定できます。
投稿画面右上の「表示オプション」でカスタムフィールドにチェックをいれれば投稿画面下部に欄ができ、そこが使えるからです。
今回はとりあえず3つのカテゴリーを指定する為に、カスタムフィールドに以下の名前で登録します。値は前項で決めたカテゴリーのスラッグを順番に入れます。
- 名前:catname1/値:cat-a
- 名前:catname2/値:cat-b
- 名前:catname3/値:cat-c
後で「名前」に入力したワードを使います。
カスタムフィールドの呼び出し
配列などだとまた違うのですが、今回は単にテキストを入れているだけなので、以下の記述でカスタムフィールドの値を呼び出せます。
<?php echo get_post_meta($post->ID , 'catname1' ,true); ?>
詳細はコーデックスの下記のページをどうぞ。
ループを別ファイルに分けてカスタムフィールドの値を渡す
ここが肝かもしれませんが、ループを別ファイルに分けてカスタムフィールドの値をわたします。
ループを別ファイルに分けることで、一つのループを複数箇所で呼び出すことが可能になります。加えて、そのループにカスタムフィールドの値を渡すことができれば、管理画面から指定したカテゴリースラッグで操作も可能になります。
ループ用ファイルの呼び出し
便宜上、先に呼び出し側を先にします。top.phpに以下のコードを記述します。
<div class="catlist1">
<?php
$selectcat = get_post_meta($post->ID , 'catname1' ,true);
get_template_part( 'loop--catlist' );
?>
</div>
<div class="catlist2">
<?php
$selectcat = get_post_meta($post->ID , 'catname2' ,true);
get_template_part( 'loop--catlist' );
?>
</div>
<div class="catlist3">
<?php
$selectcat = get_post_meta($post->ID , 'catname3' ,true);
get_template_part( 'loop--catlist' );
?>
</div>
変数$catnameに「get_post_meta($post->ID , ‘catname1’ ,true);」を代入することで、「名前」が「catname1」の欄に横の「値」に入力したカスタムフィールドの内容を入れています。
そして、「get_template_part( ‘loop–catlist’ )」でループ用のファイル「loop–catlist.php」を読み込んでいます。
ループ用ファイル
カテゴリー一覧表示用に「loop–catlist.php」という名称(名前はご自由に)で以下のように作成します。
記事タイトルを5つ並べるだけの記述ですが、「the_excerpt()」や「the_time()」なども当然使えます。
<?php
global $selectcat ;
$args = array(
'paged' => $paged,
'posts_per_page' => 5,
'category_name' => $selectcat
);
$wp_query = new WP_Query($args);
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
?>
<div>
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
</div>
<?php endwhile; endif; wp_reset_query(); ?>
includeを使って読み込む場合は変数を書くだけで良いのですが、「get_template_part()」では変数が渡りません。そこで、読み込むloop側のほうで渡したい変数をグローバル変数として用います。
この方法は今回初めて知ったのですが、下記のブログさんを参考しています。includeを使うしかないかと思っていたので、とても助かりました。
WordPressのループ用ファイルに、引数のように変数を渡す
$selectcatの中にはカスタムフィールドの値が入っていますから、それを「category_name」に代入させることでカスタムフィールドで指定したカテゴリースラッグを設定することができます。
結び
やりたいことは割と明確だった割に、いろいろ躓きが多くかなり時間がかかりました。相変わらず正しいかどうかはあまり自信がありません…。
今回は最初からページ表示用のテンプレートに何個もループを作れば済む話ではあるのですが、ループの数を簡単に増減できるようにしておく必要もあったりで、どうせならと作ってみた次第です。
私はまだ0からコードが作れませんので、以前使ったものや新たに調べたものを寄せ集めるしかできませんが、それでも多少は引き出しが増えてきたようにも思います。ほんのわずかですが。
現在はブログを書いている余裕はないのですが、いろいろ悩んで調べた過程をメモすることで更にコードが再確認できるなど、こうしてブログに書くメリットは実感しています。
今回も、ここに書く際にあやふやだった点を確認して修正できましたので。今後もなるべく残していければと思います。
0人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。