WP_Queryとquery_posts()とget_posts()はいつ使用する必要がありますか?
-
-
この[より長い分析]もチェックしてください(http://wordpress.stackexchange.com/questions/226960/why-query-posts-isnt-marked-as-deprecated/248955#248955)Check also this [longer analysis](http://wordpress.stackexchange.com/questions/226960/why-query-posts-isnt-marked-as-deprecated/248955#248955)
- 1
- 2016-12-25
- prosti
-
7 回答
- 投票
-
- 2010-09-13
-
query_posts()
は非常に単純で、ページのメインクエリをクエリの新しいインスタンスに置き換えることで、ページのメインクエリを変更する問題のある方法.これは非効率的であり(SQLクエリを再実行します)、状況によっては完全に失敗します(特に、投稿のページネーションを処理する場合).最新のWPコードは、pre_get_posts
フック. TL; DR query_posts()を使用しないでください. -
get_posts()
の使用法は非常に似ています同じ引数を受け入れますが(デフォルトが異なるなど、微妙な違いがあります)、投稿の配列を返し、グローバル変数を変更せず、どこでも安全に使用できます. -
WP_Query
は、両方の背後にあるクラスです.シーンですが、独自のインスタンスを作成して操作することもできます.もう少し複雑で制限が少なく、どこでも安全に使用できます.
query_posts()
is overly simplistic and a problematic way to modify the main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination). Any modern WP code should use more reliable methods, like making use of thepre_get_posts
hook, for this purpose. TL;DR don't use query_posts() ever.get_posts()
is very similar in usage and accepts the same arguments (with some nuances, like different defaults), but returns an array of posts, doesn't modify global variables and is safe to use anywhere.WP_Query
is the class that powers both behind the scenes, but you can also create and work with your own instance of it. A bit more complex, fewer restrictions, also safe to use anywhere.
-
(1)「どこでも安全に使用できます」->ただし、これをMAINループには使用しないでください.(2)グローバル$ query_stringを使用することを忘れないでください.query_posts();がある行の前(1) "and is safe to use anywhere" --> but do not use this for the MAIN loop. (2) remember to use global $query_string; before the line that has query_posts();
- 1
- 2011-02-19
- edelwater
-
@scribuその後、再び「get_posts」が機能しますが、アドバイスはありません:http://core.trac.wordpress.org/ticket/16545@scribu then again 'get_posts' will work although not advised: http://core.trac.wordpress.org/ticket/16545
- 1
- 2011-02-19
- edelwater
-
`query_posts`は、追加のクエリを実行するという点でも効率が悪いと思います.メインループに` WP_Query`のみを使用すると、WP_Queryで選択したクエリのみが実行されます.I believe that `query_posts` is also less efficient in that it will run additional queries, when if you use only `WP_Query` for your main loop, it will only run the query you choose in WP_Query.
- 1
- 2011-08-08
- jjeaton
-
@jjeaton `query_posts()`は `WP_Query`の小さなラッパー関数であり、(フローチャートに従って)それが行う唯一の余分なことはグローバル` $ wp_query`を上書きすることです@jjeaton `query_posts()` is tiny wrapper function for `WP_Query`, the only extra thing it does (as per flowchart) is overwriting global `$wp_query`
- 10
- 2011-08-08
- Rarst
-
@Rarst [query_postsのコーデックスのこのセクション](http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries)を参照していましたが、パフォーマンスへの影響について誤解されている可能性があります.テンプレートファイルでWP_Queryを使用しても同じ結果が得られない限り(つまり、クエリを破棄して再実行する)@Rarst I was referring to [this section in the Codex for query_posts](http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries) however, I may be mistaken regarding the effect on performance. Unless using WP_Query in your template file will also have the same result (i.e. throwing away your query, and re-executing)
- 1
- 2011-08-08
- jjeaton
-
@jjeaton`query_posts() `を` WP_Query`に置き換えてもパフォーマンスに違いはありません.元のページのクエリはコア負荷の一部であるため、引き続き実行されます.これらのクエリは、テンプレートファイルにループがまったくない場合でも実行されます.@jjeaton Replacing `query_posts()` with `WP_Query` will make no difference in performance, original page's query will still run because that is part of core load. Those queries will run even if your template file has no loop at all.
- 9
- 2011-08-08
- Rarst
-
これがWPSEで最も天才的で賛成の投稿であるという感覚を取り除くことはできません.コーデックスにもあるはずです.Can't get rid off the feeling that this the most genious and upvoted post on WPSE. Should be in Codex as well.
- 122
- 2011-09-16
- kaiser
-
さて、かなり長い間それを見た後、私は `query_posts()`が最初の使用後にtrueに設定される静的変数を欠いていると思います-そして-2回使用された場合-`_doing_it_wrong(); `をトリガーするはずです.私はこれについてwp-hackerまたはtracの人にバグを報告するつもりだと思います.Ok, after looking at it for more than quite a time, I think `query_posts()` is missing a static var that get's set to true after the first use and - if used twice - should trigger `_doing_it_wrong();`. Guess I'm going to bug the wp-hacker or trac guys about this.
- 1
- 2011-09-16
- kaiser
-
@kaiserまあ... `query_posts()`を2回使用するのは、1回と同じくらい悪いですが、私にとってはそれほど重要ではありません.:)ところで、Andrew Nacinはクエリに関するプレゼンテーションを行う予定であり、フローチャートの改善を提案する可能性があると述べたため、バージョン2は将来的に登場する可能性があります.@kaiser well... using `query_posts()` twice is about as bad as once, doesn't matter much as for me. :) btw Andrew Nacin is going to do presentation on queries and he said he might propose some improvements to the flowchart, so version two might be coming some time in the future.
- 1
- 2011-09-16
- Rarst
-
「query_posts()のパフォーマンス」の問題について最も明確な説明を追加します.テンプレートファイル内でquery_posts()またはWP_Queryを使用すると、実行したばかりのクエリと同じパフォーマンスコストが発生します.コーデックスの記事で説明されている問題は、実際にクエリを置き換えたい場合は、元のquery_posts()を「parse_query」フィルターでフィルター処理することによって置き換える必要があるということです.そうすれば、2番目のクエリを実行して不自然に置き換えるのではなく、1つの元の望ましいクエリしか得られません.query_posts()は決して道ではありません!!絶対に!I'll just add my clearest description of the "performance of query_posts()" issue: Using query_posts() or WP_Query within a template file will have the same performnace cost: the query you just performed. The issue discussed in the codex article is that if you actually want to replace the query you should do so by filtering the original query_posts() with the 'parse_query' filter. That way you only have the one, original, desirable query, rather than doing a second query to awkwardly replace it. query_posts() is NEVER THE WAY!! NEVER!
- 9
- 2012-04-19
- jerclarke
-
これは、メインクエリを変更するための優れた方法である「リクエスト」フィルタについては言及していません.query_postsに対する利点は、WP_Queryを使用した場合と同じように、関数が元のクエリを消去して新しいクエリを生成することです.リクエストフィルタを使用することにより、送信される前に元のクエリを変更します.@JeremyClarkeが上で得ているのはそれだと思います.This makes no mention of the 'request' filter, which is a great way to modify the main query. The advantage over query_posts is that function wipes out the original query and generates a new one - same as if you used WP_Query. By using the request filter, your modifying the original query before its ever sent. I think thats what @JeremyClarke is getting at above.
- 1
- 2012-05-02
- eddiemoya
-
ジョン・ジェームズ・ジェイコビーがdeveloper.wordpress.comブログに書いたquery_postsの驚くべき素晴らしい説明があり、これらすべての答えを水から吹き飛ばしています.要点: `query_posts`はメインループを*変更*せず、すでに実行された*後に*置き換え*ます.メインループを変更する最良の方法は、 `pre_get_posts`フィルターを使用することです. http://developer.wordpress.com/2012/05/14/querying-posts-without-query_posts/There's a freaking awesome explanation of query_posts written by John James Jacoby on the developer.wordpress.com blog that blows all of these answers out of the water. The main point: `query_posts` doesn't *modify* the main loop at all, it *replaces* it *after* it has already run. The best way to modify the main loop is through a `pre_get_posts` filter. http://developer.wordpress.com/2012/05/14/querying-posts-without-query_posts/
- 23
- 2012-06-09
- Dan Gayle
-
@Danあなたは技術的な実装と目的を混乱させています.`query_posts()`はメインループオブジェクトを置き換えますが、その目的はメインループを変更することです.また、私はループフィルターが大好きですが、それは質問されたものではありませんでした.そのトピックに関する他の人からのフォローアップの質問があります.@Dan you are confusing technical implementation and purpose. `query_posts()` does replace main loop object, but the purpose of it is to modify main loop. Also I am warmly fond of loop filters, but that wasn't what question asked. There is follow up question from other person on that topic.
- 3
- 2012-06-10
- Rarst
-
質問は「いつ使用する必要がありますか... query_posts()」であり、そのブログ投稿と上記のコメントによって提示されたロジックによれば、答えはおそらく決してありません.The question was "When should you use... query_posts()" and according to the logic presented by that blog post and the comments above, the answer is likely never.
- 2
- 2012-06-11
- Dan Gayle
-
それで、それがひどいのなら、なぜ `query_posts`が存在するのですか?so, if its so bad, why does `query_posts` exist?
- 2
- 2012-09-10
- Manny Fleurmond
-
@MannyFleurmondの概念的な `query_posts()`は、メインループの概念をテーマテンプレートタグのレベルにまで下げる試みです(その容易さはWP人気の強みの1つです).このタスクは、テンプレートタグが実行するには多すぎることが判明しました.コア開発者はそれが非推奨になる可能性を表明しましたが、それについての決定はまだなかったと思います.@Manny Fleurmond conceptually `query_posts()` is an attempt to dumb down main loop concepts to the level of theme template tag (ease of which is one of the strong points for WP popularity). The task simply turned out to be too much for template tag to possibly accomplish. Core developers did voice possibility of it getting deprecated but I don't think there was decision about that yet.
- 1
- 2012-09-10
- Rarst
-
実際にはWP_Query()を「どこでも使用」することはできません.試したところ、$thequery-> have_posts()、無限再帰で鳴り響きます.http://wordpress.stackexchange.com/questions/34270を参照してください.You actually can't "use anywhere" the WP_Query(), i just tried and it still croaks at $thequery->have_posts(), infinite recursion, see http://wordpress.stackexchange.com/questions/34270
- 1
- 2014-10-21
- NoBugs
-
@NoBugsその質問のループは間違っており、その理由を説明する答えがあります.@NoBugs the loop in that question is wrong and there is answer explaining why.
- 1
- 2014-10-21
- Rarst
-
ああ、これをありがとう.最後に、何かが理にかなっています.真剣に、WordPressとそのお粗末なドキュメント.このような複雑なソフトウェアと悪いコーディング標準がどのように人気になったのかはわかりません.Agghh thanks for this. Finally, something makes sense. Seriously, WordPress and their lousy documentation. I don't know how such convoluted software and bad coding standards became so popular.
- 1
- 2015-04-16
- racl101
-
wp_queryとget_postsの間でこの速度テストが見つかりましたhttp://www.wpclocked.com/Found this speed test between wp_query and get_posts http://www.wpclocked.com/
- 1
- 2015-07-18
- Anagio
-
私はそのようなテストを信頼します...まったくありません.:)関数は_非常に_薄いラッパーであり、違いは引数やフックのわずかな違いから生じます.I would trust such test... exactly none. :) The function is a _very_ thin wrapper, any difference will be coming from slight difference in arguments and/or hooks.
- 1
- 2015-07-19
- Rarst
-
感情の必要はありません.query_posts()は副作用のある関数です.グローバルを設定します.WordPressは副作用のある機能でずらされています.これはパフォーマンスの問題ではなく、コードの品質の問題です.https://developer.wordpress.org/reference/functions/query_posts/を見て、query_postsの機能を確認してください.グローバル変数を台無しにする場合を除いて、WP_Queryを使用します.No need for emotions, query_posts() is a function with side effects: setting a global. WordPress is staggerd with functions with side effects. This is not a performance issue but a quality of code issue. Look at https://developer.wordpress.org/reference/functions/query_posts/ and see what query_posts does. Use WP_Query unless you want to mess up global variables.
- 0
- 2020-03-14
- user718960
-
- 2015-06-18
query_posts
-query_posts
は絶対に使用しないでください. @Rarstが言ったこととは別に、query_posts
の本当に大きな問題は、メインのクエリオブジェクト($ wp_query
に格納されている)を壊すことです.多くのプラグインとカスタムコードはメインクエリオブジェクトに依存しているため、メインクエリオブジェクトを壊すということは、プラグインとカスタムコードの機能を壊すことを意味します.そのような関数の1つだけがすべての重要なページ付け関数であるため、メインクエリを中断すると、ページネーションが中断されます.query_posts
がどれほど悪いかを証明するには、どのテンプレートでも、次の手順を実行して結果を比較しますvar_dump($ wp_query); query_posts( '&posts_per_page=-1'); var_dump($ wp_query);
get_posts
とWP_Query
は、セカンダリクエリ(関連する投稿、スライダー、注目コンテンツなど)を作成する正しい方法です.および静的フロントページのコンテンツ).ページの機能が損なわれるため、ホームページ、単一ページ、または任意のタイプのアーカイブページでのメインクエリを優先して、2つのいずれも使用しないでください.メインクエリを変更する必要がある場合は、カスタムクエリではなく、pre_get_posts
を使用して変更します. ( 更新: 静的なフロントページと実際のページについては、pre_get_postsの使用を参照してください真のページと静的なフロントページ *)基本的に、
WP_Query
はメインクエリで使用され、get_posts
でも使用されますが、get_posts()
はを使用しますWP_Query
、いくつかの違いがあります-
get_posts
はWP_Query
よりも高速です.マージンは、サイトの合計投稿数によって異なります.この理由は、get_posts
が'no_found_rows'=>を渡すためです.true
はデフォルトでWP_Query
になり、ページ付けをスキップ/合法的に中断します. <コード> 'no_found_rows'=&gt;true 、WP_Query
は、クエリされた投稿の量を取得してからベイルアウトします.デフォルトでは、ページ付けを計算するために、クエリに一致するすべての投稿がさらに検索されます.このため、
get_posts()
はページ付けされていないクエリにのみ使用する必要があります.get_posts
のページ付けは、本当に1つの大きな混乱です.WP_Query
は、ページ分割されたすべてのクエリに使用する必要があります -
get_posts()
はposts _ *
フィルターの影響を受けませんが、WP_Query
はこれらのフィルターの影響を受けます.その理由は、get_posts
がデフォルトで'suppress_filters'=&gt;を渡すためです.true
からWP_Query
-
get_posts
には、include
、exclude
、numberposts
、カテゴリ
.これらのパラメータは、WP_Query
に渡される前に、WP_Query
の有効なパラメータに変更されます.include
はpost__in
に、exclude
はpost__not_in
に、category
はに変更されます. cat
とnumberposts
をposts_per_page
に挿入します.注意点として、WP_Query
に渡すことができるすべてのパラメータはget_posts
で機能し、無視して無視できます.get_posts
-
get_posts
は、WP_Query
の$posts
プロパティのみを返し、WP_Query
は完全なオブジェクトを返します.このオブジェクトは、ループ内で使用できる条件、ページ付け、およびその他の有用な情報に関して非常に役立ちます. -
get_posts
はループを使用しませんが、投稿を表示するためにforeach
ループを使用します.また、デフォルトではテンプレートタグは使用できません.テンプレートタグを使用できるようにするには、setup_postdata($post)
を使用する必要があります.WP_Query
はループを使用し、テンプレートタグはデフォルトで使用できます -
get_posts
は'ignore_sticky_posts'=&gt;を渡します1
からWP_Query
であるため、get_posts
はデフォルトでスティッキー投稿を無視します
上記に基づいて、
get_posts
とWP_Query
のどちらを使用するかはあなた次第であり、クエリから実際に何が必要かはあなた次第です.上記はあなたの選択を導くはずですquery_posts
- You should never ever usequery_posts
. Apart from what @Rarst has said, the really big issue withquery_posts
is, it breaks the main query object ( stored in$wp_query
). A lot of plugins and custom code relies on the main query object, so breaking the main query object means that you are breaking the functionalities of plugins and custom code. Just one such function is the all important pagination function, so if you break the main query, you break pagination.To prove how bad
query_posts
is, on any template, do the following and compare the resultsvar_dump( $wp_query ); query_posts( '&posts_per_page=-1' ); var_dump( $wp_query );
get_posts
andWP_Query
are the correct way to construct secondary queries ( like related posts, sliders, featured contentand content on static front pages) with. It should be noted, you should not use any of the two in favor of the main query on the home page, single page or any type of archive page as it will break page functionality. If you need to modify the main query, usepre_get_posts
to do so, and not a custom query. (UPDATE: For static front pages and true pages, see Using pre_get_posts on true pages and static front pages*)In essence,
WP_Query
is used by the main query and is also used byget_posts
, but althoughget_posts()
usesWP_Query
, there are a few differencesget_posts
are faster thanWP_Query
. The margin depends on the amount of total posts of the site. The reason for this is,get_posts
passes'no_found_rows' => true
by default toWP_Query
which skips/legally breaks pagination. With'no_found_rows' => true
,WP_Query
gets the amount of posts queried, then bails out, where by default, it further search for all posts matching the query in order to calculate pagination.For this reason,
get_posts()
should be used for non paginated queries only. Paginatingget_posts
is really one big mess.WP_Query
should be used for all paginated queriesget_posts()
aren't influenced by theposts_*
filters whereWP_Query
gets influenced by these filters. The reason is thatget_posts
, by default, passes'suppress_filters' => true
toWP_Query
get_posts
has a couple of extra parameters likeinclude
,exclude
,numberposts
andcategory
. These parameters do get changed into valid parameters forWP_Query
before being passed toWP_Query
.include
gets changed intopost__in
,exclude
intopost__not_in
,category
intocat
andnumberposts
intoposts_per_page
. Just a note, all of the parameters that can be passed toWP_Query
works withget_posts
, you can ignore and not use the default parameters ofget_posts
get_posts
returns just the$posts
property ofWP_Query
whileWP_Query
returns the complete object. This object is quite useful when it comes to conditionals, pagination and other useful info that can be used inside the loop.get_posts
doesn't use the loop, but aforeach
loop to display posts. Also, no template tags are available by default.setup_postdata( $post )
has to be used to make the template tags available.WP_Query
uses the loop and template tags are available by defaultget_posts
passes'ignore_sticky_posts' => 1
toWP_Query
, soget_posts
by default ignores sticky posts
Based on the above, whether to use
get_posts
orWP_Query
is up to you and what do you actually need from the query. The above should guide you in your choice-
私は私が好きな答えができたらいいのにと思います.これはとても説明します.I wish I could favorite answers. This explains so much.
- 2
- 2017-06-12
- Athoxx
-
素晴らしい説明! 「get_posts()はページ付けされていないクエリにのみ使用する必要があります.get_postsのページ付けは本当に1つの大きな混乱です.WP_Queryはすべてのページ付けされたクエリに使用する必要があります」基本的に誰かがimoを知る必要があるのはすべてです.Great Explanation! "get_posts() should be used for non paginated queries only. Paginating get_posts is really one big mess. WP_Query should be used for all paginated queries" Is basically all someone needs to know imo.
- 2
- 2018-04-19
- Bullyen
-
- 2010-09-13
基本的な違いは、
query_posts()
は実際には現在のループを変更するためだけのものであるということです.完了したら、ループをリセットして、陽気な方法で送信する必要があります.このメソッドは、「クエリ」が基本的に関数に渡すURL文字列であるため、少し理解しやすくなります.query_posts('meta_key=color&meta_value=blue');
一方、
WP_Query
はより汎用的なツールであり、query_posts()
よりもMySQLクエリを直接作成するようなものです.ループ内だけでなく、どこでも使用でき、現在実行中の投稿クエリに干渉しません.私は
WP_Query
を頻繁に使用する傾向があります.本当に、それはあなたの特定のケースに帰着するでしょう.The basic difference is that
query_posts()
is really only for modifying the current Loop. Once you're done it's necessary to reset the loop and send it on its merry way. This method is also a little easier to understand, simply because your "query" is basically a URL string that you pass to the function, like so:query_posts('meta_key=color&meta_value=blue');
On the other hand,
WP_Query
is more of a general purpose tool, and is more like directly writing MySQL queries thanquery_posts()
is. You can also use it anywhere (not just in the Loop) and it doesn't interfere with any currently running post queries.I tend to use
WP_Query
more often, as it happens. Really, it's going to come down to your specific case. -
- 2013-07-13
query_posts()
を使用する必要はありません.新しいWP_Queryオブジェクトをインスタンス化し、その新しいオブジェクトをglobal wp_query
に再割り当てするだけです.参考までに、実際の
query_posts()
関数は次のとおりです.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
詳細なカスタムクエリスクリプトを作成する場合は、独自のWP_Queryオブジェクトをインスタンス化します.または、あちこちで軽い操作を行うだけの場合は、
get_posts()
を使用します.どちらの場合も、自分に有利に働き、
wp_includes/query.php
にアクセスして、WP_Query
クラスを熟読することを強くお勧めします.There is simply no need to use
query_posts()
. All it does is instantiates a new WP_Query object and reassigns that new object toglobal wp_query
.For reference, the following is that actual
query_posts()
function.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
Instantiate your own WP_Query object if you want to create an in depth custom query script. Or use
get_posts()
if all you need to do is some light manipulation here and there.In either case, I highly recommend doing yourself a favor and going to
wp_includes/query.php
and perusing theWP_Query
class. -
- 2013-07-08
wp_reset_query()
を使用した後は、他のクエリ結果にも影響するため、必ずquery_posts()
を使用してください.Make sure that you use
wp_reset_query()
after usingquery_posts()
because it will affect other query result also. -
-
- 2017-07-19
- query_posts():メインを変更する必要がある場合にのみ使用できますクエリ.多くのグローバル変数を設定します;
- get_posts():メカニズムは非常に似ており、同じ引数を受け入れますが、配列を返します投稿の数
- WP_Query :独自のオブジェクトを作成して操作できます.もう少し複雑で制限が少ないので、どこでも安全に使用できます.
- query_posts(): might be used in one and only case if you need to modify main query . It sets a lot of global variables;
- get_posts(): it is very similar in mechanics and accepts same arguments, but returns array of posts
- WP_Query: you can create and work with own object of it. Bit more complex, less restrictions, it is safe to use anywhere.
Codex とブロゴスフィア周辺のチュートリアルの半分は
query_posts()
と半分はWP_Query <を使用します/code> .取引は何ですか?