PHP
WordPress

【WordPress】個別ページとアーカイブページで記事情報を取得する方法

個別ページとアーカイブページで記事の情報を取得する方法について解説していきます。


個別ページ

have_postsという関数を用いて、以下のように記事情報を取り出すことができます。「もし記事を持っていれば、その記事の分だけ繰り返し処理を行う」という記述です。

<?php

if(have_posts()){
while(have_posts()){
?>
<h1><?= the_post(); ?></h1>
<h1><?= the_title(); ?></h1>
<?php
}
}
?>


アーカイブページ

上記詳細ページと同じようなやり方で取得することができます。

<?php

if(have_posts()){
while(have_posts()){
?>
<h1><?= the_post(); ?></h1>
<h1><?= the_title(); ?></h1>
<?php
}
}
?>

また、\$postsという変数を利用して以下のように取り出すこともできます。変数\$postsには、記事の情報が入っています。var_dump(\$posts)とかして見て中身を確かめてみるといいと思います。

<?php

foreach( $posts as $client ){
?>
<h1><?= $client->post_title ?></h1>
<?php
}
?>


have_posts()について

have_postsの関数について、定義は以下のようになっている。どうやら$wp_queryが持つメソッドらしい。

function have_posts() {

global $wp_query;
return $wp_query->have_posts();
}

WpQueryクラスのメソッドを見ていくと以下のような記述がある。

public function have_posts() {

if ( $this->current_post + 1 < $this->post_count ) {
return true;
} elseif (
$this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {
/**
* Fires once the loop has ended.
*
* @since 2.0.0
*
* @param WP_Query $this The WP_Query instance (passed by reference).
*/

do_action_ref_array( 'loop_end', array( &$this ) );
// Do some cleaning up after the loop
$this->rewind_posts();
} elseif ( 0 === $this->post_count ) {
/**
* Fires if no results are found in a post query.
*
* @since 4.9.0
*
* @param WP_Query $this The WP_Query instance.
*/

do_action( 'loop_no_results', $this );
}

$this->in_the_loop = false;
return false;
}

いろいろ書かれていてよくわからないが大きく、「最後のページ以外を取得する場合の処理」、「最後のページを取得する場合の処理」、「そもそも投稿がない場合の処理」に分かれているみたい。\$this->current_post + 1 < \$this->post_countの部分がtrueである限り、すなわち最後のページを取得するまで、ループを回すことができる。ループを回している間、the_titleとかを使って各ページの情報を取り出しているという感じですかね。


リファレンス

https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/have_posts