Query_posts?可以用来控制在循环The Loop中显示哪些文章。它可以接受各种参数,就像你的URL中使用的参数(例如:参数p,p=4表示只显示ID为4的文章).
通常的用法:
The query_posts function is intended to be used to modify the main page Loop?only. It is not intended as a means to create secondary Loops on the page. If you want to create separate Loops outside of the main one, you should create separate?WP_Query?objects and use those instead. Use of query_posts on Loops other than the main one can result in your main Loop becoming incorrect and possibly displaying things that you were not expecting.
The query_posts function overrides and replaces the main query for the page. To save your sanity, do not use it for any other purpose.
Place a call to?query_posts()?in one of your?Template?files before?The Loop?begins. The?wp_query?object will generate a new SQL query using your parameters. When you do this, WordPress ignores the other parameters it receives via the URL (such as page number or category). If you want to preserve that information, you can use the?$query_string?global variable in the call to?query_posts().
For example, to set the display order of the posts without affecting the rest of the query string, you could place the following before?The Loop:
global $query_string; query_posts($query_string . "&order=ASC");
When using?query_posts?in this way, the quoted portion of the argument?must?begin with an ampersand (&).
This is not an exhaustive list yet. It is meant to show some of the more common things possible with setting your own queries.
Show posts only belonging to certain categories.
Show One Category by ID
Display posts from only one category ID (and any children of that category):
query_posts('cat=4');
Show One Category by Name
Display posts from only one category by name:
query_posts('category_name=Staff Home');
Show Several Categories by ID
Display posts from several specific category IDs:
query_posts('cat=2,6,17,38');
Exclude Posts Belonging to Only One Category
Show all posts?except?those from a category by prefixing its ID with a '-' (minus) sign.
query_posts('cat=-3');
This excludes any post that belongs to category 3.
Multiple Category Handling
Display posts that are in multiple categories. This shows posts that are in both categories 2 and 6:
query_posts(array('category__and' => array(2,6)));
To display posts from either category 2 OR 6, you could use?cat?as mentioned above, or by using?category__in(note this does not show posts from any children of these categories):
query_posts(array('category__in' => array(2,6)));
You can also exclude multiple categories this way:
query_posts(array('category__not_in' => array(2,6)));
Show posts associated with certain tags.
Fetch posts for one tag
query_posts('tag=cooking');
Fetch posts that have either of these tags
query_posts('tag=bread,baking');
Fetch posts that have all three of these tags:
query_posts('tag=bread+baking+recipe');
Multiple Tag Handling
Display posts that are tagged with both tag id 37 and tag id 47:
query_posts(array('tag__and' => array(37,47));
To display posts from either tag id 37 or 47, you could use?tag?as mentioned above, or explicitly specify by using?tag__in:
query_posts(array('tag__in' => array(37,47));
Display posts that do not have any of the two tag ids 37 and 47:
query_posts(array('tag__not_in' => array(37,47));
The?tag_slug__in?and?tag_slug__and?behave much the same, except match against the tag's slug.
Also see?Ryan's discussion of Tag intersections and unions.
你也可以通过作者限定文章
注释:?author_name为定义于user_nicename中的字段,author为作者的id。
排除置顶文章后依照标题排序显示所有作者ID为1的已发布页面:
query_posts('caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC');
Retrieve a single post or page.
To return both posts and custom post type movie
query_posts( array( 'post_type' => array('post', 'movie') ) );
Sticky posts first became available with WordPress Version 2.7. Posts that are set as Sticky will be displayed before other posts in a query, unless excluded with the?caller_get_posts=1?parameter.
To return just the first sticky post:
$sticky=get_option('sticky_posts')?; query_posts('p=' . $sticky[0]);
or
$args = array( 'posts_per_page' => 1, 'post__in' => get_option('sticky_posts'), 'caller_get_posts' => 1 ); query_posts($args);
Note: the second method returns only the more recent sticky post; if there are not sticky posts, it returns the last post published.
To return just the first sticky post or nothing:
$sticky = get_option('sticky_posts'); $args = array( 'posts_per_page' => 1, 'post__in' => $sticky, 'caller_get_posts' => 1 ); query_posts($args); if($sticky[0]) { // insert here your stuff... }
To exclude all sticky posts from the query:
query_posts(array("post__not_in" =>get_option("sticky_posts")));
Return ALL posts with 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('caller_get_posts=1&posts_per_page=3&cat=6');
Return posts with the category, but exclude sticky posts completely, and adhere to paging rules:
3, 'caller_get_posts'=>1, 'post__not_in' => $sticky, 'paged'=>$paged, ); query_posts($args); ?>
Retrieve posts belonging to a certain time period.
Returns posts for just the current date:
$today = getdate(); query_posts('year=' .$today["year"] .'&mOnthnum=' .$today["mon"] .'&day=' .$today["mday"] );
Returns posts for just the current week:
$week = date('W'); $year = date('Y'); query_posts('year=' . $year .'&w=' .$week );
Returns posts dated December 20:
query_posts( 'mOnthnum=12&day=20' );
Return posts for posts for March 1 to March 15, 2009:
= '2009-03-01' AND post_date <'2009-03-16'"; return $where; } add_filter('posts_where', 'filter_where'); query_posts($query_string); ?>
Return posts from the last 30 days:
'" . date('Y-m-d', strtotime('-30 days')) . "'"; return $where; } add_filter('posts_where', 'filter_where'); query_posts($query_string); ?>
Return posts 30 to 60 days old
= '" . 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); ?>
You can?displace?or pass over one or more initial posts which would normally be collected by your query through the use of the offset parameter.
The following will display the 5 posts which follow the most recent (1):
query_posts('posts_per_page=5&offset=1');
Sort retrieved posts by this field.
Designates the ascending or descending order of the ORDERBY parameter.
Retrieve posts (or?Pages) based on a custom field key or value.
Returns posts with custom fields matching both a key of 'color' AND a value of 'blue':
query_posts('meta_key=color&meta_value=blue');
Returns posts with a custom field key of 'color', regardless of the custom field value:
query_posts('meta_key=color');
Returns posts where the custom field value is 'color', regardless of the custom field key:
query_posts('meta_value=color');
Returns any?Page?where the custom field value is 'green', regardless of the custom field key:
query_posts('post_type=page&meta_value=green');
Returns both posts and?Pages?with a custom field key of 'color' where the custom field value IS NOT EQUAL TO 'blue':
query_posts('post_type=any&meta_key=color&meta_compare=!=&meta_value=blue');
Returns posts with custom field key of 'miles' with a custom field value that is LESS THAN OR EQUAL TO 22. Note the value 99 will be considered greater than 100 as the data is stored as strings, not numbers.
query_posts('meta_key=miles&meta_compare=<=&meta_value=22');
You may have noticed from some of the examples above that you combine parameters with an ampersand (&), like so:
query_posts('cat=3&year=2004');
Posts for category 13, for the current month on the main page:
if (is_home()) { query_posts($query_string . '&cat=13&mOnthnum=' . date('n',current_time('timestamp'))); }
At 2.3 this combination will return posts belong to both Category 1 AND 3, showing just two (2) posts, in descending order by the title:
query_posts(array('category__and'=>array(1,3),'posts_per_page'=>2,'orderby'=>title,'order'=>DESC));
In 2.3 and 2.5 one would expect the following to return all posts that belong to category 1 and is tagged "apples"
query_posts('cat=1&tag=apples');
A bug prevents this from happening. See?Ticket #5433. A workaround is to search for several tags using +
query_posts('cat=1&tag=apples+apples');
This will yield the expected results of the previous query. Note that using 'cat=1&tag=apples+oranges' yields expected results.
Placing this code in your?index.php?file will cause your home page to display posts from all categories?exceptcategory ID 3.
You can also add some more categories to the exclude-list (tested with WP 2.1.2):
To retrieve a particular post, you could use the following:
If you want to use the?Read More?functionality with this query, you will need to set the global?$more?variable to 0.
To retrieve a particular page, you could use the following:
or
For child pages, the slug of the parent and the child is required, separated by a slash. For example:
You can pass a variable to the query with two methods, depending on your needs. As with other examples, place these above your Loop:
In this example, we concatenate the query before running it. First assign the variable, then concatenate and then run it. Here we're pulling in a category variable from elsewhere.
In this next example, the double quotes tell PHP to treat the enclosed as an expression. For this example, we are getting the current month and the current year, and telling?query_posts?to bring us the posts for the current month/year, and in this case, listing in ascending order so we get the oldest post at the top of the page.
This example explains how to generate a complete list of posts, dealing with pagination. We can use the default?$query_string?telling?query_posts?to bring us a full posts listing. We can also modify theposts_per_page?query argument from -1 to the number of posts you want to show on each page; in this last case, you'll probably want to use?posts_nav_link()?to navigate the generated archive.
If you don't need to use the?$query_string?variable, another method exists that is more clear and readable, in some more complex cases. This method puts the parameters into an array. The same query as in Example 2 above could be done like this:
query_posts(array( 'cat' => 22, 'year' => $current_year, 'monthnum' => $current_month, 'order' => 'ASC', ));
As you can see, with this approach, every variable can be put on its own line, for easier reading.
By default running query_posts will completely overwrite all existing query variables on the current page. Pagination, categories dates etc. will be lost and only the variables you pass into query_posts will be used.
If you want to preserve the original query you can merge the original query array into your parameter array:
global $wp_query; query_posts( array_merge( array('cat' => 1), $wp_query->query ) );
The "Blog pages show at most" parameter in Settings > Reading can influence your results. To overcome this, add the 'posts_per_page' parameter. For example:
query_posts('category_name=The Category Name&posts_per_page=-1'); //returns ALL from the category