ここでは、投稿で記事一覧を表示させるサブループにカスタムフィールドの値を条件として指定する方法について見ていきます。
カスタムフィールドの作り方を知らない方は、はじめにこちらをご覧ください。
2017.12.31記事の中にいつも同じ項目を入力したいときに記事の投稿の他にフォームが入力できる「カスタムフィールド」という機能がWordPressには備わっています。ここでは、このカスタムフィールドを使いやすくするプラグイン「Custom Field Template」につい...
結論から言うと、get_posts()
の配列の中に下記を入れることで可能になります。
カスタムフィールドの値を複数指定したい場合はこうなります。
'relation' => 'AND'
のところを'OR'
にするといずれかの値が一致したものを一覧にすることができます。
それでは実際にコードを一式で見てみましょう。ここでは、例として表示中の投稿で設定したカスタムフィールドの値と一致する記事の一覧を自動表示させることを目的にしてみます。
カスタムフィールドの値を1つ指定した記事一覧
PHP
$value = post_custom( $field_name ); |
$my_posts = get_posts( array ( |
'meta_key' => $field_name , |
$count = count ( $my_posts ); |
if ( $count >=1): foreach ( $my_posts as $post ): setup_postdata( $post ); ?> |
<h3><a href= "<?php the_permalink() ?>" ><?php the_title(); ?></a></h3> |
<p><?php the_category( ', ' ) ?></p> |
<p><?php the_time( 'Y/m/d' ) ?></p> |
<p><?php the_excerpt(); ?></p> |
<?php endforeach ; wp_reset_postdata(); else : ?> |
上記は、表示中の投稿に含まれるカスタムフィールドの値1つと同じ値をもつ投稿の記事一覧を作った例です。
コードの解説
説明を見たいコードの行をクリックすると説明が表示されます。
- <?php
- global $post;
-
$post
というのは、WordPressに最初から入っている変数のひとつで、表示中の投稿に関するいろんな情報(配列)が入っているグローバル変数です。$post
をこの後、使用するのでそれに先立ち「グローバル宣言」を行います。
- $post_id = $post->ID;
-
$post->ID
は、グローバル変数$post
の中から現在の投稿のIDを取得します。これを変数$post_id
に代入します。
- $field_name = ‘項目名’; // カスタムフィールドの項目名
-
変数
$field_name
にカスタムフィールドの項目名を代入します。
- $value = post_custom( $field_name );
-
上の行で作った変数を使ってカスタムフィールドの値を取得し、変数
$value
に代入しています。
-
- $my_posts = get_posts(array(
-
get_posts()
は、投稿の一覧を表示させるときに使うお決まりの関数で、取得したい記事の設定を行います。全体の骨組みは下記のようになります。
PHP
$my_posts = get_posts( array ( |
if ( $my_posts ): foreach ( $my_posts as $post ): setup_postdata( $post ); |
<?php endforeach ; endif ; wp_reset_postdata(); ?> |
「取得する投稿の設定」のところで取得したい投稿の設定を行い、それを「ループで設定した投稿データを出力」のところで出力します。上記の骨組みは公式のようなものなので覚えてしまっても良いかもしれません。
ここでは、取得したい記事の設定を変数$my_posts
に代入しています。
- ‘post_type’ => ‘post’, // 投稿タイプ
-
投稿タイプの指定を行います。ここでは「投稿(post)」を指定しています。
- ‘meta_key’ => $field_name, // カスタムフィールドの項目名
-
meta_key
には、カスタムフィールドの項目名を入れます。4行目で項目名を変数$field_name
に代入しているのでこれを指定します。
- ‘meta_value’ => $value, // カスタムフィールドの値
-
meta_value
には、カスタムフィールドの値を入れます。先ほど変数$value
に取得した値を格納したので、これを指定します。
- ‘posts_per_page’ => 6, // 表示件数
-
'posts_per_page' => 6,
は投稿の表示件数の指定です。「6」のところを表示させたい投稿数に入れ替えてください。
- ‘orderby’ => ‘date’, // 表示順の基準
-
データをある特定の規則に従って並べ替えることを「ソートする」というのですが、
orderby
では、記事をどんな項目に沿ってソートさせるかを決めます。代表的な項目として下記があります。
順序づけパラメータ |
意味 |
date |
投稿日 |
modified |
更新日 |
name |
スラッグ |
rand |
ランダム |
ID |
投稿ID(大文字です) |
title |
タイトル |
- ‘order’ => ‘DESC’, // 昇順・降順
-
order
では、orderby
で指定した項目を昇順(ACB順)で並べるのか、降順(ACB順の反対)で並べるのかを指定できます。
ASC: 昇順
DESC: 降順
ちなみに初期値は、'DESC'
になっていますので、このままで良い場合は行をまるごと削除してしまってかまいません。
- ‘exclude’ => $post_id // 表示中の投稿を除外
-
表示中の投稿が記事一覧に表示されないよう、ここで
'exclude' => $post_id
として現在の投稿IDを除外します。
- ));
- $count = count($my_posts);
-
条件に合った投稿数を
$count
に代入します。投稿数を取得するには、配列の数を返すcount()
の引数に投稿の配列変数$my_posts
を入れます。
-
- if($count>=1): foreach($my_posts as $post): setup_postdata($post); ?>
-
if(条件): foreach(変数 as $post): setup_postdata($post);
の部分は、「もし条件を満たしている場合は、グローバル変数$post
へ投稿として記事を1つずつセットします」みたいな意味です。
ここでは、「条件」として該当する投稿が存在すること、つまり投稿数が1つ以上あることを条件にするので、投稿数が格納された変数$count
を($count>=1)
という形でif文の条件に入れます。
foreach文は、
という形で「配列変数」に格納されている投稿のまとまりを一つずつ「変数(この場合$post
)」として取り出すという働きをします。
-
- <!– ループはじめ –>
- <h3><a href=”<?php the_permalink() ?>”><?php the_title(); ?></a></h3>
- <p><?php the_category(‘, ‘) ?></p>
- <p><?php the_time(‘Y/m/d’) ?></p>
- <p><?php the_excerpt(); ?></p>
- <!– ループおわり –>
-
- <?php endforeach; wp_reset_postdata(); else: ?>
-
endforeach
でforeach文の終了、wp_reset_postdata()
でsetup_postdata($post);
のところで変更した$post
の投稿に関する情報をリセットしています。
else
の下には、if($count>=1):
で条件に該当しなかった(投稿が存在しなかった)場合の内容が入ります。
-
- <p>記事がありません。</p>
-
- <?php endif ?>
-
endif
は、if文の終了です。
以上が、カスタムフィールドの値を1つ指定した記事一覧のサブループです。
複数のカスタムフィールドの値を指定した記事一覧
先ほどのコードを使って複数のカスタムフィールドの値を指定するとこうなります。
PHP
$value01 = post_custom( $key01 ); |
$value02 = post_custom( $key02 ); |
$my_posts = get_posts( array ( |
$count = count ( $my_posts ); |
if ( $count >=1): foreach ( $my_posts as $post ): setup_postdata( $post ); ?> |
<h3><a href= "<?php the_permalink() ?>" ><?php the_title(); ?></a></h3> |
<p><?php the_category( ', ' ) ?></p> |
<p><?php the_time( 'Y/m/d' ) ?></p> |
<p><?php the_excerpt(); ?></p> |
<?php endforeach ; wp_reset_postdata(); else : ?> |
仕組みは、1つの場合とほとんど同じなので説明は割愛させていただきます。
以上が、カスタムフィールドの値を指定した記事一覧の表示方法でした。
2018.08.15ここでは、get_posts関数を使ったいろいろなサブループの作り方をまとめてみます。それぞれのコードの仕組みついては各記事をご参照ください。
投稿でカテゴリを指定したサブループ
PHP
[php]
<?php
$cat_posts =...