1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

wordpress関数〜メインループ・サブループ編

Last updated at Posted at 2022-10-13

wordpressの投稿を表示させるのに必要なループ(繰り返し処理)をまとめました。
そもそもデータベースから投稿データを取得するという概念からまとめてます。

クエリについて

クエリとは「問い合わせる」「訪ねる」という意味があります。
wordpressの投稿データはデータベース(My SQL)に格納されています。

データベース(My SQL)に対して、wordpressがクエリを発行して条件に一致する投稿データを取得しています。

qiita.png

メインクエリ

メインクエリはユーザーが要求した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/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?