Let’s say you wish to have to do one thing distinctive with the best way posts are queried and displayed on a selected web page of your web site. Perhaps you wish to have to have a couple of queries — one for featured posts and one for fresh posts. Or possibly you wish to have to exclude sure classes of posts out of your weblog web page.

No matter your purpose, making a decision to construct a customized web page template with a question that does one thing slightly another way. Alternatively, ahead of you get started coding you’ve got a choice to make: which WordPress question instrument must you utilize?

WordPress comprises a number of other queries: WP_query, query_posts(), get_posts(), get_pages(), and pre_get_posts. In lots of instances, that you must use greater than this sort of gear to reach the required effects. Alternatively, the query stays, which on must you utilize?

On this put up, we’ll take a look at every of those 5 WordPress question purposes intimately. We’ll learn the way every one works, establish any inherent barriers or pitfalls, and decide the situations through which every must be used. By means of the tip of this put up, you’ll know be capable to make an informed determination as to the right kind instrument on your put up querying wishes.

Click on on a hyperlink beneath to discover a particular merchandise or stay studying to be informed about all of those choices:

Let’s get proper to it.


WP_Query is the category at the back of (nearly) each and every WordPress question. Whilst you load a web page or put up in WordPress, a WP_query object, $question, is created and pulls up the related put up or web page information. Call to mind WP_Query because the engine that powers maximum WordPress queries.

You employ WP_Query even with out figuring out you’re the use of it. When your load a URL the WordPress core builds a database question with WP_Query according to the URL and the settings you’ve implemented on your web site. So, in the event you get entry to a web page with a URL like http://instance.com/class/wordpress WordPress creates a WP_Query object that locates all posts within the WordPress class and a lot all the put up information.

WP_Query powers the usual put up and web page queries constructed into WordPress and it will also be used to construct customized queries. That is accomplished with slightly of object-oriented programming. All you must do is create a brand new variable and claim it as a brand new example of the WP_Query elegance, like this:

After all, then you want to do one thing with the result of the question. Alternatively, that one thing that’s past the scope of this instructional. As an alternative, discuss with the record of tutorials on the finish of this put up if you want assist hanging WP_Query into follow.

As a WordPress developer, you’ll almost certainly use WP_Query extra ceaselessly that some other question serve as or hook. It’s flexible and robust. Whilst probably the most different queries lined on this put up might prevent a couple of keystrokes in some instances, typically, you’ll be able to’t pass flawed deciding on WP_Query on your customized question writing wishes.

The one exception to that is the case the place all you want to do is clear out the result of the usual question. If so, pre_get_posts is the instrument you should utilize. So let’s check out it subsequent.


pre_get_posts is a hook, no longer a serve as. Fairly than question the database anew, pre_get_posts lets you adjust the $question object ahead of the database is queried — successfully filtering the effects returned by way of the usual question.

Typically, pre_get_posts is paired with conditional tags to clear out the question ends up in explicit scenarios. For instance, that you must use pre_get_posts to go back a special collection of posts at the web site homepage. In essence, if you wish to run the usual question however adjust it come what may, pre_get_posts is the instrument for the activity.

There are some circumstances through which pre_get_posts won’t paintings and must no longer be used. The WordPress Codex suggests two such instances:

  • The pre_get_posts clear out must no longer be used to change the question at the template for a unmarried web page as a result of doing so will intrude with homes already set by way of parse_query().
  • The pre_get_posts clear out won’t paintings if added to a template information akin to archive.php as a result of those information are loaded after the primary question has already run.

The place does that depart us? That signifies that pre_get_posts is a brilliant selection for editing the question loading posts into the primary loop of the homepage, weblog web page, and person pages akin to web page.php and unmarried.php.

Alternatively, every so often filtering the usual question isn’t sufficient. Most likely you wish to have to make use of a couple of WordPress queries, or manipulate question ends up in a manner that pre_get_posts gained’t permit. If so, you’ll be able to head again to WP_Query or learn on for a couple of further choices.


In the event you dig round in search of WordPress tutorials from a number of years in the past, you’ll to find many tutorials recommending using query_posts(). Alternatively, fashionable tutorials nearly universally counsel by contrast. Right here’s why.

The query_posts() serve as replaces the primary question object, $question, which is created and utilized by the default loop run by way of the WordPress core. It does this by way of growing a brand new WP_Query example and assigning it to the $question object.

That can make it sound as though query_posts() is truly robust and helpful. Alternatively, twiddling with the core loop signifies that query_posts() has major downsides and should be avoided.

The official WordPress code reference supplies a number of the explanation why use of query_posts() must be have shyed away from within the overwhelming majority of instances. The main causes given for this come with:

  • The usage of query_posts() can considerably decelerate web page load time by way of expanding by way of up to double the quantity of labor required to procedure the question.
  • Since query_posts() replaces the usual question information it may reason any collection of issues of pagination and wreak havoc on pages that employ a couple of queries.

Briefly, use of query_posts() is a perilous proposition. As a question of truth, the official documentation opens with the caveat: This serve as will totally override the primary question and isn’t supposed to be used by way of plugins or subject matters. Its overly-simplistic strategy to editing the primary question may also be problematic and must be have shyed away from anywhere imaginable.

In different phrases, in the event you’re coding a theme or plugin — which is strictly what the huge majority people are doing — keep away from using query_posts(). As an alternative, create a completely new WP_Query object or use get_posts(), get_pages(), or pre_get_posts as an alternative.


Call to mind the get_posts() serve as as a modifiable, predefined example of the WP_Query elegance, as a result of that’s precisely what it’s. Whilst you use get_posts() you’re successfully calling up preset default values and the use of them to create an example of the WP_Query elegance.

In a single sense, get_posts() is so much like query_posts(): they’re each predefined circumstances of WP_Query. Alternatively, they’re additionally rather other as a result of query_posts() replaces the default $question object whilst get_posts() merely creates a completely new question that doesn’t intrude with international variables in the best way that query_posts() does.

So, what’s the purpose in the use of get_posts()? Why no longer simply use WP_Query? The solution is comfort. In the event you’re considering of the use of get_posts() that you must surely accomplish no matter it’s you’re looking to accomplish with WP_Query. Alternatively, by way of the use of get_posts() you save your self a couple of keystrokes.

There’s some other distinction between WP_Query and get_posts(). This is that the latter returns an array of posts whilst the previous returns posts separately with the_post() serve as. That signifies that get_posts() returns all posts without delay as an array whilst WP_Query iterates via posts separately echoing out the related content material of every put up because it iterates. Almost talking, because of this when the use of get_posts() you utilize a foreach serve as to show the effects, however you utilize the usual if...whilst loop construction to echo out content material whilst the use of WP_Query.

The opposite factor to bear in mind is that since get_posts() does no longer adjust the worldwide $question object, you want to make use of setup_postdata() for every put up to get get entry to to WP_Query strategies and homes. Whilst that can sound difficult, it truly isn’t. Take a look:

In order that little bit of code will go back 4 posts from the slider class (possibly to show them in a put up slider). First, we make certain that the question returned one thing with the if ( $slider_posts ) code, after which cycle during the posts showing the identify and content material. By means of the use of setup_postdata() we’re in a position to make use of international variables akin to $identification and $authordata in addition to template tags akin to the_title() and the_content(). With out putting in place put up information, we’d no longer be capable to use the ones variables and template tags.


One question serve as that doesn’t get very a lot consideration is the get_pages() question. Not like all the different queries on this put up, which can be all one way or the other associated with WP_Query, get_pages() is a serve as that bypasses WP_Query and without delay queries the database.

Like get_posts(), this serve as returns the content material it locates in an array. Alternatively, not like get_posts(), which can be utilized to tug up any posts of any put up kind (posts, pages, customized put up varieties, and so on), get_pages() can best be used to retrieve hierarchical put up varieties akin to pages and hierarchical customized put up varieties.

As well as, get_pages() lets you specify a couple of question parameters which can be distinctive to hierarchical put up varieties together with 'child_of', 'dad or mum', and 'hierarchical'. Get admission to to those parameters is the main explanation why it’s possible you’ll imagine the use of this actual question.

Hanging Idea Into Follow

On this put up we’ve presented 5 robust WordPress question gear however we haven’t truly proven you find out how to use them. Alternatively, we’ve written about writing customized queries previously and you’ll be able to be told extra about find out how to use those queries on your subject matters and plugins by way of testing those different sources from our weblog:


As you’ll be able to see, in the case of querying the WordPress database, there is not any scarcity of choices. There are a minimum of 5 robust gear that WordPress builders can use to come up with the database entries they need to show. Let’s recap every of the to be had choices:

  • WP_Query: the flexible elegance that powers maximum WordPress queries. It’s versatile and can be utilized to create any kind of question.
  • pre_get_posts: a hook which can be utilized to refine the $question object ahead of the database is queried, thereby safely editing the default question. Use it together with conditional tags to refine the result of the usual question.
  • query_posts(): an impressive example of the WP_Query elegance that replaces the default $question object and isn’t supposed for theme or plugin construction. Don’t use it.
  • get_posts(): an example of the WP_Query elegance that returns an array of posts. It features a vary of default values that can prevent a couple of keystrokes as opposed to crafting a customized example of WP_Query, however provided that the default choices suit your wishes.
  • get_pages(): a serve as that may be subtle via using hierarchical parameters and returns an array of hierarchical put up varieties, akin to pages or hierarchical customized put up varieties.
WordPress Developers

[ continue ]