• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

「テンプレートタグ/query posts」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(原文が更新されている。http://codex.wordpress.org/Template_Tags/query_posts)
(英語版Codexの最新のDescription, Caveatsの項を翻訳)
2行目: 2行目:
 
{{NeedTrans|一部}}
 
{{NeedTrans|一部}}
 
==説明<span id="Description"></span>==
 
==説明<span id="Description"></span>==
 +
<tt>query_posts()</tt>はWordPressのメインクエリーを変更し表示される投稿を変更する方法としては、最もかんたんですが、効率的ではなく、好まれない方法です。<tt>query_posts</tt>はメインクエリーをいったん横に置いておき、新しいクエリーで上書きします。<tt>query_posts</tt>を呼び出したあとは、クエリーの改変を戻すために、<tt>wp_reset_query()</tt>を呼び出し、オリジナルのメインクエリーを復活させる必要があります。
 +
 +
<tt>query_posts</tt>ではなく[[プラグイン_API/アクションフック一覧/pre_get_posts|pre_get_posts]]フィルターを用い、[[関数リファレンス/is_main_query|is_main_query]]でチェックしてメインクエリーを変更することが'''強く'''推奨されています。
 +
 +
たとえば、ホームで、通常最新の10件の投稿が表示されているとします。もし5件だけ表示したいのであれば、<tt>query_posts()</tt>を使ってこのように書くことができます(ページ送りについては無視しています)。
 +
 +
<pre>query_posts( 'posts_per_page=5' );</pre>
 +
 +
functions.phpで[[プラグイン_API/アクションフック一覧/pre_get_posts|pre_get_posts]]を使って同じことをするなら、このように書けます。
 +
 +
<pre>
 +
function five_posts_on_homepage( $query ) {
 +
    if ( $query->is_home() && $query->is_main_query() ) {
 +
        $query->set( 'posts_per_page', '5' );
 +
    }
 +
}
 +
add_action( 'pre_get_posts', 'five_posts_on_homepage' );
 +
</pre>
 +
 +
==注意<span id="Caveats"></span>==
 +
 +
<tt>query_posts()</tt>はデータベースに問い合わせて投稿の一覧を生成するたくさんの方法のひとつに過ぎません。<tt>query_posts()</tt>を使うと決める前に、欠点も理解しておいてください。
 +
 +
===メインループを変更する<span id="AltersMainLoop"></span>===
 +
 +
<tt>query_posts()</tt>はメインループを変更するためのものです。<tt>query_posts()</tt>はそのために、メインループを生成するクエリーを置き換えます。いったん<tt>query_posts()</tt>を使うと、投稿にもとづいたグローバル変数やテンプレートタグも変更されます。<tt>query_posts()</tt>を呼び出したあとは、条件分岐タグも置き換えられてしまいます。このことが意図しない結果を引き起こすかもしれません。
 +
 +
===派生的なループ<span id="SecondaryLoops"></span>===
 +
 +
派生的な一覧(たとえば、ページの下部に関連記事を表示したり、サイドバーのウィジェットでリンクの一覧をだしたり)を表示したい場合は、[[関数リファレンス/WP_Query|WP_Query]]の新しいインスタンスを生成するか、[[テンプレートタグ/get_posts|get_posts]]を使ってください。
 +
 +
もし<tt>query_posts()</tt>を使う場合は、用が済んだら必ず<tt>wp_reset_query()</tt>を呼び出してください。
 +
 +
===ページ送り<span id="Pagination"></span>===
 +
 +
'paged' クエリー引数を適切に指定していないと、ページ送りが正しく動作しない可能性があります:[http://codex.wordpress.org/Pagination#Adding_the_.22paged.22_parameter_to_a_query adding the paged parameter]
 +
 +
===SQLクエリーが追加発行される<span id="AdditionalSQLQueries"></span>===
 +
 +
<tt>query_posts</tt>をテンプレートで使用する場合、WordPressはすでにデータベースへの問い合わせを実行し、テンプレートを読み込む頃にはデータの取り出しを終えています(なぜなら、どのテンプレートが読み込まれるかが決まったということは、すでに処理が終わっているということですから!)。そのため、<tt>query_posts()</tt>を使ってデフォルトのクエリーを上書きして結果を得るには、どうしても再度データベースに問い合わせし再計算する必要があります。
 +
 +
このことは、小規模なブログベースのウェブサイトを扱っているのであれば、必ずしも問題であるとは言えません。データベースが大きい大規模でトラフィックの多いウェブサイトの開発者であれば、デフォルトのクエリーが呼び出される前に直接変更できる代替案を検討するほうがいいかもしれません。[[プラグイン_API/アクションフック一覧/request|request]]フィルターでまさにこれを実現できるでしょう。
 +
 +
'parse_query' と '[[プラグイン_API/アクションフック一覧/pre_get_posts|pre_get_posts]]' フィルターも内部的に$queryオブジェクトを改変しデータベースへ問い合わせるSQLを生成するのに使われます。
 +
 +
<!-- 旧記述ここから
 
<tt>query_posts</tt> は [[The Loop|WordPress ループ]] で表示される投稿を変更するために使います。この関数は URL で使われるのと同じ書式の各種引数(例:<tt>p=4</tt> なら 投稿 ID が 4 の投稿のみを表示)を受け取ります。
 
<tt>query_posts</tt> は [[The Loop|WordPress ループ]] で表示される投稿を変更するために使います。この関数は URL で使われるのと同じ書式の各種引数(例:<tt>p=4</tt> なら 投稿 ID が 4 の投稿のみを表示)を受け取ります。
  
20行目: 66行目:
  
 
query_posts() 関数は新しい [[関数リファレンス/WP_Query|WP_Query]] オブジェクトを作成し、グローバル ''wp_query'' 変数に割り当てます。[[テンプレートタグ/get_posts|get_posts()]] 関数は、グローバルエリアをまったく上書きすることなく新しい [[関数リファレンス/WP_Query|WP_Query]] オブジェクトを作成します。
 
query_posts() 関数は新しい [[関数リファレンス/WP_Query|WP_Query]] オブジェクトを作成し、グローバル ''wp_query'' 変数に割り当てます。[[テンプレートタグ/get_posts|get_posts()]] 関数は、グローバルエリアをまったく上書きすることなく新しい [[関数リファレンス/WP_Query|WP_Query]] オブジェクトを作成します。
 +
 +
旧記述ここまで -->
  
 
==使い方<span id="Usage"></span>==
 
==使い方<span id="Usage"></span>==

2013年3月23日 (土) 13:47時点における版

このページ「テンプレートタグ/query posts」は 情報が古くなっている可能性があります。最新版英語)も合わせてご覧ください。最新に更新してくださる協力者を求めています

このページ「テンプレートタグ/query posts」は一部未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

説明

query_posts()はWordPressのメインクエリーを変更し表示される投稿を変更する方法としては、最もかんたんですが、効率的ではなく、好まれない方法です。query_postsはメインクエリーをいったん横に置いておき、新しいクエリーで上書きします。query_postsを呼び出したあとは、クエリーの改変を戻すために、wp_reset_query()を呼び出し、オリジナルのメインクエリーを復活させる必要があります。

query_postsではなくpre_get_postsフィルターを用い、is_main_queryでチェックしてメインクエリーを変更することが強く推奨されています。

たとえば、ホームで、通常最新の10件の投稿が表示されているとします。もし5件だけ表示したいのであれば、query_posts()を使ってこのように書くことができます(ページ送りについては無視しています)。

query_posts( 'posts_per_page=5' );

functions.phpでpre_get_postsを使って同じことをするなら、このように書けます。

function five_posts_on_homepage( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'posts_per_page', '5' );
    }
}
add_action( 'pre_get_posts', 'five_posts_on_homepage' );

注意

query_posts()はデータベースに問い合わせて投稿の一覧を生成するたくさんの方法のひとつに過ぎません。query_posts()を使うと決める前に、欠点も理解しておいてください。

メインループを変更する

query_posts()はメインループを変更するためのものです。query_posts()はそのために、メインループを生成するクエリーを置き換えます。いったんquery_posts()を使うと、投稿にもとづいたグローバル変数やテンプレートタグも変更されます。query_posts()を呼び出したあとは、条件分岐タグも置き換えられてしまいます。このことが意図しない結果を引き起こすかもしれません。

派生的なループ

派生的な一覧(たとえば、ページの下部に関連記事を表示したり、サイドバーのウィジェットでリンクの一覧をだしたり)を表示したい場合は、WP_Queryの新しいインスタンスを生成するか、get_postsを使ってください。

もしquery_posts()を使う場合は、用が済んだら必ずwp_reset_query()を呼び出してください。

ページ送り

'paged' クエリー引数を適切に指定していないと、ページ送りが正しく動作しない可能性があります:adding the paged parameter

SQLクエリーが追加発行される

query_postsをテンプレートで使用する場合、WordPressはすでにデータベースへの問い合わせを実行し、テンプレートを読み込む頃にはデータの取り出しを終えています(なぜなら、どのテンプレートが読み込まれるかが決まったということは、すでに処理が終わっているということですから!)。そのため、query_posts()を使ってデフォルトのクエリーを上書きして結果を得るには、どうしても再度データベースに問い合わせし再計算する必要があります。

このことは、小規模なブログベースのウェブサイトを扱っているのであれば、必ずしも問題であるとは言えません。データベースが大きい大規模でトラフィックの多いウェブサイトの開発者であれば、デフォルトのクエリーが呼び出される前に直接変更できる代替案を検討するほうがいいかもしれません。requestフィルターでまさにこれを実現できるでしょう。

'parse_query' と 'pre_get_posts' フィルターも内部的に$queryオブジェクトを改変しデータベースへ問い合わせるSQLを生成するのに使われます。


使い方

<?php

// クエリ
query_posts( $args );

// ループ
if ( have_posts() ) : 
  while ( have_posts() ) : 
    the_post();
      ..
  endwhile; 
else:
  ..
endif;

// クエリをリセット
wp_reset_query();

?>

注意事項

query_posts()テンプレート ファイル内で WordPress ループ が始まる前に記述します。wp_query オブジェクトは与えられた引数から新しい SQL クエリを作ります。このとき、WordPress は(ページ番号やカテゴリーのような)URL から得られた引数を無視します。もしその情報が必要なら、query_posts() の引数としてグローバル変数の $query_string を与えます。

例えば、他のクエリ引数に影響を与えずに投稿の表示順序だけを指定したいなら WordPress ループ の前に以下のように記述します:

global $query_string;
query_posts( $query_string . "&order=ASC" );

この形式で query_posts() を使う場合は、二重引用符で囲んだ引数をアンド記号(&)で始めてください。または複数の値の引数を追加する場合、配列にする必要があります。

global $query_string;
parse_str( $query_string, $args );
$args[post_type] = array( 'post', 'video' );
query_posts( $args );

さらに、元のクエリ配列を引数配列に統合することもできます。

global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'product' ) );
query_posts( $args );

引数

ここでの記述例がすべてではありません。引数を組み合わせることで、より実用的なクエリが可能になります。

投稿者引数

ある投稿者に関連付けられた投稿を表示する。

  • author整数) - use author id.
  • author_name文字列) - use 'user_nicename' (NOT name).

Show Posts for one Author

Display posts by author, using author id:

query_posts( 'author=123' );

Display posts by author, using author 'user_nicename':

query_posts( 'author_name=rami' );

Show Posts From Several Authors

Display posts from several specific authors:

query_posts( 'author=2,6,17,38' );

Exclude Posts Belonging to an Author

Display all posts except those from an author by prefixing its id with a '-' (minus) sign:

query_posts( 'author=-123' );

カテゴリー引数

指定したカテゴリーに分類された投稿を表示する。

  • cat (整数)- カテゴリー ID。
  • category_name (文字列)- カテゴリースラッグを指定(カテゴリー名ではない)。
  • category__and (配列)- カテゴリー ID の配列。指定した複数のカテゴリーすべてに含まれる投稿のみを表示。
  • category__in (配列)- カテゴリー ID の配列。指定した複数のカテゴリーいずれかに含まれる投稿のみを表示。
  • category__not_in (配列)- カテゴリー ID の配列。指定した複数のカテゴリーのいずれにもに含まれない投稿のみを表示。

ひとつのカテゴリーの投稿を表示

ID で指定したカテゴリー(とその子孫カテゴリー)に含まれる投稿のみを表示。

query_posts( 'cat=4' );

カテゴリースラッグで指定したカテゴリー(とその子孫カテゴリー)に含まれる投稿のみを表示。

query_posts( 'category_name=staff' );

複数のカテゴリーの投稿を表示

ID で指定した複数のカテゴリーに含まれる投稿のみを表示。

query_posts( 'cat=2,6,17,38' );

スラッグで指定した複数のカテゴリーに含まれる投稿のみを表示。

query_posts( 'category_name=staff,news' );

指定カテゴリーの投稿を除外

'-'(マイナス)記号を前につけたカテゴリー ID '以外' の投稿を表示。

query_posts( 'cat=-3' );

複数カテゴリーの指定方法

ID で指定した複数のカテゴリーすべてに含まれるカテゴリーを表示。以下はカテゴリー ID 2 と 6 の両方に含まれる投稿を表示。

query_posts( array( 'category__and' => array( 2, 6 ) ) );

カテゴリー ID 2 または 6 に含まれる投稿を表示するには、前述の cat か category__in(こちらは子孫カテゴリーを含みません)を使う。

query_posts( array( 'category__in' => array( 2, 6 ) ) );

また、以下の方法でも複数のカテゴリーを除外できる。

query_posts( array( 'category__not_in' => array( 2, 6 ) ) );

タグ引数

指定したタグがつけられた投稿を表示する。

  • tag (文字列)- タグスラッグを指定。
  • tag_id (整数)- タグ ID を指定。コンマ区切りにした複数 ID の文字列も指定可能。
  • tag__and (配列)- タグ ID の配列。指定した複数のタグのすべてを含む投稿のみを表示。
  • tag__in (配列)- タグ ID の配列。指定した複数のタグのいずれかを含む投稿のみを表示。
  • tag__not_in (配列)- タグ ID の配列。指定した複数のタグのいずれも含まない投稿のみを表示。
  • tag_slug__and (配列)- タグスラッグの配列。指定した複数のタグすべてを含む投稿のみを表示。
  • tag_slug__in (配列)- タグスラッグの配列。指定した複数のタグのいずれかを含む投稿のみを表示。

指定した1つのタグを含む投稿を表示

Display posts that have this tag, using tag slug:

query_posts('tag=cooking');

Display posts that have this tag, using tag id:

query_posts( 'tag_id=13' );


Show Posts From Several Tags

指定したタグのいずれかを含む投稿を表示。

query_posts('tag=bread,baking');

指定した3つのタグすべてを含む投稿を表示。

query_posts('tag=bread+baking+recipe');

複数タグの指定方法

タグ ID 37 と 47 の両方を含む投稿を表示。

query_posts( array( 'tag__and' => array( 37, 47 ) ) );

タグ ID 37 または 47 のいずれかを含む投稿を表示するには、前述の tagtag__in を使う。

query_posts( array( 'tag__in' => array( 37, 47 ) ) );

タグ ID 37 と 47 のいずれも含まない投稿を表示。

query_posts( array( 'tag__not_in' => array( 37, 47 ) ) );

tag_slug__intag_slug__and はタグスラッグを指定する他は上記と同様です。

Ryan's discussion of Tag intersections and unions も参照してください。

タクソノミー引数

特定のタクソノミーに関連付けられた投稿を表示。

  • {tax} (文字列) - タクソノミースラッグ。
  • tax_query (配列) - .

シンプルタクソノミークエリ

'people' カスタムタクソノミーで 'bob' というスラッグのタグがつけられた投稿を表示。

query_posts( array( 'people' => 'bob', 'posts_per_page' => 10 ) );

複数のタクソノミー処理 (バージョン 3.1 以降)

複数のカスタムタクソノミーの投稿を表示。

$args = array(
	'tax_query' => array(
		'relation' => 'AND',
		array(
			'taxonomy' => 'movie_janner',
			'field' => 'slug',
			'terms' => array( 'action', 'commedy' ),
		),
		array(
			'taxonomy' => 'actor',
			'field' => 'id',
			'terms' => array( 103, 115, 206 ),
			'operator' => 'NOT IN',
		)
	)
)
query_posts( $args );

投稿者引数

指定した ID や名前の投稿者による投稿を表示する。

  • author=3 (整数)- 表示する投稿者の ID を指定。
  • author=-3 (整数)- 除外する投稿者の ID を指定。
  • author_name=Harriet (文字列)- 投稿者のニックネームを指定(日本語も可)。

注意: author_nameuser_nicename フィールドの値を指定します。author には ID を指定します。

author=1 のすべての 固定ページ をタイトル順, 先頭固定表示無しで表示

query_posts('caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC');

投稿・固定ページ引数

ブログ投稿や固定ページに関連付けられた post を表示。

  • p整数)- 投稿 ID を指定。
  • name文字列) - 投稿スラッグ を指定。
  • page_id整数) - 固定ページ ID を指定。
  • pagename文字列) - 固定ページスラッグを指定。
  • post_parent整数) - 固定ページ ID を指定。子ページのみを返す。
  • post__in配列) - use post ids. Specify posts to retrieve.
  • post__not_in配列) - use post ids. Specify post NOT to retrieve.
  • post_type (string / array) - use post types. Retrieves posts by Post Types, default value is 'post';
    • 'post'
    • 'page'
    • 'revision'
    • 'attachment'
    • 'any' - retrieves any type except revisions
    • Custom Post Types (e.g. movies)
  • post_status (string / array) - use post status. Retrieves posts by Post Status, default value is 'publish';
    • 'publish' - a published post or page
    • 'pending' - post is pending review
    • 'draft' - a post in draft status
    • 'auto-draft' - a newly created post, with no content
    • 'future' - a post to publish in the future
    • 'private' - not visible to users who are not logged in
    • 'inherit' - a revision. see get_children.
    • 'trash' - post is in trashbin. added with Version 2.9.

ID を指定して投稿・固定ページを表示

特定の ID の投稿を表示。

query_posts( 'p=7' );

特定の ID の固定ページを表示。

query_posts( 'page_id=7' );

スラッグを指定して投稿・固定ページを表示

Display post by his slug:

query_posts( 'name=about-my-life' );

Display page by his slug:

query_posts( 'pagename=contact' );

Show Child Posts/Pages

Display child pages using the slug of the parent and the child page, separated by a slash:

query_posts( 'pagename=parent_slug/child_slug' );

Display child pages using parent page ID:

query_posts( 'post_parent=93' );

Multiple Posts/Pages Handling

Display only the specify posts:

query_posts( array( 'post__in' => array( 2, 5, 12, 14, 20 ) ) );

Display all posts but NOT the specify ones:

query_posts( array( 'post__not_in' => array( 2, 5, 12, 14, 20 ) ) );

Note: you cannot combine 'post__in' and 'post__not_in' in the same query.

投稿タイプを指定して投稿を表示

ページのみを表示。

query_posts( 'post_type=page' );

'any' 投稿タイプを表示 (履歴以外のすべてのタイプを取得)。

query_posts( 'post_type=any' );

カスタム投稿タイプを含む複数の投稿タイプを表示。

query_posts( array( 'post_type' => array( 'post', 'page', 'movie', 'book' ) ) );

状態を指定して投稿を表示

下書きのみを表示。

query_posts( 'post_status=draft' );

複数の投稿状態を指定して表示。

query_posts( array( 'post_status' => array( 'pending', 'draft', 'future' ) ) );

ページ送り引数

  • showposts整数) - number of post to show per page. Deprecated in favor of 'posts_per_page'.
  • posts_per_page整数) - number of post to show per page. Use 'posts_per_page'=>-1 to show all posts. Note if the query is in a feed, wordpress overwrites this parameter with the stored 'posts_per_rss' option. To reimpose the limit, try using the 'post_limits' filter.
  • nopagingブーリアン) - 全ての投稿を表示するかページ送りを使うかを指定します。デフォルトは'false'でページ送りを使います。
  • paged整数) - number of page. Show the posts that would normally show up just on page X when using the "Older Entries" link.

Pagination Note: You should set get_query_var( 'page' ); if you want your query to work with pagination. Since Wordpress 3.0.2, you do get_query_var( 'page' ) instead of get_query_var( 'paged' ). The pagination parameter 'paged' for query_posts() remains the same.

Show x Posts per page

Display 3 posts per page:

query_posts( 'posts_per_page=3' );

Show All Post

Display all posts in one page:

query_posts( 'posts_per_page=-1' );

Display all posts by disabling pagination:

query_posts( 'nopaging=true' );

Show Posts from page x

Display posts from page number 6:

query_posts( 'paged=6' );

Show Posts from Current Page

Display posts from current page:

$page = get_query_var( 'page' );
query_posts( 'paged=$page' );

オフセット引数

表示される投稿の先頭から指定した件数をスキップします。

  • offset (整数)- 投稿の先頭からスキップする件数を指定。

以下は、最新の投稿(1件)に続く5件の投稿を表示。

query_posts('posts_per_page=5&offset=1');

並び順・並べ替え引数

取得した投稿を並べ替える。

  • order (string) - Designates the ascending or descending order of the 'orderby' parameter.
    • 'ASC' - 昇順。小さい値から大きい値の順(1, 2, 3; a, b, c)
    • 'DESC' - 降順。大きい値から小さい値の順(3, 2, 1; c, b, a)
  • orderby (string) - Sort retrieved posts by:
    • 'none' - 順番指定なし(バージョン 2.8 以降のみ)
    • 'ID' - Order by post id.
    • 'author' - Order by author.
    • 'title' - Order by title.
    • 'date' - Order by date.
    • 'modified' - Order by last modified date.
    • 'parent' - Order by post/page parent id.
    • 'rand' - Random order.
    • 'comment_count' - コメント数で並べ替え(バージョン 2.9 以降のみ)
    • 'menu_order' - Order by Page Order. Used most often for 固定ページ (Order field in the Edit Page Attributes box) and for attachments (the integer fields in the Insert / Upload Media Gallery dialog), but could be used for any post type with distinct 'menu_order' values (they all default to 0).
    • 'meta_value' - Note that a 'meta_key=keyname' must also be present in the query. Note also that the sorting will be alphabetical which is fine for strings (i.e. words), but can be unexpected for numbers (e.g. 1, 3, 34, 4, 56, 6, etc, rather than 1, 3, 4, 6, 34, 56 as you might naturally expect).
    • 'meta_value_num' - Order by numeric meta value (available with Version 2.8).

Show Posts sorted by Title, Descending order

Display posts sorted by post title in a descending order:

query_posts( 'orderby=title&order=DESC' );

Show Random Post

Display one random post:

query_posts( 'orderby=rand&posts_per_page=1' );

Show Popular Posts

Display posts ordered by comment count:

query_posts( 'orderby=comment_count&order=DESC' );

先頭固定投稿引数

Sticky Post Parameters

Show sticky post or ignore them.

  • caller_get_posts (bool) - ignore sticky posts or not. Deprecated as of Version 3.1 in favor of 'ignore_sticky_posts'.
  • ignore_sticky_posts (bool) - ignore sticky posts or not. Default value is 0, don't ignore. Ignore/exclude sticky posts being included at the beginning of posts returned, but the sticky post will still be returned in the natural order of that list of posts returned.

Show Sticky Posts

Display just the first sticky post:

$sticky = get_option( 'sticky_posts' );
query_posts( 'p=' . $sticky[0] );

Display just the first sticky post, if none return the last post published:

$args = array(
	'posts_per_page' => 1,
	'post__in'  => get_option( 'sticky_posts' ),
	'ignore_sticky_posts' => 1
);
query_posts( $args );

Display just the first sticky post, if none return nothing:

$sticky = get_option( 'sticky_posts' );
$args = array(
	'posts_per_page' => 1,
	'post__in'  => $sticky,
	'ignore_sticky_posts' => 1
);
query_posts( $args );
if ( $sticky[0] ) {
	// insert here your stuff...
}

Don't Show Sticky Posts

Exclude all sticky posts from the query:

query_posts( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );

Exclude sticky posts from a category. Return ALL posts within the category, but don't show sticky posts at the top. The 'sticky posts' will still show in their natural position (e.g. by date):

query_posts( 'ignore_sticky_posts=1&posts_per_page=3&cat=6' );

Exclude sticky posts from a category. Return posts within the category, but exclude sticky posts completely, and adhere to paging rules:

$paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
	'cat' => 3,
	'ignore_sticky_posts' => 1,
	'post__not_in' => $sticky,
	'paged' => $paged
);
query_posts( $args );

日時引数

指定した日時の間に投稿された投稿を表示。

  • year (int) - 4桁の年(例:2011)
  • monthnum (int) - 月(1〜12)
  • w (int) - 0〜53 で年間の週を指定。MySQL WEEK command Mode=1 を使っている。
  • day (int) - 日(1〜31)
  • hour (int) - 時(0〜23)
  • minute (int) - 分 (0〜60)
  • second (int) - 秒(0〜60)

今日の投稿を表示

$today = getdate();
query_posts( 'year=' . $today["year"] . '&monthnum=' . $today["mon"] . '&day=' . $today["mday"] );

現在の週の投稿のみを表示

$week = date('W'); $year = date('Y'); query_posts( 'year=' . $year . '&w=' . $week );

12月20日の投稿を表示

query_posts( 'monthnum=12&day=20' );

Note: The queries above return posts for a specific date period in history, i.e. "Posts from X year, X month, X day". They are unable to fetch posts from a timespan relative to the present, so queries like "Posts from the last 30 days" or "Posts from the last year" are not possible with a basic query, and require use of the posts_where filter to be completed. The examples below use the posts_where filter, and should be modifyable for most time-relative queries.

2009年3月15日の投稿を表示

// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
	// posts for March 1 to March 15, 2010
	$where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
	return $where;
}
add_filter( 'posts_where', 'filter_where' );

query_posts( $query_string );

最近30日間の投稿を表示

<pre>
// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
	// posts in the last 30 days
	$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
	return $where;
}
add_filter( 'posts_where', 'filter_where' );

query_posts( $query_string );

30〜60日前の投稿を表示

<pre>
// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
	// posts  30 to 60 days old
	$where .= " AND post_date >= '" . date('Y-m-d', strtotime('-60 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-30 days')) . "'";
	return $where;
}
add_filter( 'posts_where', 'filter_where' );

query_posts( $query_string );

カスタムフィールド引数

カスタムフィールドのキーまたは値を元に投稿を表示。

  • meta_key (string) - Custom field key.
  • meta_value (string) - Custom field value.
  • meta_compare (string) - 'meta_value=' で指定された値を比較する演算子。デフォルトは '=' で, '!='、'>'、'>='、'<'、'<=' も使える。

キーが 'color' で値が 'blue' のカスタムフィールドを持つ投稿を表示。

query_posts( 'meta_key=color&meta_value=blue' );

値は問わず、キーが 'color' のカスタムフィールドを持つ投稿を表示。

query_posts( 'meta_key=color' );

キーは問わず、値が 'blue' のカスタムフィールドを持つ投稿を表示。

query_posts( 'meta_value=color' );

キーは問わず、値が 'green' のカスタムフィールドを持つ固定ページを表示。

query_posts( 'post_type=page&meta_value=green' );

Returns posts with a custom field value of zero (0), regardless of the custom field key:

query_posts( 'meta_value'='_wp_zero_value' );

キーが 'color' で値が 'blue' でないカスタムフィールドを持つ投稿と固定ページの両方を表示。

query_posts( 'post_type=any&meta_key=color&meta_compare=!=&meta_value=blue' );

キーが 'miles' で値が 22 以下のカスタムフィールドを持つ投稿を表示。注:値は数値ではなく文字列として扱われているため「99」は「100」より大きくなります。

query_posts( 'meta_key=miles&meta_compare=<=&meta_value=22' );

引数の組み合わせ

引数はアンド記号(&)を使って複数組み合わせて指定することができます:

query_posts( 'cat=3&year=2004' );

「最新の投稿」ページで、カテゴリー ID が 13 かつ今月の投稿を表示する:

if (is_home()) {
query_posts( $query_string . '&cat=13&monthnum=' . date( 'n', current_time( 'timestamp' ) ) );
}

バージョン 2.3 では、以下の組み合わせは カテゴリー ID 1 と 3 に含まれる投稿を2件、タイトルの降順で表示。

query_posts( array( 'category__and' => array(1,3), 'posts_per_page' => 2, 'orderby' => 'title', 'order' => 'DESC' ) );

バージョン 2.3バージョン 2.5 では、カテゴリー ID が 1 で "apples" を含む投稿を表示することが期待される。

query_posts( 'cat=1&tag=apples' );

バグ:カテゴリーとタグを同時に指定する場合は「+」で同じタグを2つ指定してください。参照 Ticket #5433

query_posts( 'cat=1&tag=apples+apples' );

注意:'cat=1&tag=apples+oranges' は期待する結果にはなりません。

コード記述例

「最新の投稿」ページから指定カテゴリーを除く

index.php ファイルに以下のコードを書くと、カテゴリー ID が 3 以外の 投稿を表示。

<?php
   if ( is_home() ) {
      query_posts( 'cat=-3' );
   }
?>

複数のカテゴリー ID を指定できる(バージョン 2.1.2 で検証済)。

<?php
   if ( is_home() ) {
      query_posts( 'cat=-1,-2,-3' );
   }
?>

特定の投稿を表示

特定の投稿を表示。

<?php
query_posts( 'p=5' );  
?>

続きを読む を表示したい場合は、グローバル変数 $more を 0 にします。

<?php
// 投稿 ID が 5 の投稿を表示する
query_posts( 'p=5' );

// 投稿の始めの部分のみ表示するため $more を 0 にする
global $more;
$more = 0;

// ループ
while (have_posts()) : the_post();
  the_content( 'Read the full post »' );
endwhile;
?>

2008年5月に投稿された、カテゴリー ID 1 と 3 の投稿タイトルを1ページに5件ずつ表示する:

<?php if (have_posts()) :  query_posts('posts_per_page=5&cat=1,3&monthnum=5&year=2008');  ?>
  <?php while (have_posts()) : the_post(); ?>
    <h2><?php the_title(); ?></h2>
<?php endwhile; endif; ?>

カテゴリー ID 2 と 6 のいずれにも含まれないすべての投稿のタイトルをリストとして表示する:

<?php if (have_posts()) :  query_posts(array('category__not_in' => array(2,6))); ?>
<ul>
 <?php while (have_posts()) : the_post(); ?>
    <li><?php the_title(); ?></li>
<?php endwhile; endif; ?>
</ul>

query_posts に変数を与える

query_posts に変数を与える方法は2通りあります。どちらを使用してもかまいません。WordPress ループ の前に記述してください:

記述例 1

この例は、query_posts を実行する前にクエリ文字列を連結します。まず変数に値を代入し、変数と文字列を結合して、実行します。ここではカテゴリー ID を変数で与えることにします。

 $categoryvariable = $cat;  // 現在のカテゴリー ID を変数に代入
 $query = 'cat=' . $categoryvariable . '&orderby=date&order=ASC'; // クエリを連結
 query_posts( $query ); // run the query // クエリを実行

記述例 2

次の例では、二重引用符を使って PHP に式を評価させます。まず、現在の年・月を表示し、query_posts で公開日が現在の年・月に該当する投稿を表示します。投稿の並び順は日付の昇順で、公開日の古い順に表示します。

$current_year = date('Y');
$current_month = date('m');
query_posts( "cat=22&year=$current_year&monthnum=$current_month&order=ASC" );

記述例 3

この例では、ページングを使ってすべての投稿を表示する場合を説明します。デフォルトの $query_string を使って query_posts ですべての投稿を表示させることができます。posts_per_page の値には -1 か各ページに表示したい投稿の数を指定します。後者の場合には posts_nav_link() でページを移動する手段を提供しましょう。

query_posts( $query_string . '&posts_per_page=-1' );

記述例 4

$query_string 変数を使わずに、引数を配列に入れる方法もあります。例えば、記述例 2 のクエリは以下のようになります:

$args = array(
	'cat'      => 22,
	'year'     => $current_year,
	'monthnum' => $current_month,
	'order'    => 'ASC'
);
query_posts( $args );

この方法は、変数ごとに1行ずつ記述すると読み易くなります。

オリジナルクエリの保持(ページングなど)

デフォルトでは query_posts を実行すると、引数で指定した変数を除きページング,カテゴリー,日付などの現在のページのクエリ変数はすべて上書きされます。

オリジナルのクエリを保持したい場合は、query_poats の引数にオリジナルクエリの配列をマージしてください:

global $wp_query;
query_posts(
	array_merge(
		array( 'cat' => 1 ),
		$wp_query->query
	)
);


使い方のヒント

管理画面の 設定 > 表示設定 にある "1ページに表示する最大投稿数" パラメータで通常の表示件数を指定できます。これを変更するには 'posts_per_page' 引数を使います:

query_posts( 'category_name=The Category Name&posts_per_page=-1' );  // 指定カテゴリーに含まれるすべての投稿を表示

The "Syndication feeds show the most recent" or "posts per rss" parameters in Settings > Reading will overwrite any posts_per_page parameter in a query used in a feed. To overcome use (for example in a a custom ics feed, where all matching posts are required), use the "posts_limit" filter as follows:

if ( isset ( $query->query_vars['feed'] ) and ( $query->query_vars['feed'] == 'ics' ) )
	add_filter( 'post_limits', 'no_limits_for_feed' );

function no_limits_for_feed( $limits ) {
	return '';
}

リソース

最新英語版: WordPress Codex » Template Tags/query posts最新版との差分

関連

記事

コード・ドキュメンテーション

  • クラス: WP_Query - WP_Query クラスの詳細な全容
  • クラス: WP_Comment_Query - コメント関連のクエリのためのクラス
  • クラス: WP_User_Query - ユーザー関連のクエリのためのクラス
  • オブジェクト: $wpdb - $wpdb オブジェクトの使い方全容
  • 関数: set_query_var()
  • 関数: get_query_var()
  • 関数: query_posts() - 追加のカスタムクエリを作成
  • 関数: get_post() - 項目の ID を取得しデータベース内にあるその投稿のレコードを返す
  • 関数: get_posts() - 投稿の配列を返すことに特化した関数
  • 関数: get_pages() - ページの配列を返すことに特化した関数
  • 関数: have posts() - クエリが投稿を返すか否かを判断する条件関数
  • 関数: the_post() - クエリ後に自動的にループを設定する
  • 関数: rewind_posts() - 現状のループをリセットする
  • 関数: setup_postdata() - ループ内で個別の結果を得るためのクエリデータを設定する
  • 関数: wp_reset_postdata() - 直前のクエリを復元する (通常はループ内の別のループの後に用いられる)
  • 関数: wp_reset_query()
  • 関数: is_main_query() - 変更されるクエリがメインのクエリであることを確認する
  • アクションフック: pre_get_posts - WordPressクエリが実行される前に変更する
  • アクションフック: the_post - post クエリの後で post オブジェクトを変更する
  • フィルターフック: found_posts - WP_Query オブジェクトの found_posts 値を変更する


テンプレートタグへのクエリ文字列型パラメータの渡し方関数リファレンステンプレートタグ目次もご覧ください。


テンプレートタグへの PHP 関数型パラメータの渡し方関数リファレンステンプレートタグ目次もご覧ください。