wordpressの投稿を表示させるのに必要なループ(繰り返し処理)をまとめました。
そもそもデータベースから投稿データを取得するという概念からまとめてます。
クエリについて
クエリとは「問い合わせる」「訪ねる」という意味があります。
wordpressの投稿データはデータベース(My SQL)に格納されています。
データベース(My SQL)に対して、wordpressがクエリを発行して条件に一致する投稿データを取得しています。
メインクエリ
メインクエリはユーザーが要求したURLのページの表示に必要な最低限の投稿データのみを取得するクエリで、wordpressによって自動的に生成されて自動的に発行しているので、クエリを発行する必要がありません。
サブクエリ
メインクエリはURLに基づいて作成されているため、ページ外の投稿データは取得されません。
そのため、ページ外のカテゴリやカスタム投稿タイプの投稿データを取得したい場合は、別途サブクエリを発行して投稿データを取得する必要があります。
メインループ
メインクエリで取得したデータをテンプレート内で出力するための繰り返し処理の記述です。
if(have_posts())
- 記事が存在しているか確認
while(have_posts())
- 投稿が存在する限り繰り返し処理を行う
the_post()
- グローバル変数$post(投稿オブジェクト)にセットされ、投稿がなくなるまで表示される
※グローバル変数はグローバル変数 コンピュータプログラミングにおいて全てのスコープからアクセスできる変数のことである。(wiki参照)wordpress固有のグローバル変数はCodexを確認してください。
<?php if ( have_posts() ) : ?>
<?php while( have_posts() ) : the_post(); ?>
<!-- ループさせる投稿内容 -->
<?php endwhile;?>
<?php endif; ?>
メインクエリのクエリ条件を変更する
メインループのクエリ条件を変更するにはfunction.phpにアクションフックを記述する必要があります。
(例)
カスタム投稿タイプ(info)の投稿を5件取得する場合
pre_get_posts関数に対してアクションフックを設定しています。
is_admin() || ! $query->is_main_query()
- 管理者画面ではないかつメインクエリである場合のみ処理を行う
上記の記述がないと他の繰り返し処理にも影響が出てしまうため、忘れないようにしましょう。
function my_custom_query( $query ) {
if ( !is_admin() && $query->is_main_query()) {
if ( is_post_type_archive('info') ) {
$query->set( 'posts_per_page' , 5 );
}
}
return $query;
} add_action( 'pre_get_posts', 'my_custom_query' );
サブループ(カスタム投稿)
サブクエリで発行して、取得したデータをテンプレート内で出力するための繰り返し処理の方法は2つあります。
1.WP_Query
2.get_posts
3.query_postsは現在は非推奨となっております
1.WP_Query
(例)
カスタム投稿タイプ(info)の投稿を5件取得する場合
<?php $my_query = new WP_Query();
$args = array(
'post_type' => 'info',
'posts_per_page' => 5,
);
$my_query->query( $args ); ?>
<?php if( $my_query->have_posts() ): while( $my_query->have_posts() ) : $my_query->the_post();?>
<?php the_title( '<h2><a href="' . esc_url( get_permalink() ) . '">', '</a></h2>' ); ?>
<p><?php the_time('Y年m月j日');?></p>
<p><?php the_content(); ?></p>
<?php endwhile; endif; wp_reset_postdata(); ?>
2.get_posts
(例)
カスタム投稿タイプ(info)の投稿を5件取得する場合
<?php $args = array(
'post_type' => 'info',
'posts_per_page' => 5,
);
$posts_array = get_posts( $args ); ?>
<?php foreach ( $posts_array as $post ) : setup_postdata( $post ); ?>
<?php the_title( '<h2><a href="' . esc_url( get_permalink() ) . '">', '</a></h2>' ); ?>
<p><?php the_time('Y年m月j日');?></p>
<p><?php the_content(); ?></p>
<?php endforeach; wp_reset_postdata(); ?>
参考サイト
https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
https://wpdocs.osdn.jp/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
https://daeuwordpress.com/query/
https://eg-tips.com/wordpress-loop/