最近、久しぶりにWordPressを触っています。復習のためにWordPressの基本であるクエリについてまとめます。
WordPressは投稿に応じてメインクエリを作成します。
メインクエリによって取得した投稿が存在するかを確認するhave_posts()
や投稿をセットするthe_post()
などの関数が提供されています。
(下記サンプルコードは、アーカイブなどでよく使われるページネーションを表示するthe_posts_pagination()
のコードも合わせて掲載しています。)
<?php
if ( have_posts() ) {
echo '<ul>';
while ( have_posts() ) {
the_post();
echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
}
echo '</ul>';
}
the_posts_pagination([
'prev_text' => __( 'Previous page', 'example-domain' ),
'next_text' => __( 'Next page', 'example-domain' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' .
__( 'Page', 'example-domain' ) . ' </span>',
]);
?>
グローバル変数$wp_query
は、メインクエリが格納されたおり、下記のコードは前述のコードとほぼ同じ働きをします。
<?php
global $wp_query;
if ( $wp_query->have_posts() ) {
echo '<ul>';
while ( $wp_query->have_posts() ) {
$wp_query->the_post();
echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
}
echo '</ul>';
}
the_posts_pagination([
'prev_text' => __( 'Previous page', 'example-domain' ),
'next_text' => __( 'Next page', 'example-domain' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' .
__( 'Page', 'example-domain' ) . ' </span>',
]);
?>
メインクエリとは異なる条件に一致する投稿を表示したいときなどに使われます。
メインクエリに影響を与えずに、あらたにクエリを作成します。
下記サンプルではexample
カテゴリをメインクエリの前に10件表示する例です。
<?php
$query = new WP_Query([
'posts_per_page' => 10,
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'example',
],
],
]);
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
}
echo '</ul>';
}
wp_reset_postdata();
the_posts_pagination([
'prev_text' => __( 'Previous page', 'example-domain' ),
'next_text' => __( 'Next page', 'example-domain' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' .
__( 'Page', 'example-domain' ) . ' </span>',
]);
?>
上記のnew WP_Query()
とほぼ同じ動作をします。
get_posts()
は引数で指定したクエリ条件に一致する投稿を取得します。
こちらもメインクエリとは異なる投稿を表示したいときなどに使われます。
WP_Queryのサンプル同様に、example
カテゴリをメインクエリの前に10件表示する例です。
get_posts()
はメインクエリを書き換えないため、メインクエリとは異なるクエリ条件の投稿を表示するのに便利です。
wp_reset_postdata()
関数を実行することでメインクエリの投稿を復元できます。
<?php
$posts = get_posts([
'posts_per_page' => 10,
'category_name' => 'example'
]);
foreach ($posts as $post) {
setup_postdata($post);
echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
}
wp_reset_postdata();
// メインクエリは影響を受けることなく実行できる
if ( have_posts() ) {
echo '<ul>';
while ( have_posts() ) {
the_post();
echo sprintf("<li><a href='%s'>%s</a></li>", get_the_permalink(), get_the_title());
}
echo '</ul>';
}
the_posts_pagination([
'prev_text' => __( 'Previous page', 'example-domain' ),
'next_text' => __( 'Next page', 'example-domain' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' .
__( 'Page', 'example-domain' ) . ' </span>',
]);
?>
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。