热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WordPress用于处理复杂查询的类WP_Query

描述WP_Query 是定义于 wp-includes/query.php 中的一个用于处理复杂的请求wordpress博客中文章或页面的类。 wp-blog-header.php (或在wp版本Version2.0中的类)提供了 $wp_query&

描述

WP_Query?是定义于?wp-includes/query.php?中的一个用于处理复杂的请求wordpress博客中文章或页面的类。?wp-blog-header.php?(或在wp版本Version 2.0中的类) 提供了?$wp_query?对象定义当前请求的信息, 然后?$wp_query?决定其属于哪种类型的查询(可能是一个分类存档、日期存档、feed或搜索)并获取所请求的文章。它在请求中保留的众多信息可在稍后使用。

与WP_Query的互动

多数情况下,你不用通过处理内部类或全局变量就能找到你所需要的信息。当需要某些信息的时候,这里的众多函数即可供你调用。

WP_Query通常用于这两种情况。 第一种是获取当前WordPress正在处理的请求类型。利用$is_*属性并结合Conditional Tags就可以保存这些数据信息。这是插件作者们经常遇到的情况(也是主题作者第二常见的)。

第二种情况用于The Loop。WP_Query?为主循环中的常见任务提供了众多函数。 首先,have_posts()通过$wp_query->have_posts()的形式进行调用,以查询是否有文章。若有,则利用?have_posts()?作为判断条件开始?while?循环。只要有文章要显示就不断地迭代该操作。 如前所述,在每一次迭代的时候,?the_post()函数会建立内部变量$wp_query和全局变量$post(依赖于Template Tags?),以?$wp_query->the_post()?的形式调用。写主循环的时候你应该会用上这些函数。可参考?The Loop?和?The Loop in Action?获得更多信息。

Note:?如果你的查询操作中使用了?the_post(), 你应该调用?wp_reset_postdata()?使得之后的Template Tags?能再次对当前文章进行查询操作。

用法

have_posts() )?:
	$the_query->the_post();
	echo '
  • ' . get_the_title() . '
  • '; endwhile; /* Restore original Post Data * NB: Because we are using new WP_Query we aren't stomping on the * original $wp_query and it does not need to be reset. */ wp_reset_postdata(); /* The 2nd Query (without global var) */ $query2 = new WP_Query( $args2 ); // The 2nd Loop while( $query2->have_posts() ): $query2->next_post(); echo '
  • ' . get_the_title( $query2->post->ID ) . '
  • '; endwhile; // Restore original Post Data wp_reset_postdata(); ?>

    方法和属性

    This is the formal documentation of?WP_Query. You shouldn't alter the properties directly, but instead use the methods to interact with them. Also see?Interacting with WP_Query?for some useful functions that avoid the need to mess around with class internals and global variables.

    属性

    $query
    Holds the query string that was passed to the $wp_query object by WP class.
    $query_vars
    An associative array containing the dissected?$query: an array of the query variables and their respective values.
    $queried_object
    Applicable if the request is a category, author, permalink or Page. Holds information on the requested category, author, post or Page.
    $queried_object_id
    If the request is a category, author, permalink or post / page, holds the corresponding ID.
    $posts
    Gets filled with the requested posts from the database.
    $post_count
    The number of posts being displayed.
    $found_posts
    The total number of posts found matching the current query parameters
    $max_num_pages
    The total number of pages. Is the result of $found_posts / $posts_per_page
    $current_post
    (available during?The Loop) Index of the post currently being displayed.
    $post
    (available during?The Loop) The post currently being displayed.
    $is_single,?$is_page,?$is_archive,?$is_preview,?$is_date,?$is_year,?$is_month,?$is_time,$is_author,?$is_category,?$is_tag,?$is_tax,?$is_search,?$is_feed,?$is_comment_feed,$is_trackback,?$is_home,?$is_404,?$is_comments_popup,?$is_admin,?$is_attachment,$is_singular,?$is_robots,?$is_posts_page,?$is_paged
    Booleans?dictating what type of request this is. For example, the first three represent 'is it a permalink?', 'is it a Page?', 'is it any type of archive page?', respectively.

    方法

    (An ampersand (&) before a method name indicates it?returns by reference.)

    init()
    Initialise the object, set all properties to null, zero or false.
    parse_query( $query )
    Takes a query string defining the request, parses it and populates all properties apart from?$posts,?$post_count,?$post?and$current_post.
    parse_query_vars()
    Reparse the old query string.
    get( $query_var )
    Get a named query variable.
    set( $query_var, $value )
    Set a named query variable to a specific value.
    &get_posts()
    Fetch and return the requested posts from the database. Also populate?$posts?and?$post_count.
    next_post()
    (to be used when in?The Loop) Advance onto the next post in?$posts. Increment?$current_post?and set?$post?to the (new) current post object (note: this does not set the global?$post?variable, only the WP_Query object's instance variable.) Returns the current post object
    the_post()
    (to be used when in?The Loop) Advance onto the next post, and set the global?$post?variable.
    have_posts()
    (to be used when in?The Loop, or just before The Loop) Determine if we have posts remaining to be displayed.
    rewind_posts()
    Reset?$current_post?and?$post.
    &query( $query )
    Call?parse_query()?and?get_posts(). Return the results of?get_posts().
    get_queried_object()
    Set?$queried_object?if it's not already set and return it.
    get_queried_object_id()
    Set?$queried_object_id?if it's not already set and return it.
    WP_Query( $query = '' )?(constructor)
    If you provide a query string, call?query()?with it.

    参数

    作者

    Show posts associated with certain author.

    • author?(int) - use author id.
    • author_name?(string) - use 'user_nicename' (NOT name).

    Show Posts for one Author

    Display posts by author, using author id:

    $query = new WP_Query( 'author=123' );

    Display posts by author, using author 'user_nicename':

    $query = new WP_Query( 'author_name=rami' );

    Show Posts From Several Authors

    Display posts from several specific authors:

    $query = new WP_Query( 'author=2,6,17,38' );

    Exclude Posts Belonging to an Author

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

    $query = new WP_Query( 'author=-12' );

    分类目录

    Show posts associated with certain categories.

    • cat?(int) - use category id.
    • category_name?(string) - use category slug (NOT name).
    • category__and?(array) - use category id.
    • category__in?(array) - use category id.
    • category__not_in?(array) - use category id.

    Show Posts for One Category

    Display posts that have this category (and any children of that category), using category id:

    $query = new WP_Query( 'cat=4' );

    Display posts that have this category (and any children of that category), using category slug:

    $query = new WP_Query( 'category_name=staff' );

    Display posts that have this category (not children of that category), using category id:

    $query = new WP_Query( 'category__in=4' );

    Show Posts From Several Categories

    Display posts that have these categories, using category id:

    $query = new WP_Query( 'cat=2,6,17,38' );

    Display posts that have these categories, using category slug:

    $query = new WP_Query( 'category_name=staff,news' );

    Exclude Posts Belonging to Category

    Display all posts?except?those from a category by prefixing its id with a '-' (minus) sign.

    $query = new WP_Query( 'cat=-12,-34,-56' );

    Multiple Category Handling

    Display posts that are in multiple categories. This shows posts that are in both categories 2 and 6:

    $query = new WP_Query( 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 = new WP_Query( array( 'category__in' => array( 2, 6 ) ) );

    You can also exclude multiple categories this way:

    $query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) );

    标签

    Show posts associated with certain tags.

    • tag?(string) - use tag slug.
    • tag_id?(int) - use tag id.
    • tag__and?(array) - use tag ids.
    • tag__in?(array) - use tag ids.
    • tag__not_in?(array) - use tag ids.
    • tag_slug__and?(array) - use tag slugs.
    • tag_slug__in?(array) - use tag slugs.

    Show Posts for One Tag

    Display posts that have this tag, using tag slug:

    $query = new WP_Query( 'tag=cooking' );

    Display posts that have this tag, using tag id:

    $query = new WP_Query( 'tag_id=13' );

    Show Posts From Several Tags

    Display posts that have "either" of these tags:

    $query = new WP_Query( 'tag=bread,baking' );

    Display posts that have "all" of these tags:

    $query = new WP_Query( 'tag=bread+baking+recipe' );

    Multiple Tag Handling

    Display posts that are tagged with both tag id 37 and tag id 47:

    $query = new WP_Query( 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 = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) );

    Display posts that do not have any of the two tag ids 37 and 47:

    $query = new WP_Query( 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.

    类别

    Show posts associated with certain?taxonomy.

    • {tax}?(string) - use taxonomy slug.?Deprecated?as of?Version 3.1?in favor of 'tax_query'.
    • tax_query?(array) - use taxonomy parameters (available with?Version 3.1).
      • taxonomy?(string) - Taxonomy.
      • field?(string) - Select taxonomy term by ('id' or 'slug')
      • terms?(int/string/array) - Taxonomy term(s).
      • include_children?(boolean) - Whether or not to include children for hierarchical taxonomies. Defaults to true.
      • operator?(string) - Operator to test. Possible values are 'IN', 'NOT IN', 'AND'.

    Important Note:?tax_query?takes an?array?of tax query arguments?arrays?(it takes an array of arrays) - you can see this in the second example below. This construct allows you to query multiple taxonomies by using the?relation?parameter in the first (outer) array to describe the boolean relationship between the taxonomy queries.

    As of?3.5, a bug was fixed where?tax_query?would inadvertently return?all?posts when a result was empty.

    Simple Taxonomy Query:

    Display?posts?tagged with?bob, under?people?custom taxonomy:

    $args = array(
    	'post_type' => 'post',
    	'people' => 'bob'
    );
    $query = new WP_Query( $args );

    Display?posts?tagged with?bob, under?people?custom taxonomy, using?tax_query:

    $args = array(
    	'post_type' => 'post',
    	'tax_query' => array(
    		array(
    			'taxonomy' => 'people',
    			'field' => 'slug',
    			'terms' => 'bob'
    		)
    	)
    );
    $query = new WP_Query( $args );

    Multiple Taxonomy Handling:

    Display?posts?from several custom taxonomies:

    $args = array(
    	'post_type' => 'post',
    	'people' => 'bob',
    	'language' => 'english'
    );
    $query = new WP_Query( $args );

    Display?posts?from several custom taxonomies, using?tax_query:

    $args = array(
    	'post_type' => 'post',
    	'tax_query' => array(
    		'relation' => 'AND',
    		array(
    			'taxonomy' => 'movie_genre',
    			'field' => 'slug',
    			'terms' => array( 'action', 'comedy' )
    		),
    		array(
    			'taxonomy' => 'actor',
    			'field' => 'id',
    			'terms' => array( 103, 115, 206 ),
    			'operator' => 'NOT IN'
    		)
    	)
    );
    $query = new WP_Query( $args );

    Display?posts?that are in the?quotes?category OR have the?quote?format:

    $args = array(
    	'post_type' => 'post',
    	'tax_query' => array(
    		'relation' => 'OR',
    		array(
    			'taxonomy' => 'category',
    			'field' => 'slug',
    			'terms' => array( 'quotes' )
    		),
    		array(
    			'taxonomy' => 'post_format',
    			'field' => 'slug',
    			'terms' => array( 'post-format-quote' )
    		)
    	)
    );
    $query = new WP_Query( $args );

    搜索

    Show posts based on a keyword search.

    • s?(string) - Search keyword.

    Show Posts based on a keyword search

    Display posts that match the search term "keyword":

    $query = new WP_Query( 's=keyword' );

    文章 & 页面

    Display content based on post and page parameters.

    • p?(int) - use post id.
    • name?(string) - use post slug.
    • page_id?(int) - use page id.
    • pagename?(string) - use page slug.
    • post_parent?(int) - use page id. Return just the child Pages.
    • post__in?(array) - use post ids. Specify posts to retrieve.
    • post__not_in?(array) - use post ids. Specify post NOT to retrieve.

    Show Post/Page by ID

    Display post by ID:

    $query = new WP_Query( 'p=7' );

    Display page by ID:

    $query = new WP_Query( 'page_id=7' );

    Show Post/Page by Slug

    Display post by?slug:

    $query = new WP_Query( 'name=about-my-life' );

    Display page by?slug:

    $query = new WP_Query( 'pagename=contact' );

    Show Child Posts/Pages

    Display child page using the slug of the parent and the child page, separated by a slash (e.g. 'parent_slug/child_slug'):

    $query = new WP_Query( 'pagename=contact_us/canada' );

    Display child pages using parent page ID:

    $query = new WP_Query( 'post_parent=93' );

    Display only top-level pages, exclude all child pages:

    $query = new WP_Query( 'post_parent=0' );

    Multiple Posts/Pages Handling

    Display only the specific posts:

    $query = new WP_Query( array( 'post_type' => 'page', 'post__in' => array( 2, 5, 12, 14, 20 ) ) );

    Display all posts but NOT the specified ones:

    $query = new WP_Query( array( 'post_type' => 'post', 'post__not_in' => array( 2, 5, 12, 14, 20 ) ) );

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

    类型

    Show posts associated with certain?type.

    • post_type?(string?/?array) - use post types. Retrieves posts by?Post Types, default value is 'post';
      • 'post' - a post.
      • 'page' - a page.
      • 'revision' - a revision.
      • 'attachment' - an attachment. The default WP_Query sets 'post_status'=>'publish', but attachments default to 'post_status'=>'inherit' so you'll need to set the status to 'inherit' or 'any'.
      • 'any' - retrieves any type except revisions and types with 'exclude_from_search' set to true.
      • Custom Post Types (e.g. movies)

    Show Post by Type

    Display only pages:

    $query = new WP_Query( 'post_type=page' );

    Display 'any' post type (retrieves any type except revisions and types with 'exclude_from_search' set to TRUE):

    $query = new WP_Query( 'post_type=any' );

    Display multiple post types, including custom post types:

    $query = new WP_Query( array( 'post_type' => array( 'post', 'page', 'movie', 'book' ) ) );

    状态

    Show posts associated with certain?status.

    • post_status?(string?/?array) - use post status. Retrieves posts by?Post Status. Default value is 'publish', but if the user is logged in, 'private' is added. And if the query is run in an admin context (administration area or AJAX call), protected statuses are added too. By default protected statuses are 'future', 'draft' and 'pending'.
      • '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 (available with?Version 2.9).
      • 'any' - retrieves any status except those from post types with 'exclude_from_search' set to true.

    Show Post by Status

    Display only drafts:

    $query = new WP_Query( 'post_status=draft' );

    Display multiple post status:

    $query = new WP_Query( array( 'post_status' => array( 'pending', 'draft', 'future' ) ) );

    Display all attachments:

    $query = new WP_Query( array( 'post_status' => 'any', 'post_type' => 'attachment' ) );

    分页

    • nopaging?(boolean) - show all posts or use pagination. Default value is 'false', use paging.
    • posts_per_page?(int) - number of post to show per page (available with?Version 2.1, replaced?showposts?parameter). 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, or filter 'pre_option_posts_per_rss' and return -1
    • posts_per_archive_page?(int) - number of posts to show per page - on archive pages only. Over-rides?posts_per_pageand?showposts?on pages where?is_archive()?or?is_search()?would be true.
    • offset?(int) - number of post to?displace?or pass over.?Note: Setting offset parameter will ignore the paged parameter.
    • paged?(int) - number of page. Show the posts that would normally show up just on page X when using the "Older Entries" link.

    Show x Posts per page

    Display 3 posts per page:

    $query = new WP_Query( 'posts_per_page=3' );

    Show All Post

    Display all posts in one page:

    $query = new WP_Query( 'posts_per_page=-1' );

    Display all posts by disabling pagination:

    $query = new WP_Query( 'nopaging=true' );

    Pass over Posts

    Display posts from the 4th one:

    $query = new WP_Query( 'offset=3' ) );

    Display 5 posts per page which follow the 3 most recent posts:

    $query = new WP_Query( array( 'posts_per_page' => 5, 'offset' => 3 ) );

    Show Posts from page x

    Display posts from page number 6:

    $query = new WP_Query( 'paged=6' );

    Show Posts from Current Page

    Display posts from current page:

    $query = new WP_Query( array( 'paged' => get_query_var( 'paged' ) ) );

    Display posts from the current page and set the 'paged' parameter to 1 when the query variable is not set (first page).

    $paged = (get_query_var('paged'))?? get_query_var('paged')?: 1;
    $query = new WP_Query( array( 'paged' => $paged ) );

    Pagination Note: Use?get_query_var('page');?if you want your query to work in a?Page template?that you've set as your?static front page. The query variable 'page' also holds the pagenumber for a single paginated Post or Page that includes the??Quicktag?in the post content.

    Display posts from current page on a?static front page:

    $paged = (get_query_var('page'))?? get_query_var('page')?: 1;
    $query = new WP_Query( array( 'paged' => $paged ) );

    排序

    Sort retrieved posts.

    • order?(string) - Designates the ascending or descending order of the 'orderby' parameter. Defaults to 'DESC'.
      • 'ASC' - ascending order from lowest to highest values (1, 2, 3; a, b, c).
      • 'DESC' - descending order from highest to lowest values (3, 2, 1; c, b, a).
    • orderby?(string) - Sort retrieved posts by parameter. Defaults to 'date'.
      • 'none' - No order (available with?Version 2.8).
      • 'ID' - Order by post id. Note the captialization.
      • 'author' - Order by author.
      • 'title' - Order by title.
      • 'name' - Order by post name (post slug).
      • 'date' - Order by date.
      • 'modified' - Order by last modified date.
      • 'parent' - Order by post/page parent id.
      • 'rand' - Random order.
      • 'comment_count' - Order by number of comments (available with?Version 2.9).
      • 'menu_order' - Order by Page Order. Used most often for?Pages?(Order?field in the Edit Page Attributes box) and forAttachments?(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). Use 'meta_value_num' instead for numeric values.
      • 'meta_value_num' - Order by numeric meta value (available with?Version 2.8). Also note that a 'meta_key=keyname' must also be present in the query. This value allows for numerical sorting as noted above in 'meta_value'.
      • 'post__in' - Preserve post ID order given in the post__in array (available with?Version 3.5).

    Show Posts sorted by Title, Descending order

    Display posts sorted by post title in a descending order:

    $query = new WP_Query( array ( 'orderby' => 'title', 'order' => 'DESC' ) );

    Show Random Post

    Display one random post:

    $query = new WP_Query( array ( 'orderby' => 'rand', 'posts_per_page' => '1' ) );

    Show Popular Posts

    Display posts ordered by comment count:

    $query = new WP_Query( array( 'orderby' => 'comment_count' ) );

    Show Products sorted by Price

    Display posts with 'Product' type ordered by 'Price' custom field:

    $query = new WP_Query( array ( 'post_type' => 'product', 'orderby' => 'meta_value', 'meta_key' => 'price' ) );

    Multiple 'orderby' values

    Display pages ordered by 'title' and 'menu_order'. (title is dominant):

    $query = new WP_Query( array( 'post_type' => 'page', 'orderby' => 'title menu_order', 'order' => 'ASC' ) );

    'orderby' with 'meta_value' and custom post type

    Display posts of type 'my_custom_post_type', ordered by 'age', and filtered to show only ages 3 and 4 (using meta_query).

     $args = array(
       'post_type' => 'my_custom_post_type',
       'meta_key' => 'age',
       'orderby' => 'meta_value_num',
       'order' => 'ASC',
       'meta_query' => array(
           array(
               'key' => 'age',
               'value' => array(3, 4),
               'compare' => 'IN',
           )
       )
     );
     $query = new WP_Query($args);

    置顶文章

    Show?Sticky Posts?or ignore them.

    • ignore_sticky_posts?(boolean) - ignore sticky posts or not (available with?Version 3.1, replaced?caller_get_postsparameter). Default value is 0 - don't ignore sticky posts.?Note: 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 = new WP_Query( '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 = new WP_Query( $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 = new WP_Query( $args );
    if ( $sticky[0] ) {
    	// insert here your stuff...
    }

    Don't Show Sticky Posts

    Exclude all sticky posts from the query:

    $query = new WP_Query( 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 = new WP_Query( array( '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( 'paged' )?? get_query_var( 'paged' )?: 1;
    $sticky = get_option( 'sticky_posts' );
    $args = array(
    	'cat' => 3,
    	'ignore_sticky_posts' => 1,
    	'post__not_in' => $sticky,
    	'paged' => $paged
    );
    $query = new WP_Query( $args );

    时间

    Show posts associated with a certain time period.

    • year?(int) - 4 digit year (e.g. 2011).
    • monthnum?(int) - Month number (from 1 to 12).
    • w?(int) - Week of the year (from 0 to 53). Uses the?MySQL WEEK command. The mode is dependent on the "start_of_week" option.
    • day?(int) - Day of the month (from 1 to 31).
    • hour?(int) - Hour (from 0 to 23).
    • minute?(int) - Minute (from 0 to 60).
    • second?(int) - Second (0 to 60).

    Returns posts for just the current date:

    $today = getdate();
    $query = new WP_Query( 'year=' . $today["year"] . '&mOnthnum=' . $today["mon"] . '&day=' . $today["mday"] );

    Returns posts for just the current week:

    $week = date('W');
    $year = date('Y');
    $query = new WP_Query( 'year=' . $year . '&w=' . $week );

    Returns posts dated December 20:

    $query = new WP_Query( '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_wherefilter, and should be modifyable for most time-relative queries.

    Return posts for March 1 to March 15, 2010:

    // 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 = new WP_Query( $query_string );
    remove_filter( 'posts_where', 'filter_where' );

    Return posts from the last 30 days:

    // 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 = new WP_Query( $query_string );
    remove_filter( 'posts_where', 'filter_where' );

    Return posts 30 to 60 days old

    // 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 = new WP_Query( $query_string );
    remove_filter( 'posts_where', 'filter_where' );

    自定义字段

    Show posts associated with a certain custom field.

    • meta_key?(string) - Custom field key.
    • meta_value?(string) - Custom field value.
    • meta_value_num?(number) - Custom field value.
    • meta_compare?(string) - Operator to test the 'meta_value'. Possible values are '!=', '>', '>=', '<', or '<='. Default value is '='.
    • meta_query?(array) - Custom field parameters (available with?Version 3.1).
      • key?(string) - Custom field key.
      • value?(string|array) - Custom field value (Note: Array support is limited to a compare value of 'IN', 'NOT IN', 'BETWEEN', or 'NOT BETWEEN') (This value may be omitted when using the 'EXISTS' or 'NOT EXISTS' comparisons in WordPress 3.5 and up)
      • compare?(string) - Operator to test. Possible values are '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS' (only in WP >= 3.5), and 'NOT EXISTS' (also only in WP >= 3.5). Default value is '='.
      • type?(string) - Custom field type. Possible values are 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Default value is 'CHAR'.

    The 'type' DATE works with the 'compare' value BETWEEN only if the date is stored at the format YYYYMMDD and tested with this format.

    Simple Custom Field Query:

    Display posts where the custom field key is 'color', regardless of the custom field value:

    $query = new WP_Query( 'meta_key=color' );

    Display posts where the custom field value is 'blue', regardless of the custom field key:

    $query = new WP_Query( 'meta_value=blue' );

    Display?Page?where the custom field value is 'blue', regardless of the custom field key:

    $query = new WP_Query( 'meta_value=blue&post_type=page' );

    Display posts where the custom field key is 'color' and the custom field value is 'blue':

    $query = new WP_Query( array( 'meta_key' => 'color', 'meta_value' => 'blue' ) );

    Display posts where the custom field key is 'color' and the custom field value IS NOT 'blue':

    $query = new WP_Query( array( 'meta_key' => 'color', 'meta_value' => 'blue', 'meta_compare' => '!=' ) );

    Display 'product'(s) where the custom field key is 'price' and the custom field value that is LESS THAN OR EQUAL TO 22.
    By using the 'meta_value' parameter the value 99 will be considered greater than 100 as the data are stored as 'strings', not 'numbers'. For number comparison use 'meta_value_num'.

    $query = new WP_Query( array( 'meta_key' => 'price', 'meta_value' => '22', 'meta_compare' => '<=', 'post_type' => 'product' ) );

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

    $query = new WP_Query( array ( 'meta_value' => '_wp_zero_value' ) );

    Single Custom Field Handling:

    Display posts from a single custom field:

    $args = array(
    	'post_type' => 'product',
    	'meta_query' => array(
    		array(
    			'key' => 'color',
    			'value' => 'blue',
    			'compare' => 'NOT LIKE'
    		)
    	)
    );
    $query = new WP_Query( $args );

    (Note that meta_query expects nested arrays, even if you only have one query.)

    Multiple Custom Field Handling:

    Display posts from several custom field:

    $args = array(
    	'post_type' => 'product',
    	'meta_query' => array(
    		array(
    			'key' => 'color',
    			'value' => 'blue',
    			'compare' => 'NOT LIKE'
    		),
    		array(
    			'key' => 'price',
    			'value' => array( 20, 100 ),
    			'type' => 'numeric',
    			'compare' => 'BETWEEN'
    		)
    	)
    );
    $query = new WP_Query( $args );

    Display posts that have meta key 'color' NOT LIKE value 'blue' OR meta key 'price' with values BETWEEN 20 and 100:

    $args = array(
    	'post_type' => 'product',
    	'meta_query' => array(
    		'relation' => 'OR',
    		array(
    			'key' => 'color',
    			'value' => 'blue',
    			'compare' => 'NOT LIKE'
    		),
    		array(
    			'key' => 'price',
    			'value' => array( 20, 100 ),
    			'type' => 'numeric',
    			'compare' => 'BETWEEN'
    		)
    	)
    );
    $query = new WP_Query( $args );

    权限

    • perm?(string) - User permission.

    Show posts if user has the appropriate capability:

    Display published and private posts, if the user has the appropriate capability:

    $query = new WP_Query( array( 'post_status' => array( 'publish', 'private' ), 'perm' => 'readable' ) );

    缓存

    Stop the data retrieved from being added to the cache.

    • cache_results?(boolean) - Post information cache.
    • update_post_meta_cache?(boolean) - Post meta information cache.
    • update_post_term_cache?(boolean) - Post term information cache.

    Show Posts witout adding post information to the cache

    Display 50 posts, but don't add post information to the cache:

    $query = new WP_Query( array( 'posts_per_page' => 50, 'cache_results' => false ) );

    Show Posts witout adding post meta information to the cache

    Display 50 posts, but don't add post meta information to the cache:

    $query = new WP_Query( array( 'posts_per_page' => 50, 'update_post_meta_cache' => false ) );

    Show Posts witout adding post term information to the cache

    Display 50 posts, but don't add post term information to the cache:

    $query = new WP_Query( array( 'posts_per_page' => 50, 'update_post_term_cache' => false ) );

    In general usage you should not need to use these, adding to the cache is the right thing to do, however they may be useful in specific circumstances. An example of such circumstances might be when using a WP_Query to retrieve a list of post titles and URLs to be displayed, but in which no other information about the post will be used and the taxonomy and meta data won't be needed. By not loading this information, you can save time from the extra unnecessary SQL queries.

    Note: If a persistent object cache backend (such as memcached) is used, these flags are set to false by default since there is no need to update the cache every page load when a persistent cache exists.

    返回字段

    Set return values.

    • fields?(string|array) - Which fields to return. Defaults to?all.
      • 'ids' - Return an array of post IDs.
      • 'id=>parent' - Return an associative array [ parent => ID, … ].
      • any other value or empty (default): return an array of post objects

    过滤器

    • posts_distinct?- Alters SQL 'DISTINCTROW' clause to the query that returns the post array.
    • posts_groupby?- Alters SQL 'GROUP BY' clause of the query that returns the post array.
    • posts_join?- Alters SQL 'JOIN' clause of the query that returns the post array.
    • post_limits?- Alters SQL 'LIMIT' clause of the query that returns the post array.
    • posts_orderby?- Alters SQL 'ORDER BY' clause of the query that returns the post array.
    • posts_where?- Alters SQL 'WHERE' clause of the query that returns the post array.
    • posts_join_paged?- Alters SQL paging for posts using 'JOIN' clause of the query that returns the post array.
    • posts_where_paged?- Alters SQL paging for posts using 'WHERE' clause of the query that returns the post array.
    • posts_clauses?- Alters?all?the SQL clauses above in one go. It gives you an array of elements that are easy to alter (available with?Version 3.1).

    Note, that there are more filters than the mentioned. As it is hard to keep the codex up to date, please inspect the?get_posts();function inside the WP_Query class yourself (/wp-includes/query.php).

    源文件

    WP_Query()?is located in?wp-includes/query.php.


    推荐阅读
    • OPPO黄页服务即将停止
      OPPO黄页服务因业务调整即将停止,用户需了解具体卸载路径及受影响的机型。 ... [详细]
    • 1函数1.1函数的定义  设xxx和yyy是两个变量,D,icod ... [详细]
    • PHP 编程疑难解析与知识点汇总
      本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
    • 深入理解OAuth认证机制
      本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
    • 极大似然估计(MLE)及其3D可视化解析
      本文详细介绍了极大似然估计(Maximum Likelihood Estimation, MLE)的推导过程,并通过3D可视化展示其在概率密度函数中的应用。我们将探讨如何利用MLE来估计参数,以及它在实际问题中的重要性。 ... [详细]
    • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
    • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
    • Python 异步编程:深入理解 asyncio 库(上)
      本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
    • 探讨一个老旧 PHP MySQL 系统中,时间戳字段不定期出现异常值的问题及其可能原因。 ... [详细]
    • 国内BI工具迎战国际巨头Tableau,稳步崛起
      尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
    • 优化ListView性能
      本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
    • 郑州大学在211高校中的地位与排名解析
      本文将详细解读郑州大学作为一所位于河南省的211和双一流B类高校,在全国211高校中的地位与排名,帮助高三学生更好地了解这所知名学府的实力与发展前景。 ... [详细]
    • 深入理解 Oracle 存储函数:计算员工年收入
      本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
    • 优化ASM字节码操作:简化类转换与移除冗余指令
      本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
    • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
    author-avatar
    以真做假公馆
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有