南国スキーぶろぐ・Z

岩手県盛岡市のネタを中心としたお出掛け雑記ブログ

WordPressでよく使うサブループget_postsとWP_Queryの備忘録

にほんブログ村 地域生活(街) 東北ブログ 盛岡情報へにほんブログ村 地域生活(街) 東北ブログ 岩手県情報へ

2021/10/25

Web, wordpress , ,

WordPressでサイトを構築する上で必須の記述が投稿の記事を取得するためのループです。
使用する状況によって書き方が違うので、適切なループ処理を行わないと、取得したい情報を取得出来なかったり、ページネーションでページ送りをする事が出来なかったり、困った状況になってしまいます。

ここは通常のループでOK。
ここではget_postsによるサブループ。
ここではWP_Queryによるサブループ。
ここはfunctuins.phpでアクションフックかけてメインループを書き換えよう。

などなど、使用するループの判断とざっくりした記述の形は分かるんだけど、エラーを出さずにしっかり記述出来るかと言ったらTHE無理。
どーしてもディテールが思い出せずに、その都度google先生に頼っちゃう。

だもんで、自分のために備忘録として基本的なループの記述をまとめておきます。

  • 通常ループ
  • get_posts
  • WP_Query
  • pre_get_postsでアクションフック

今回はこの四つをまとめます。

通常のループ

<?php if(have_posts()): while(have_posts()): the_post(); ?>

/* ループの内容 */

<?php endwhile; else: ?>

/* 投稿が無い場合 */

<?php endif; ?>

get_postsのサブループ

get_postsによるループではページネーションによるページ送りが効かないので要注意。
get_postsとWP_Queryでは取得できる情報量が違うので、get_postsはサイトバーとかにチョコット情報を表示させたい時などに使うのが吉。
投稿がなかった場合に表示させるelse部分も忘れずに書きましょう。

<?php
$args = array(
   'post_type' => 'スラッグ',
   'posts_per_page' => 10,
);
$my_posts = get_posts($args);
if(!empty($my_posts)): // 投稿があったら
foreach($my_posts as $post):
setup_postdata($post);
?>

/* ループの内容 */

<?php endforeach; elseif(empty($my_posts)): //もし記事が空だったら ?>

 /* 投稿が無い場合 */

<?php endif; wp_reset_postdata(); ?>

WP_Queryのサブループ

ループの種類が良く分からない時は、WP_Queryによるループを書いておけば問題ないと思われる。
ただ、ページネーションによるページ送りが必要な場合は、2行目と6行目が必須。

<?php
$paged = get_query_var('paged', 1); // ページ送り用記述
$args = array(
    'post_type' => 'スラッグ', 
    'posts_per_page' => 6,
    'paged' => $paged // ページ送り用記述
 );
$wp_query = new WP_Query($args);
if($wp_query->have_posts()): while($wp_query->have_posts()): $wp_query->the_post();
?>

 /* ループ内の記述 */

<?php endwhile; else: ?>

 /* 投稿が無い場合 */

<?php endif; wp_reset_postdata();?>

pre_get_postsで表示件数を変える

これだけfunctions.phpに書きます。
特定のテンプレートだけ、WordPress管理画面の表示設定「1ページに表示する最大投稿数」で指定した件数じゃなくしたい場合に使用。

function custom_posts_per_page($query) {
  if(is_admin() || !$query->is_main_query()){  // 管理画面とメインクエリに干渉させない
    return;
  }

  // カテゴリーページの表示件数を10件に
  if($query -> is_category()) {
    $query -> set('posts_per_page', '5');
    return;
  }

}
add_action( 'pre_get_posts', 'custom_posts_per_page' );

カテゴリー以外の条件分岐は公式のWordPress CODEXを参照。

とりあえずこんなところかな?
googleでWordPressのループを検索すると、未だにquery_postsが出てくるけど、query_postsは現在非推奨なので使わないようにしましょう。
その内、カスタムフィールドの値を取得する記述もまとめておこうかな…。