2006-03-12 20:44:32 -05:00
< ? php
2008-09-04 15:19:32 -04:00
/**
* WordPress Query API
*
* The query API attempts to get which part of WordPress to the user is on . It
* also provides functionality to getting URL query information .
*
* @ link http :// codex . wordpress . org / The_Loop More information on The Loop .
*
* @ package WordPress
* @ subpackage Query
2006-03-12 20:44:32 -05:00
*/
2006-11-19 02:56:05 -05:00
2008-09-04 15:19:32 -04:00
/**
* Retrieve variable in the WP_Query class .
*
* @ see WP_Query :: get ()
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ param string $var The variable key to retrieve .
* @ return mixed
*/
2006-03-12 20:44:32 -05:00
function get_query_var ( $var ) {
global $wp_query ;
return $wp_query -> get ( $var );
}
2008-09-04 15:19:32 -04:00
/**
* Set query variable .
*
* @ see WP_Query :: set ()
* @ since 2.2 . 0
* @ uses $wp_query
*
* @ param string $var Query variable key .
* @ param mixed $value
* @ return null
*/
2007-02-24 02:33:29 -05:00
function set_query_var ( $var , $value ) {
global $wp_query ;
return $wp_query -> set ( $var , $value );
}
2008-09-04 15:19:32 -04:00
/**
2010-03-17 00:39:50 -04:00
* Set up The Loop with query parameters .
2008-09-04 15:19:32 -04:00
*
* This will override the current WordPress Loop and shouldn ' t be used more than
* once . This must not be used within the WordPress Loop .
*
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ param string $query
* @ return array List of posts
*/
2006-03-12 20:44:32 -05:00
function & query_posts ( $query ) {
2006-11-09 01:50:58 -05:00
unset ( $GLOBALS [ 'wp_query' ]);
$GLOBALS [ 'wp_query' ] =& new WP_Query ();
return $GLOBALS [ 'wp_query' ] -> query ( $query );
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-03-17 00:39:50 -04:00
* Destroy the previous query and set up a new query .
2008-09-04 15:19:32 -04:00
*
* This should be used after { @ link query_posts ()} and before another { @ link
* query_posts ()} . This will remove obscure bugs that occur when the previous
2010-03-17 00:39:50 -04:00
* wp_query object is not destroyed properly before another is set up .
2008-09-04 15:19:32 -04:00
*
* @ since 2.3 . 0
* @ uses $wp_query
*/
2007-08-20 18:55:43 -04:00
function wp_reset_query () {
2009-05-20 12:05:23 -04:00
unset ( $GLOBALS [ 'wp_query' ]);
2007-08-20 18:55:43 -04:00
$GLOBALS [ 'wp_query' ] =& $GLOBALS [ 'wp_the_query' ];
2010-05-13 16:39:54 -04:00
wp_reset_postdata ();
}
/**
* After looping through a separate query , this function restores
* the $post global to the current post in the main query
*
* @ since 3.0 . 0
* @ uses $wp_query
*/
function wp_reset_postdata () {
2008-01-23 13:20:59 -05:00
global $wp_query ;
if ( ! empty ( $wp_query -> post ) ) {
2008-01-29 18:58:41 -05:00
$GLOBALS [ 'post' ] = $wp_query -> post ;
2008-01-23 13:20:59 -05:00
setup_postdata ( $wp_query -> post );
}
2007-08-20 18:55:43 -04:00
}
2006-03-12 20:44:32 -05:00
/*
* Query type checks .
*/
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for an archive page ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* Month , Year , Category , Author , ...
*
2010-10-14 06:39:47 -04:00
* If the $post_types parameter is specified , this function will additionally
2010-10-19 03:48:22 -04:00
* check if the query is for exactly one of the post types specified . If a plugin
2010-10-14 06:39:47 -04:00
* is causing multiple post types to appear in the query , specifying a post type
* will cause this check to return false .
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_archive ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-10-14 06:39:47 -04:00
* @ param mixed $post_types Optional . Post type or array of post types
2010-08-25 14:05:33 -04:00
* @ return bool
2008-09-04 15:19:32 -04:00
*/
2010-10-14 06:39:47 -04:00
function is_archive ( $post_types = '' ) {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-10-14 06:39:47 -04:00
return $wp_query -> is_archive ( $post_types );
2006-03-12 20:44:32 -05:00
}
2010-10-15 15:44:57 -04:00
/**
* Is the query for a post type archive page ?
*
* @ see WP_Query :: is_post_type_archive ()
* @ since 3.1 . 0
* @ uses $wp_query
*
* @ param mixed $post_types Optional . Post type or array of posts types to check against .
* @ return bool
*/
function is_post_type_archive ( $post_types = '' ) {
global $wp_query ;
return $wp_query -> is_post_type_archive ( $post_types );
}
2010-10-19 03:48:22 -04:00
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for an attachment page ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_attachment ()
2008-09-04 15:19:32 -04:00
* @ since 2.0 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ return bool
2008-09-04 15:19:32 -04:00
*/
2010-03-20 22:52:00 -04:00
function is_attachment () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_attachment ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for an author archive page ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* If the $author parameter is specified , this function will additionally
* check if the query is for one of the authors specified .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_author ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $author Optional . User ID , nickname , nicename , or array of User IDs , nicknames , and nicenames
* @ return bool
2008-09-04 15:19:32 -04:00
*/
2010-08-25 14:05:33 -04:00
function is_author ( $author = '' ) {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_author ( $author );
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a category archive page ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* If the $category parameter is specified , this function will additionally
* check if the query is for one of the categories specified .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_category ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $category Optional . Category ID , name , slug , or array of Category IDs , names , and slugs .
2008-09-04 15:19:32 -04:00
* @ return bool
*/
2010-08-25 14:05:33 -04:00
function is_category ( $category = '' ) {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_category ( $category );
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a tag archive page ?
*
* If the $tag parameter is specified , this function will additionally
* check if the query is for one of the tags specified .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_tag ()
2008-09-04 15:19:32 -04:00
* @ since 2.3 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $slug Optional . Tag slug or array of slugs .
2008-09-04 15:19:32 -04:00
* @ return bool
*/
2007-03-31 02:16:12 -04:00
function is_tag ( $slug = '' ) {
global $wp_query ;
2008-02-13 14:02:08 -05:00
2010-08-25 14:05:33 -04:00
return $wp_query -> is_tag ( $slug );
2007-03-31 02:16:12 -04:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a taxonomy archive page ?
*
* If the $taxonomy parameter is specified , this function will additionally
* check if the query is for that specific $taxonomy .
2010-02-28 00:59:39 -05:00
*
2010-08-25 14:05:33 -04:00
* If the $term parameter is specified in addition to the $taxonomy parameter ,
* this function will additionally check if the query is for one of the terms
* specified .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_tax ()
2008-09-04 15:19:32 -04:00
* @ since 2.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $taxonomy Optional . Taxonomy slug or slugs .
2010-09-07 07:21:11 -04:00
* @ param mixed $term Optional . Term ID , name , slug or array of Term IDs , names , and slugs .
2008-09-04 15:19:32 -04:00
* @ return bool
*/
2010-02-28 00:59:39 -05:00
function is_tax ( $taxonomy = '' , $term = '' ) {
global $wp_query , $wp_taxonomies ;
2008-08-09 01:36:14 -04:00
2010-08-25 14:05:33 -04:00
return $wp_query -> is_tax ( $taxonomy , $term );
2008-03-23 13:02:11 -04:00
}
2008-09-04 15:19:32 -04:00
/**
* Whether the current URL is within the comments popup window .
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_comments_popup ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_comments_popup () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_comments_popup ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a date archive ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_date ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_date () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_date ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a day archive ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_day ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_day () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_day ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a feed ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_feed ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_feed () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_feed ();
2006-03-12 20:44:32 -05:00
}
2009-12-22 09:04:14 -05:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a comments feed ?
2009-12-22 09:04:14 -05:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_comments_feed ()
2009-12-22 09:04:14 -05:00
* @ since 3.0 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_comment_feed () {
2009-12-22 09:04:14 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_comment_feed ();
2009-12-22 09:04:14 -05:00
}
2008-02-01 19:13:34 -05:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for the front page of the site ?
*
* This is for what is displayed at your site ' s main URL .
*
* Depends on the site 's "Front page displays" Reading Settings ' show_on_front ' and ' page_on_front ' .
2008-02-01 19:13:34 -05:00
*
2010-08-25 14:05:33 -04:00
* If you set a static page for the front page of your site , this function will return
* true when viewing that page .
*
* Otherwise the same as @ see is_home ()
*
* @ see WP_Query :: is_front_page ()
2008-09-04 15:19:32 -04:00
* @ since 2.5 . 0
* @ uses is_home ()
* @ uses get_option ()
2008-02-01 19:13:34 -05:00
*
2008-09-04 15:19:32 -04:00
* @ return bool True , if front of site .
2008-02-01 19:13:34 -05:00
*/
2010-03-20 22:52:00 -04:00
function is_front_page () {
2010-08-25 14:05:33 -04:00
global $wp_query ;
return $wp_query -> is_front_page ();
2008-02-05 01:47:27 -05:00
}
2008-02-01 19:13:34 -05:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for the blog homepage ?
*
* This is the page which shows the time based blog content of your site .
*
* Depends on the site 's "Front page displays" Reading Settings ' show_on_front ' and ' page_for_posts ' .
2010-01-15 17:11:12 -05:00
*
2010-08-25 14:05:33 -04:00
* If you set a static page for the front page of your site , this function will return
* true only on the page you set as the " Posts page " .
2008-02-01 19:13:34 -05:00
*
2010-08-25 14:05:33 -04:00
* @ see is_front_page ()
*
* @ see WP_Query :: is_home ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
2008-02-01 19:13:34 -05:00
*
2008-09-04 15:19:32 -04:00
* @ return bool True if blog view homepage .
2008-02-01 19:13:34 -05:00
*/
2010-03-20 22:52:00 -04:00
function is_home () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_home ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a month archive ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_month ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_month () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_month ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a single Page ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* If the $page parameter is specified , this function will additionally
* check if the query is for one of the Pages specified .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see is_single ()
* @ see is_singular ()
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_single ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $page Page ID , title , slug , or array of Page IDs , titles , and slugs .
2008-09-04 15:19:32 -04:00
* @ return bool
*/
2010-08-25 14:05:33 -04:00
function is_page ( $page = '' ) {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_page ( $page );
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for paged result and not for the first page ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_paged ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_paged () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_paged ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a post or page preview ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_preview ()
2008-09-04 15:19:32 -04:00
* @ since 2.0 . 0
* @ uses $wp_query
*
* @ return bool
*/
2006-03-12 20:44:32 -05:00
function is_preview () {
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_preview ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for the robots file ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_robots ()
2008-09-04 15:19:32 -04:00
* @ since 2.1 . 0
* @ uses $wp_query
*
* @ return bool
*/
2006-05-22 18:06:06 -04:00
function is_robots () {
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_robots ();
2006-05-22 18:06:06 -04:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a search ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_search ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_search () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_search ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a single post ?
*
* If the $post parameter is specified , this function will additionally
* check if the query is for one of the Posts specified .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* Can also be used for attachments or any other post type except pages .
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see is_page ()
* @ see is_singular ()
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_single ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $post Post ID , title , slug , or array of Post IDs , titles , and slugs .
2008-09-04 15:19:32 -04:00
* @ return bool
*/
2010-08-25 14:05:33 -04:00
function is_single ( $post = '' ) {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_single ( $post );
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a single post of any post type ( post , attachment , page , ... ) ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* If the $post_types parameter is specified , this function will additionally
* check if the query is for one of the Posts Types specified .
*
* @ see is_page ()
* @ see is_single ()
*
* @ see WP_Query :: is_singular ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ param mixed $post_types Optional . Post Type or array of Post Types
2008-09-04 15:19:32 -04:00
* @ return bool
*/
2010-08-25 14:05:33 -04:00
function is_singular ( $post_types = '' ) {
2006-08-29 23:33:39 -04:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_singular ( $post_types );
2006-08-29 23:33:39 -04:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a specific time ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_time ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_time () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_time ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a trackback endpoint call ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_trackback ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_trackback () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_trackback ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query for a specific year ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_year ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2010-03-20 22:52:00 -04:00
function is_year () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_year ();
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
2010-08-25 14:05:33 -04:00
* Is the query a 404 ( returns no results ) ?
2008-09-04 15:19:32 -04:00
*
2010-08-25 14:05:33 -04:00
* @ see WP_Query :: is_404 ()
2008-09-04 15:19:32 -04:00
* @ since 1.5 . 0
* @ uses $wp_query
*
2010-08-25 14:05:33 -04:00
* @ return bool
2008-09-04 15:19:32 -04:00
*/
2010-03-20 22:52:00 -04:00
function is_404 () {
2006-03-12 20:44:32 -05:00
global $wp_query ;
2010-08-25 14:05:33 -04:00
return $wp_query -> is_404 ();
2006-03-12 20:44:32 -05:00
}
/*
* The Loop . Post loop control .
*/
2006-11-19 02:56:05 -05:00
2008-09-04 15:19:32 -04:00
/**
* Whether current WordPress query has results to loop over .
*
* @ see WP_Query :: have_posts ()
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return bool
*/
2006-03-12 20:44:32 -05:00
function have_posts () {
global $wp_query ;
return $wp_query -> have_posts ();
}
2008-09-04 15:19:32 -04:00
/**
* Whether the caller is in the Loop .
*
* @ since 2.0 . 0
* @ uses $wp_query
*
* @ return bool True if caller is within loop , false if loop hasn ' t started or ended .
*/
2006-03-12 20:44:32 -05:00
function in_the_loop () {
global $wp_query ;
return $wp_query -> in_the_loop ;
}
2008-09-04 15:19:32 -04:00
/**
* Rewind the loop posts .
*
* @ see WP_Query :: rewind_posts ()
* @ since 1.5 . 0
* @ uses $wp_query
*
* @ return null
*/
2006-03-12 20:44:32 -05:00
function rewind_posts () {
global $wp_query ;
return $wp_query -> rewind_posts ();
}
2008-09-04 15:19:32 -04:00
/**
* Iterate the post index in the loop .
*
* @ see WP_Query :: the_post ()
* @ since 1.5 . 0
* @ uses $wp_query
*/
2006-03-12 20:44:32 -05:00
function the_post () {
global $wp_query ;
$wp_query -> the_post ();
}
2007-02-24 02:33:29 -05:00
/*
2007-09-03 19:32:58 -04:00
* Comments loop .
*/
2007-02-24 02:33:29 -05:00
2008-09-04 15:19:32 -04:00
/**
* Whether there are comments to loop over .
*
* @ see WP_Query :: have_comments ()
* @ since 2.2 . 0
* @ uses $wp_query
*
* @ return bool
*/
2007-09-03 19:32:58 -04:00
function have_comments () {
global $wp_query ;
return $wp_query -> have_comments ();
}
2007-02-24 02:33:29 -05:00
2008-09-04 15:19:32 -04:00
/**
* Iterate comment index in the comment loop .
*
* @ see WP_Query :: the_comment ()
* @ since 2.2 . 0
* @ uses $wp_query
*
* @ return object
*/
2007-09-03 19:32:58 -04:00
function the_comment () {
global $wp_query ;
return $wp_query -> the_comment ();
}
2007-02-24 02:33:29 -05:00
2006-03-12 20:44:32 -05:00
/*
* WP_Query
*/
2008-09-04 15:19:32 -04:00
/**
* The WordPress Query class .
*
* @ link http :// codex . wordpress . org / Function_Reference / WP_Query Codex page .
*
* @ since 1.5 . 0
*/
2010-10-04 14:57:13 -04:00
class WP_Query extends WP_Object_Query {
2008-09-04 15:19:32 -04:00
/**
2010-08-28 07:09:18 -04:00
* Query vars set by the user
2008-09-04 15:19:32 -04:00
*
* @ since 1.5 . 0
* @ access public
2010-08-28 07:09:18 -04:00
* @ var array
2008-09-04 15:19:32 -04:00
*/
2006-03-12 20:44:32 -05:00
var $query ;
2008-09-04 15:19:32 -04:00
/**
2010-08-28 07:09:18 -04:00
* Query vars , after parsing
2008-09-04 15:19:32 -04:00
*
* @ since 1.5 . 0
* @ access public
* @ var array
*/
2006-10-22 21:34:00 -04:00
var $query_vars = array ();
2008-09-04 15:19:32 -04:00
/**
* Holds the data for a single object that is queried .
*
* Holds the contents of a post , page , category , attachment .
*
* @ since 1.5 . 0
* @ access public
* @ var object | array
*/
2006-03-12 20:44:32 -05:00
var $queried_object ;
2008-09-04 15:19:32 -04:00
/**
* The ID of the queried object .
*
* @ since 1.5 . 0
* @ access public
* @ var int
*/
2006-03-12 20:44:32 -05:00
var $queried_object_id ;
2008-09-04 15:19:32 -04:00
/**
* Get post database query .
*
* @ since 2.0 . 1
* @ access public
* @ var string
*/
2006-03-12 20:44:32 -05:00
var $request ;
2008-09-04 15:19:32 -04:00
/**
* List of posts .
*
* @ since 1.5 . 0
* @ access public
* @ var array
*/
2006-03-12 20:44:32 -05:00
var $posts ;
2008-09-04 15:19:32 -04:00
/**
* The amount of posts for the current query .
*
* @ since 1.5 . 0
* @ access public
* @ var int
*/
2006-03-12 20:44:32 -05:00
var $post_count = 0 ;
2008-09-04 15:19:32 -04:00
/**
* Index of the current item in the loop .
*
* @ since 1.5 . 0
* @ access public
* @ var int
*/
2006-03-12 20:44:32 -05:00
var $current_post = - 1 ;
2008-09-04 15:19:32 -04:00
/**
* Whether the loop has started and the caller is in the loop .
*
* @ since 2.0 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $in_the_loop = false ;
2008-09-04 15:19:32 -04:00
/**
* The current post ID .
*
* @ since 1.5 . 0
* @ access public
* @ var int
*/
2006-03-12 20:44:32 -05:00
var $post ;
2007-02-27 10:24:54 -05:00
2008-09-04 15:19:32 -04:00
/**
* The list of comments for current post .
*
* @ since 2.2 . 0
* @ access public
* @ var array
*/
2007-02-24 02:33:29 -05:00
var $comments ;
2008-09-04 15:19:32 -04:00
/**
* The amount of comments for the posts .
*
* @ since 2.2 . 0
* @ access public
* @ var int
*/
2007-02-24 02:33:29 -05:00
var $comment_count = 0 ;
2008-09-04 15:19:32 -04:00
/**
* The index of the comment in the comment loop .
*
* @ since 2.2 . 0
* @ access public
* @ var int
*/
2007-02-24 02:33:29 -05:00
var $current_comment = - 1 ;
2008-09-04 15:19:32 -04:00
/**
* Current comment ID .
*
* @ since 2.2 . 0
* @ access public
* @ var int
*/
2007-02-24 02:33:29 -05:00
var $comment ;
2006-03-12 20:44:32 -05:00
2008-09-04 15:19:32 -04:00
/**
* Amount of posts if limit clause was not used .
*
* @ since 2.1 . 0
* @ access public
* @ var int
*/
2006-11-08 16:22:35 -05:00
var $found_posts = 0 ;
2008-09-04 15:19:32 -04:00
/**
* The amount of pages .
*
* @ since 2.1 . 0
* @ access public
* @ var int
*/
2006-11-08 16:22:35 -05:00
var $max_num_pages = 0 ;
2008-09-23 17:11:27 -04:00
/**
* The amount of comment pages .
*
* @ since 2.7 . 0
* @ access public
* @ var int
*/
var $max_num_comment_pages = 0 ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is single post .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_single = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is preview of blog .
*
* @ since 2.0 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_preview = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query returns a page .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_page = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is an archive list .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_archive = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is part of a date .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_date = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains a year .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_year = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains a month .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_month = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains a day .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_day = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains time .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_time = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains an author .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_author = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains category .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_category = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains tag .
*
* @ since 2.3 . 0
* @ access public
* @ var bool
*/
2007-03-31 02:16:12 -04:00
var $is_tag = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains taxonomy .
*
* @ since 2.5 . 0
* @ access public
* @ var bool
*/
2008-03-23 13:02:11 -04:00
var $is_tax = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query was part of a search result .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_search = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is feed display .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_feed = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is comment feed display .
*
* @ since 2.2 . 0
* @ access public
* @ var bool
*/
2007-02-24 02:33:29 -05:00
var $is_comment_feed = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is trackback .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_trackback = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is blog homepage .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_home = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query couldn ' t found anything .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_404 = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is within comments popup window .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_comments_popup = false ;
2008-09-04 15:19:32 -04:00
2010-09-27 19:48:03 -04:00
/**
* Set if query is paged
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
var $is_paged = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is part of administration page .
*
* @ since 1.5 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_admin = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is an attachment .
*
* @ since 2.0 . 0
* @ access public
* @ var bool
*/
2006-03-12 20:44:32 -05:00
var $is_attachment = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if is single , is a page , or is an attachment .
*
* @ since 2.1 . 0
* @ access public
* @ var bool
*/
2006-08-29 23:33:39 -04:00
var $is_singular = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query is for robots .
*
* @ since 2.1 . 0
* @ access public
* @ var bool
*/
2006-05-22 18:06:06 -04:00
var $is_robots = false ;
2008-09-04 15:19:32 -04:00
/**
* Set if query contains posts .
*
* Basically , the homepage if the option isn ' t set for the static homepage .
*
* @ since 2.1 . 0
* @ access public
* @ var bool
*/
2006-07-19 22:05:25 -04:00
var $is_posts_page = false ;
2006-03-12 20:44:32 -05:00
2010-10-15 15:44:57 -04:00
/**
* Set if query is for a post type archive .
*
* @ since 3.1 . 0
* @ access public
* @ var bool
*/
var $is_post_type_archive = false ;
2008-09-04 15:19:32 -04:00
/**
* Resets query flags to false .
*
* The query flags are what page info WordPress was able to figure out .
*
* @ since 2.0 . 0
* @ access private
*/
2006-03-12 20:44:32 -05:00
function init_query_flags () {
$this -> is_single = false ;
2010-09-27 19:48:03 -04:00
$this -> is_preview = false ;
2006-03-12 20:44:32 -05:00
$this -> is_page = false ;
$this -> is_archive = false ;
$this -> is_date = false ;
$this -> is_year = false ;
$this -> is_month = false ;
$this -> is_day = false ;
$this -> is_time = false ;
$this -> is_author = false ;
$this -> is_category = false ;
2007-03-31 02:16:12 -04:00
$this -> is_tag = false ;
2008-03-23 13:02:11 -04:00
$this -> is_tax = false ;
2006-03-12 20:44:32 -05:00
$this -> is_search = false ;
$this -> is_feed = false ;
2007-02-24 02:33:29 -05:00
$this -> is_comment_feed = false ;
2006-03-12 20:44:32 -05:00
$this -> is_trackback = false ;
$this -> is_home = false ;
$this -> is_404 = false ;
2010-09-27 19:48:03 -04:00
$this -> is_comments_popup = false ;
2006-03-12 20:44:32 -05:00
$this -> is_paged = false ;
$this -> is_admin = false ;
$this -> is_attachment = false ;
2006-08-29 23:33:39 -04:00
$this -> is_singular = false ;
2006-05-22 18:06:06 -04:00
$this -> is_robots = false ;
2006-07-19 22:05:25 -04:00
$this -> is_posts_page = false ;
2010-10-15 15:44:57 -04:00
$this -> is_post_type_archive = false ;
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
* Initiates object properties and sets default values .
*
* @ since 1.5 . 0
* @ access public
*/
2010-03-20 22:52:00 -04:00
function init () {
2006-03-12 20:44:32 -05:00
unset ( $this -> posts );
unset ( $this -> query );
2006-10-22 21:34:00 -04:00
$this -> query_vars = array ();
2006-03-12 20:44:32 -05:00
unset ( $this -> queried_object );
unset ( $this -> queried_object_id );
$this -> post_count = 0 ;
$this -> current_post = - 1 ;
$this -> in_the_loop = false ;
2010-09-27 19:48:03 -04:00
unset ( $this -> request );
unset ( $this -> post );
unset ( $this -> comments );
unset ( $this -> comment );
$this -> comment_count = 0 ;
$this -> current_comment = - 1 ;
$this -> found_posts = 0 ;
$this -> max_num_pages = 0 ;
$this -> max_num_comment_pages = 0 ;
2006-03-12 20:44:32 -05:00
$this -> init_query_flags ();
}
2008-09-04 15:19:32 -04:00
/**
* Reparse the query vars .
*
* @ since 1.5 . 0
* @ access public
*/
2006-03-12 20:44:32 -05:00
function parse_query_vars () {
$this -> parse_query ( '' );
}
2007-02-27 10:24:54 -05:00
2008-09-04 15:19:32 -04:00
/**
* Fills in the query variables , which do not exist within the parameter .
*
* @ since 2.1 . 0
* @ access public
*
* @ param array $array Defined query variables .
* @ return array Complete query variables with undefined ones filled in empty .
*/
2006-09-21 17:05:38 -04:00
function fill_query_vars ( $array ) {
$keys = array (
'error'
, 'm'
, 'p'
2008-05-03 16:08:32 -04:00
, 'post_parent'
2006-09-21 17:05:38 -04:00
, 'subpost'
, 'subpost_id'
, 'attachment'
, 'attachment_id'
, 'name'
, 'static'
, 'pagename'
, 'page_id'
, 'second'
, 'minute'
, 'hour'
, 'day'
, 'monthnum'
, 'year'
, 'w'
, 'category_name'
2007-03-31 02:16:12 -04:00
, 'tag'
2008-08-08 13:05:10 -04:00
, 'cat'
2007-09-02 23:24:23 -04:00
, 'tag_id'
2006-09-21 17:05:38 -04:00
, 'author_name'
, 'feed'
, 'tb'
, 'paged'
, 'comments_popup'
2010-10-05 18:42:47 -04:00
, 'meta_key'
, 'meta_value'
2006-09-21 17:05:38 -04:00
, 'preview'
2010-02-28 02:47:11 -05:00
, 's'
, 'sentence'
2006-09-21 17:05:38 -04:00
);
2010-05-03 16:19:13 -04:00
foreach ( $keys as $key ) {
2006-09-21 17:05:38 -04:00
if ( ! isset ( $array [ $key ]))
$array [ $key ] = '' ;
}
2007-02-27 10:24:54 -05:00
2008-05-03 16:08:32 -04:00
$array_keys = array ( 'category__in' , 'category__not_in' , 'category__and' , 'post__in' , 'post__not_in' ,
2007-09-03 14:14:05 -04:00
'tag__in' , 'tag__not_in' , 'tag__and' , 'tag_slug__in' , 'tag_slug__and' );
2007-09-03 19:19:20 -04:00
2007-08-15 18:08:51 -04:00
foreach ( $array_keys as $key ) {
if ( ! isset ( $array [ $key ]))
$array [ $key ] = array ();
}
2006-09-21 17:05:38 -04:00
return $array ;
}
2006-03-12 20:44:32 -05:00
2008-09-04 15:19:32 -04:00
/**
* Parse a query string and set query type booleans .
*
* @ since 1.5 . 0
* @ access public
*
* @ param string | array $query
*/
2010-05-25 11:36:23 -04:00
function parse_query ( $query ) {
2006-03-12 20:44:32 -05:00
if ( ! empty ( $query ) || ! isset ( $this -> query ) ) {
$this -> init ();
2010-08-15 21:36:21 -04:00
$this -> query = $this -> query_vars = wp_parse_args ( $query );
2006-03-12 20:44:32 -05:00
}
2007-02-27 10:24:54 -05:00
2007-03-08 23:05:28 -05:00
$this -> query_vars = $this -> fill_query_vars ( $this -> query_vars );
$qv = & $this -> query_vars ;
2007-02-27 10:24:54 -05:00
2007-09-04 23:11:04 -04:00
if ( ! empty ( $qv [ 'robots' ]) )
2006-05-22 18:06:06 -04:00
$this -> is_robots = true ;
2006-03-12 20:44:32 -05:00
2008-05-08 01:17:27 -04:00
$qv [ 'p' ] = absint ( $qv [ 'p' ]);
$qv [ 'page_id' ] = absint ( $qv [ 'page_id' ]);
$qv [ 'year' ] = absint ( $qv [ 'year' ]);
$qv [ 'monthnum' ] = absint ( $qv [ 'monthnum' ]);
$qv [ 'day' ] = absint ( $qv [ 'day' ]);
$qv [ 'w' ] = absint ( $qv [ 'w' ]);
$qv [ 'm' ] = absint ( $qv [ 'm' ]);
2009-06-19 13:30:39 -04:00
$qv [ 'paged' ] = absint ( $qv [ 'paged' ]);
2008-04-02 09:15:21 -04:00
$qv [ 'cat' ] = preg_replace ( '|[^0-9,-]|' , '' , $qv [ 'cat' ] ); // comma separated list of positive or negative integers
2008-08-18 23:21:12 -04:00
$qv [ 'pagename' ] = trim ( $qv [ 'pagename' ] );
$qv [ 'name' ] = trim ( $qv [ 'name' ] );
2008-05-08 01:17:27 -04:00
if ( '' !== $qv [ 'hour' ] ) $qv [ 'hour' ] = absint ( $qv [ 'hour' ]);
if ( '' !== $qv [ 'minute' ] ) $qv [ 'minute' ] = absint ( $qv [ 'minute' ]);
if ( '' !== $qv [ 'second' ] ) $qv [ 'second' ] = absint ( $qv [ 'second' ]);
2006-03-12 20:44:32 -05:00
// Compat. Map subpost to attachment.
if ( '' != $qv [ 'subpost' ] )
$qv [ 'attachment' ] = $qv [ 'subpost' ];
if ( '' != $qv [ 'subpost_id' ] )
$qv [ 'attachment_id' ] = $qv [ 'subpost_id' ];
2008-05-08 01:17:27 -04:00
$qv [ 'attachment_id' ] = absint ( $qv [ 'attachment_id' ]);
2007-06-13 22:25:30 -04:00
2007-03-08 23:05:28 -05:00
if ( ( '' != $qv [ 'attachment' ]) || ! empty ( $qv [ 'attachment_id' ]) ) {
2006-03-12 20:44:32 -05:00
$this -> is_single = true ;
$this -> is_attachment = true ;
2007-03-08 23:05:28 -05:00
} elseif ( '' != $qv [ 'name' ] ) {
2006-03-12 20:44:32 -05:00
$this -> is_single = true ;
} elseif ( $qv [ 'p' ] ) {
$this -> is_single = true ;
2007-08-04 12:30:27 -04:00
} elseif ( ( '' !== $qv [ 'hour' ]) && ( '' !== $qv [ 'minute' ]) && ( '' !== $qv [ 'second' ]) && ( '' != $qv [ 'year' ]) && ( '' != $qv [ 'monthnum' ]) && ( '' != $qv [ 'day' ]) ) {
2006-11-19 02:56:05 -05:00
// If year, month, day, hour, minute, and second are set, a single
// post is being queried.
2006-03-12 20:44:32 -05:00
$this -> is_single = true ;
2007-03-08 23:05:28 -05:00
} elseif ( '' != $qv [ 'static' ] || '' != $qv [ 'pagename' ] || ! empty ( $qv [ 'page_id' ]) ) {
2006-03-12 20:44:32 -05:00
$this -> is_page = true ;
$this -> is_single = false ;
} else {
2010-10-15 15:44:57 -04:00
// Look for archive queries. Dates, categories, authors, search, post type archives.
2010-10-02 18:52:15 -04:00
if ( ! empty ( $qv [ 's' ]) ) {
$this -> is_search = true ;
}
2006-03-12 20:44:32 -05:00
2007-08-04 12:30:27 -04:00
if ( '' !== $qv [ 'second' ] ) {
2006-03-12 20:44:32 -05:00
$this -> is_time = true ;
$this -> is_date = true ;
}
2007-08-04 12:30:27 -04:00
if ( '' !== $qv [ 'minute' ] ) {
2006-03-12 20:44:32 -05:00
$this -> is_time = true ;
$this -> is_date = true ;
}
2007-08-04 12:30:27 -04:00
if ( '' !== $qv [ 'hour' ] ) {
2006-03-12 20:44:32 -05:00
$this -> is_time = true ;
$this -> is_date = true ;
}
2007-03-08 23:05:28 -05:00
if ( $qv [ 'day' ] ) {
2010-05-03 16:19:13 -04:00
if ( ! $this -> is_date ) {
2006-03-12 20:44:32 -05:00
$this -> is_day = true ;
$this -> is_date = true ;
}
}
2007-03-08 23:05:28 -05:00
if ( $qv [ 'monthnum' ] ) {
2010-05-03 16:19:13 -04:00
if ( ! $this -> is_date ) {
2006-03-12 20:44:32 -05:00
$this -> is_month = true ;
$this -> is_date = true ;
}
}
2007-03-08 23:05:28 -05:00
if ( $qv [ 'year' ] ) {
2010-05-03 16:19:13 -04:00
if ( ! $this -> is_date ) {
2006-03-12 20:44:32 -05:00
$this -> is_year = true ;
$this -> is_date = true ;
}
}
2007-03-08 23:05:28 -05:00
if ( $qv [ 'm' ] ) {
2006-03-12 20:44:32 -05:00
$this -> is_date = true ;
2010-05-03 16:19:13 -04:00
if ( strlen ( $qv [ 'm' ]) > 9 ) {
2006-03-12 20:44:32 -05:00
$this -> is_time = true ;
2010-05-03 16:19:13 -04:00
} else if ( strlen ( $qv [ 'm' ]) > 7 ) {
2006-03-12 20:44:32 -05:00
$this -> is_day = true ;
2010-05-03 16:19:13 -04:00
} else if ( strlen ( $qv [ 'm' ]) > 5 ) {
2006-03-12 20:44:32 -05:00
$this -> is_month = true ;
} else {
$this -> is_year = true ;
}
}
2010-05-03 16:19:13 -04:00
if ( '' != $qv [ 'w' ] ) {
2006-03-12 20:44:32 -05:00
$this -> is_date = true ;
}
2010-10-06 06:40:30 -04:00
$this -> parse_tax_query ( $qv );
2010-10-04 14:57:13 -04:00
$this -> parse_meta_query ( $qv );
2010-09-17 12:08:35 -04:00
2007-03-08 23:05:28 -05:00
if ( empty ( $qv [ 'author' ]) || ( $qv [ 'author' ] == '0' ) ) {
2006-03-12 20:44:32 -05:00
$this -> is_author = false ;
} else {
$this -> is_author = true ;
}
2010-10-14 06:39:47 -04:00
if ( '' != $qv [ 'author_name' ] )
2006-03-12 20:44:32 -05:00
$this -> is_author = true ;
2010-10-15 15:44:57 -04:00
if ( ! empty ( $qv [ 'post_type' ] ) && ! is_array ( $qv [ 'post_type' ] ) ) {
$post_type_obj = get_post_type_object ( $qv [ 'post_type' ] );
if ( is_array ( $post_type_obj -> rewrite ) && $post_type_obj -> rewrite [ 'archive' ] )
$this -> is_post_type_archive = true ;
}
2010-10-14 06:39:47 -04:00
2010-10-15 15:44:57 -04:00
if ( $this -> is_post_type_archive || $this -> is_date || $this -> is_author || $this -> is_category || $this -> is_tag || $this -> is_tax )
2006-03-12 20:44:32 -05:00
$this -> is_archive = true ;
}
2007-03-08 23:05:28 -05:00
if ( '' != $qv [ 'feed' ] )
2006-03-12 20:44:32 -05:00
$this -> is_feed = true ;
2007-03-08 23:05:28 -05:00
if ( '' != $qv [ 'tb' ] )
2006-03-12 20:44:32 -05:00
$this -> is_trackback = true ;
2009-12-11 11:38:59 -05:00
if ( '' != $qv [ 'paged' ] && ( intval ( $qv [ 'paged' ]) > 1 ) )
2006-03-12 20:44:32 -05:00
$this -> is_paged = true ;
2007-03-08 23:05:28 -05:00
if ( '' != $qv [ 'comments_popup' ] )
2006-03-12 20:44:32 -05:00
$this -> is_comments_popup = true ;
2007-03-08 23:05:28 -05:00
// if we're previewing inside the write screen
2010-05-03 16:19:13 -04:00
if ( '' != $qv [ 'preview' ] )
2006-03-12 20:44:32 -05:00
$this -> is_preview = true ;
2007-12-27 20:04:17 -05:00
if ( is_admin () )
2006-03-12 20:44:32 -05:00
$this -> is_admin = true ;
2007-02-24 02:33:29 -05:00
if ( false !== strpos ( $qv [ 'feed' ], 'comments-' ) ) {
2007-03-08 23:05:28 -05:00
$qv [ 'feed' ] = str_replace ( 'comments-' , '' , $qv [ 'feed' ]);
2007-02-24 02:33:29 -05:00
$qv [ 'withcomments' ] = 1 ;
}
2007-02-28 00:22:29 -05:00
$this -> is_singular = $this -> is_single || $this -> is_page || $this -> is_attachment ;
if ( $this -> is_feed && ( ! empty ( $qv [ 'withcomments' ]) || ( empty ( $qv [ 'withoutcomments' ]) && $this -> is_singular ) ) )
2007-02-24 02:33:29 -05:00
$this -> is_comment_feed = true ;
2009-04-13 12:15:44 -04:00
if ( ! ( $this -> is_singular || $this -> is_archive || $this -> is_search || $this -> is_feed || $this -> is_trackback || $this -> is_404 || $this -> is_admin || $this -> is_comments_popup || $this -> is_robots ) )
2006-03-12 20:44:32 -05:00
$this -> is_home = true ;
2007-02-28 00:22:29 -05:00
// Correct is_* for page_on_front and page_for_posts
2010-05-04 14:08:03 -04:00
if ( $this -> is_home && 'page' == get_option ( 'show_on_front' ) && get_option ( 'page_on_front' ) ) {
$_query = wp_parse_args ( $query );
if ( empty ( $_query ) || ! array_diff ( array_keys ( $_query ), array ( 'preview' , 'page' , 'paged' , 'cpage' ) ) ) {
$this -> is_page = true ;
$this -> is_home = false ;
$qv [ 'page_id' ] = get_option ( 'page_on_front' );
// Correct <!--nextpage--> for page_on_front
if ( ! empty ( $qv [ 'paged' ]) ) {
$qv [ 'page' ] = $qv [ 'paged' ];
unset ( $qv [ 'paged' ]);
}
2010-02-28 04:40:42 -05:00
}
2007-02-28 00:22:29 -05:00
}
if ( '' != $qv [ 'pagename' ] ) {
$this -> queried_object =& get_page_by_path ( $qv [ 'pagename' ]);
if ( ! empty ( $this -> queried_object ) )
2007-03-22 20:59:21 -04:00
$this -> queried_object_id = ( int ) $this -> queried_object -> ID ;
2007-02-28 00:22:29 -05:00
else
unset ( $this -> queried_object );
if ( 'page' == get_option ( 'show_on_front' ) && isset ( $this -> queried_object_id ) && $this -> queried_object_id == get_option ( 'page_for_posts' ) ) {
$this -> is_page = false ;
$this -> is_home = true ;
$this -> is_posts_page = true ;
}
}
2007-03-08 23:05:28 -05:00
if ( $qv [ 'page_id' ] ) {
2007-02-28 00:22:29 -05:00
if ( 'page' == get_option ( 'show_on_front' ) && $qv [ 'page_id' ] == get_option ( 'page_for_posts' ) ) {
$this -> is_page = false ;
$this -> is_home = true ;
$this -> is_posts_page = true ;
}
}
2010-05-03 16:19:13 -04:00
if ( ! empty ( $qv [ 'post_type' ]) ) {
if ( is_array ( $qv [ 'post_type' ]) )
2010-09-20 11:28:58 -04:00
$qv [ 'post_type' ] = array_map ( 'sanitize_key' , $qv [ 'post_type' ]);
2009-11-05 11:08:53 -05:00
else
2010-09-20 11:28:58 -04:00
$qv [ 'post_type' ] = sanitize_key ( $qv [ 'post_type' ]);
2009-11-05 11:08:53 -05:00
}
2007-08-23 12:09:37 -04:00
if ( ! empty ( $qv [ 'post_status' ]) )
2008-07-30 04:16:56 -04:00
$qv [ 'post_status' ] = preg_replace ( '|[^a-z0-9_,-]|' , '' , $qv [ 'post_status' ]);
2007-08-23 12:09:37 -04:00
2008-08-29 14:33:04 -04:00
if ( $this -> is_posts_page && ( ! isset ( $qv [ 'withcomments' ]) || ! $qv [ 'withcomments' ] ) )
2007-02-28 00:22:29 -05:00
$this -> is_comment_feed = false ;
$this -> is_singular = $this -> is_single || $this -> is_page || $this -> is_attachment ;
// Done correcting is_* for page_on_front and page_for_posts
2010-05-03 16:19:13 -04:00
if ( '404' == $qv [ 'error' ] )
2007-09-04 23:11:04 -04:00
$this -> set_404 ();
2007-03-08 23:05:28 -05:00
if ( ! empty ( $query ) )
2006-09-12 13:45:23 -04:00
do_action_ref_array ( 'parse_query' , array ( & $this ));
2006-03-12 20:44:32 -05:00
}
2010-10-09 06:19:15 -04:00
/*
* Populates the 'tax_query' property
*
* @ access protected
* @ since 3.1 . 0
*
* @ param array & $q The query variables
*/
function parse_tax_query ( & $q ) {
2010-10-07 17:47:52 -04:00
if ( ! empty ( $q [ 'tax_query' ] ) && is_array ( $q [ 'tax_query' ] ) ) {
$tax_query = $q [ 'tax_query' ];
} else {
$tax_query = array ();
}
2010-10-06 06:40:30 -04:00
2010-10-06 07:04:03 -04:00
foreach ( $GLOBALS [ 'wp_taxonomies' ] as $taxonomy => $t ) {
if ( $t -> query_var && ! empty ( $q [ $t -> query_var ] ) ) {
$tax_query_defaults = array (
'taxonomy' => $taxonomy ,
'field' => 'slug' ,
'operator' => 'IN'
);
2010-10-17 01:41:22 -04:00
if ( $t -> rewrite [ 'hierarchical' ] ) {
$q [ $t -> query_var ] = basename ( $q [ $t -> query_var ]);
if ( $taxonomy == $q [ 'taxonomy' ] )
$q [ 'term' ] = basename ( $q [ 'term' ]);
}
2010-10-11 08:18:42 -04:00
$term = $q [ $t -> query_var ];
2010-10-06 07:04:03 -04:00
2010-10-17 01:41:22 -04:00
if ( strpos ( $term , '+' ) !== false ) {
2010-10-06 07:04:03 -04:00
$terms = preg_split ( '/[+\s]+/' , $term );
foreach ( $terms as $term ) {
2010-10-06 06:40:30 -04:00
$tax_query [] = array_merge ( $tax_query_defaults , array (
2010-10-06 07:04:03 -04:00
'terms' => array ( $term )
2010-10-06 06:40:30 -04:00
) );
}
2010-10-06 07:04:03 -04:00
} else {
$tax_query [] = array_merge ( $tax_query_defaults , array (
'terms' => preg_split ( '/[,\s]+/' , $term )
) );
2010-10-06 06:40:30 -04:00
}
}
}
// Category stuff
if ( ! empty ( $q [ 'cat' ]) && '0' != $q [ 'cat' ] && ! $this -> is_singular ) {
$q [ 'cat' ] = '' . urldecode ( $q [ 'cat' ]) . '' ;
$q [ 'cat' ] = addslashes_gpc ( $q [ 'cat' ]);
$cat_array = preg_split ( '/[,\s]+/' , $q [ 'cat' ]);
$q [ 'cat' ] = '' ;
$req_cats = array ();
foreach ( ( array ) $cat_array as $cat ) {
$cat = intval ( $cat );
$req_cats [] = $cat ;
$in = ( $cat > 0 );
$cat = abs ( $cat );
if ( $in ) {
$q [ 'category__in' ][] = $cat ;
} else {
$q [ 'category__not_in' ][] = $cat ;
}
}
$q [ 'cat' ] = implode ( ',' , $req_cats );
}
if ( ! empty ( $q [ 'category__in' ]) ) {
$tax_query [] = array (
'taxonomy' => 'category' ,
'terms' => $q [ 'category__in' ],
'operator' => 'IN' ,
'field' => 'term_id'
);
}
if ( ! empty ( $q [ 'category__not_in' ]) ) {
$tax_query [] = array (
'taxonomy' => 'category' ,
'terms' => $q [ 'category__not_in' ],
'operator' => 'NOT IN' ,
'field' => 'term_id'
);
}
// Tag stuff
if ( ! empty ( $qv [ 'tag_id' ]) ) {
$tax_query [] = array (
'taxonomy' => 'post_tag' ,
'terms' => $qv [ 'tag_id' ],
'operator' => 'IN' ,
'field' => 'term_id'
);
}
if ( ! empty ( $q [ 'tag__in' ]) ) {
$tax_query [] = array (
'taxonomy' => 'post_tag' ,
'terms' => $q [ 'tag__in' ],
'operator' => 'IN' ,
'field' => 'term_id'
);
}
if ( ! empty ( $q [ 'tag__not_in' ]) ) {
$tax_query [] = array (
'taxonomy' => 'post_tag' ,
'terms' => $q [ 'tag__not_in' ],
'operator' => 'NOT IN' ,
'field' => 'term_id'
);
}
2010-10-09 06:19:15 -04:00
$q [ 'tax_query' ] = $tax_query ;
2010-10-06 07:13:37 -04:00
2010-10-09 06:19:15 -04:00
foreach ( $q [ 'tax_query' ] as $query ) {
2010-10-06 07:13:37 -04:00
if ( 'IN' == $query [ 'operator' ] ) {
switch ( $query [ 'taxonomy' ] ) {
case 'category' :
$this -> is_category = true ;
break ;
case 'post_tag' :
$this -> is_tag = true ;
break ;
default :
$this -> is_tax = true ;
}
}
}
2010-10-06 06:40:30 -04:00
}
2008-09-04 15:19:32 -04:00
/**
* Sets the 404 property and saves whether query is feed .
*
* @ since 2.0 . 0
* @ access public
*/
2006-03-12 20:44:32 -05:00
function set_404 () {
2006-08-15 01:03:14 -04:00
$is_feed = $this -> is_feed ;
2006-03-12 20:44:32 -05:00
$this -> init_query_flags ();
$this -> is_404 = true ;
2006-08-15 01:03:14 -04:00
2010-05-11 14:28:12 -04:00
$this -> is_feed = $is_feed ;
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
* Retrieve query variable .
*
* @ since 1.5 . 0
* @ access public
*
* @ param string $query_var Query variable key .
* @ return mixed
*/
2006-03-12 20:44:32 -05:00
function get ( $query_var ) {
2010-05-03 16:19:13 -04:00
if ( isset ( $this -> query_vars [ $query_var ]) )
2006-03-12 20:44:32 -05:00
return $this -> query_vars [ $query_var ];
return '' ;
}
2008-09-04 15:19:32 -04:00
/**
* Set query variable .
*
* @ since 1.5 . 0
* @ access public
*
* @ param string $query_var Query variable key .
* @ param mixed $value Query variable value .
*/
2006-03-12 20:44:32 -05:00
function set ( $query_var , $value ) {
$this -> query_vars [ $query_var ] = $value ;
}
2008-09-04 15:19:32 -04:00
/**
* Retrieve the posts based on query variables .
*
* There are a few filters and actions that can be used to modify the post
* database query .
*
* @ since 1.5 . 0
* @ access public
* @ uses do_action_ref_array () Calls 'pre_get_posts' hook before retrieving posts .
*
* @ return array List of posts .
*/
2006-03-12 20:44:32 -05:00
function & get_posts () {
2010-05-15 11:00:53 -04:00
global $wpdb , $user_ID , $_wp_using_ext_object_cache ;
2006-03-12 20:44:32 -05:00
2006-09-12 13:45:23 -04:00
do_action_ref_array ( 'pre_get_posts' , array ( & $this ));
2006-03-12 20:44:32 -05:00
// Shorthand.
$q = & $this -> query_vars ;
2007-02-27 10:24:54 -05:00
2006-09-21 17:05:38 -04:00
$q = $this -> fill_query_vars ( $q );
2006-03-12 20:44:32 -05:00
// First let's clear some variables
2006-05-07 22:16:24 -04:00
$distinct = '' ;
2006-03-12 20:44:32 -05:00
$whichauthor = '' ;
2008-02-19 01:13:20 -05:00
$whichmimetype = '' ;
2006-03-12 20:44:32 -05:00
$where = '' ;
$limits = '' ;
$join = '' ;
2006-09-21 17:05:38 -04:00
$search = '' ;
2006-11-07 18:43:59 -05:00
$groupby = '' ;
2008-08-29 14:33:04 -04:00
$fields = " $wpdb->posts .* " ;
2009-05-20 20:10:04 -04:00
$post_status_join = false ;
2008-08-29 14:33:04 -04:00
$page = 1 ;
2006-03-12 20:44:32 -05:00
2010-09-07 00:46:08 -04:00
if ( isset ( $q [ 'caller_get_posts' ] ) ) {
_deprecated_argument ( 'WP_Query' , '3.1' , __ ( '"caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.' ) );
if ( ! isset ( $q [ 'ignore_sticky_posts' ] ) )
$q [ 'ignore_sticky_posts' ] = $q [ 'caller_get_posts' ];
}
if ( ! isset ( $q [ 'ignore_sticky_posts' ] ) )
$q [ 'ignore_sticky_posts' ] = false ;
2008-08-05 01:48:21 -04:00
2008-08-28 18:30:27 -04:00
if ( ! isset ( $q [ 'suppress_filters' ]) )
$q [ 'suppress_filters' ] = false ;
2010-05-15 11:00:53 -04:00
if ( ! isset ( $q [ 'cache_results' ]) ) {
if ( $_wp_using_ext_object_cache )
$q [ 'cache_results' ] = false ;
else
$q [ 'cache_results' ] = true ;
}
2010-04-29 16:43:59 -04:00
2010-05-09 20:58:39 -04:00
if ( ! isset ( $q [ 'update_post_term_cache' ]) )
$q [ 'update_post_term_cache' ] = true ;
if ( ! isset ( $q [ 'update_post_meta_cache' ]) )
$q [ 'update_post_meta_cache' ] = true ;
2007-12-22 03:19:10 -05:00
if ( ! isset ( $q [ 'post_type' ]) ) {
if ( $this -> is_search )
$q [ 'post_type' ] = 'any' ;
else
2009-08-15 06:57:56 -04:00
$q [ 'post_type' ] = '' ;
2007-12-22 03:19:10 -05:00
}
2006-03-12 20:44:32 -05:00
$post_type = $q [ 'post_type' ];
if ( ! isset ( $q [ 'posts_per_page' ]) || $q [ 'posts_per_page' ] == 0 )
2006-08-30 17:46:31 -04:00
$q [ 'posts_per_page' ] = get_option ( 'posts_per_page' );
2006-03-12 20:44:32 -05:00
if ( isset ( $q [ 'showposts' ]) && $q [ 'showposts' ] ) {
$q [ 'showposts' ] = ( int ) $q [ 'showposts' ];
$q [ 'posts_per_page' ] = $q [ 'showposts' ];
}
if ( ( isset ( $q [ 'posts_per_archive_page' ]) && $q [ 'posts_per_archive_page' ] != 0 ) && ( $this -> is_archive || $this -> is_search ) )
$q [ 'posts_per_page' ] = $q [ 'posts_per_archive_page' ];
if ( ! isset ( $q [ 'nopaging' ]) ) {
2010-05-03 16:19:13 -04:00
if ( $q [ 'posts_per_page' ] == - 1 ) {
2006-03-12 20:44:32 -05:00
$q [ 'nopaging' ] = true ;
} else {
$q [ 'nopaging' ] = false ;
}
}
if ( $this -> is_feed ) {
2006-08-30 17:46:31 -04:00
$q [ 'posts_per_page' ] = get_option ( 'posts_per_rss' );
2006-12-06 18:14:37 -05:00
$q [ 'nopaging' ] = false ;
2006-03-12 20:44:32 -05:00
}
2006-08-24 18:33:16 -04:00
$q [ 'posts_per_page' ] = ( int ) $q [ 'posts_per_page' ];
if ( $q [ 'posts_per_page' ] < - 1 )
$q [ 'posts_per_page' ] = abs ( $q [ 'posts_per_page' ]);
else if ( $q [ 'posts_per_page' ] == 0 )
$q [ 'posts_per_page' ] = 1 ;
2006-03-12 20:44:32 -05:00
2008-09-23 17:11:27 -04:00
if ( ! isset ( $q [ 'comments_per_page' ]) || $q [ 'comments_per_page' ] == 0 )
$q [ 'comments_per_page' ] = get_option ( 'comments_per_page' );
2006-06-21 23:39:23 -04:00
if ( $this -> is_home && ( empty ( $this -> query ) || $q [ 'preview' ] == 'true' ) && ( 'page' == get_option ( 'show_on_front' ) ) && get_option ( 'page_on_front' ) ) {
2006-03-12 20:44:32 -05:00
$this -> is_page = true ;
$this -> is_home = false ;
$q [ 'page_id' ] = get_option ( 'page_on_front' );
}
2010-05-03 16:19:13 -04:00
if ( isset ( $q [ 'page' ]) ) {
2006-03-12 20:44:32 -05:00
$q [ 'page' ] = trim ( $q [ 'page' ], '/' );
2008-05-08 01:17:27 -04:00
$q [ 'page' ] = absint ( $q [ 'page' ]);
2006-03-12 20:44:32 -05:00
}
2010-03-10 13:37:03 -05:00
// If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present.
if ( isset ( $q [ 'no_found_rows' ]) )
$q [ 'no_found_rows' ] = ( bool ) $q [ 'no_found_rows' ];
else
$q [ 'no_found_rows' ] = false ;
2006-03-12 20:44:32 -05:00
// If a month is specified in the querystring, load that month
2007-03-08 23:05:28 -05:00
if ( $q [ 'm' ] ) {
2006-03-12 20:44:32 -05:00
$q [ 'm' ] = '' . preg_replace ( '|[^0-9]|' , '' , $q [ 'm' ]);
2008-03-23 13:02:11 -04:00
$where .= " AND YEAR( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 0 , 4 );
2010-05-03 16:19:13 -04:00
if ( strlen ( $q [ 'm' ]) > 5 )
2008-03-23 13:02:11 -04:00
$where .= " AND MONTH( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 4 , 2 );
2010-05-03 16:19:13 -04:00
if ( strlen ( $q [ 'm' ]) > 7 )
2008-03-23 13:02:11 -04:00
$where .= " AND DAYOFMONTH( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 6 , 2 );
2010-05-03 16:19:13 -04:00
if ( strlen ( $q [ 'm' ]) > 9 )
2008-03-23 13:02:11 -04:00
$where .= " AND HOUR( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 8 , 2 );
2010-05-03 16:19:13 -04:00
if ( strlen ( $q [ 'm' ]) > 11 )
2008-03-23 13:02:11 -04:00
$where .= " AND MINUTE( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 10 , 2 );
2010-05-03 16:19:13 -04:00
if ( strlen ( $q [ 'm' ]) > 13 )
2008-03-23 13:02:11 -04:00
$where .= " AND SECOND( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 12 , 2 );
2006-03-12 20:44:32 -05:00
}
2007-08-04 12:30:27 -04:00
if ( '' !== $q [ 'hour' ] )
2008-03-23 13:02:11 -04:00
$where .= " AND HOUR( $wpdb->posts .post_date)=' " . $q [ 'hour' ] . " ' " ;
2006-03-12 20:44:32 -05:00
2007-08-04 12:30:27 -04:00
if ( '' !== $q [ 'minute' ] )
2008-03-23 13:02:11 -04:00
$where .= " AND MINUTE( $wpdb->posts .post_date)=' " . $q [ 'minute' ] . " ' " ;
2006-03-12 20:44:32 -05:00
2007-08-04 12:30:27 -04:00
if ( '' !== $q [ 'second' ] )
2008-03-23 13:02:11 -04:00
$where .= " AND SECOND( $wpdb->posts .post_date)=' " . $q [ 'second' ] . " ' " ;
2006-03-12 20:44:32 -05:00
2007-03-08 23:05:28 -05:00
if ( $q [ 'year' ] )
2008-03-23 13:02:11 -04:00
$where .= " AND YEAR( $wpdb->posts .post_date)=' " . $q [ 'year' ] . " ' " ;
2006-03-12 20:44:32 -05:00
2007-03-08 23:05:28 -05:00
if ( $q [ 'monthnum' ] )
2008-03-23 13:02:11 -04:00
$where .= " AND MONTH( $wpdb->posts .post_date)=' " . $q [ 'monthnum' ] . " ' " ;
2006-03-12 20:44:32 -05:00
2007-03-08 23:05:28 -05:00
if ( $q [ 'day' ] )
2008-03-23 13:02:11 -04:00
$where .= " AND DAYOFMONTH( $wpdb->posts .post_date)=' " . $q [ 'day' ] . " ' " ;
2006-03-12 20:44:32 -05:00
2010-04-11 09:51:24 -04:00
// If we've got a post_type AND its not "any" post_type.
2010-04-07 04:29:46 -04:00
if ( ! empty ( $q [ 'post_type' ]) && 'any' != $q [ 'post_type' ] ) {
2010-04-11 09:51:24 -04:00
foreach ( ( array ) $q [ 'post_type' ] as $_post_type ) {
$ptype_obj = get_post_type_object ( $_post_type );
if ( ! $ptype_obj || ! $ptype_obj -> query_var || empty ( $q [ $ptype_obj -> query_var ]) )
2010-03-27 01:56:27 -04:00
continue ;
2010-05-03 16:19:13 -04:00
if ( ! $ptype_obj -> hierarchical || strpos ( $q [ $ptype_obj -> query_var ], '/' ) === false ) {
2010-04-11 09:51:24 -04:00
// Non-hierarchical post_types & parent-level-hierarchical post_types can directly use 'name'
$q [ 'name' ] = $q [ $ptype_obj -> query_var ];
2010-03-19 22:23:52 -04:00
} else {
2010-05-03 16:26:11 -04:00
// Hierarchical post_types will operate through the
2010-04-11 09:51:24 -04:00
$q [ 'pagename' ] = $q [ $ptype_obj -> query_var ];
$q [ 'name' ] = '' ;
2010-03-19 22:23:52 -04:00
}
2010-04-11 09:51:24 -04:00
// Only one request for a slug is possible, this is why name & pagename are overwritten above.
break ;
2010-03-27 01:56:27 -04:00
} //end foreach
2010-04-11 09:51:24 -04:00
unset ( $ptype_obj );
}
2010-03-27 01:56:27 -04:00
2010-04-11 09:51:24 -04:00
if ( '' != $q [ 'name' ] ) {
2006-03-12 20:44:32 -05:00
$q [ 'name' ] = sanitize_title ( $q [ 'name' ]);
2008-03-23 13:02:11 -04:00
$where .= " AND $wpdb->posts .post_name = ' " . $q [ 'name' ] . " ' " ;
2010-03-19 22:23:52 -04:00
} elseif ( '' != $q [ 'pagename' ] ) {
2010-04-11 09:51:24 -04:00
if ( isset ( $this -> queried_object_id ) ) {
2007-02-28 00:22:29 -05:00
$reqpage = $this -> queried_object_id ;
2010-04-11 09:51:24 -04:00
} else {
if ( 'page' != $q [ 'post_type' ] ) {
foreach ( ( array ) $q [ 'post_type' ] as $_post_type ) {
$ptype_obj = get_post_type_object ( $_post_type );
if ( ! $ptype_obj || ! $ptype_obj -> hierarchical )
continue ;
$reqpage = get_page_by_path ( $q [ 'pagename' ], OBJECT , $_post_type );
if ( $reqpage )
break ;
}
unset ( $ptype_obj );
} else {
$reqpage = get_page_by_path ( $q [ 'pagename' ]);
}
2007-02-28 00:22:29 -05:00
if ( ! empty ( $reqpage ) )
$reqpage = $reqpage -> ID ;
else
$reqpage = 0 ;
}
2006-03-12 20:44:32 -05:00
2008-05-07 15:57:15 -04:00
$page_for_posts = get_option ( 'page_for_posts' );
2010-03-19 22:23:52 -04:00
if ( ( 'page' != get_option ( 'show_on_front' ) ) || empty ( $page_for_posts ) || ( $reqpage != $page_for_posts ) ) {
2006-03-12 20:44:32 -05:00
$q [ 'pagename' ] = str_replace ( '%2F' , '/' , urlencode ( urldecode ( $q [ 'pagename' ])));
$page_paths = '/' . trim ( $q [ 'pagename' ], '/' );
$q [ 'pagename' ] = sanitize_title ( basename ( $page_paths ));
$q [ 'name' ] = $q [ 'pagename' ];
2008-06-24 13:49:24 -04:00
$where .= " AND ( $wpdb->posts .ID = ' $reqpage ') " ;
2007-12-12 06:45:55 -05:00
$reqpage_obj = get_page ( $reqpage );
2008-11-10 13:54:18 -05:00
if ( is_object ( $reqpage_obj ) && 'attachment' == $reqpage_obj -> post_type ) {
2007-12-12 06:45:55 -05:00
$this -> is_attachment = true ;
2010-04-11 09:51:24 -04:00
$post_type = $q [ 'post_type' ] = 'attachment' ;
2008-02-27 16:30:59 -05:00
$this -> is_page = true ;
2007-12-12 06:45:55 -05:00
$q [ 'attachment_id' ] = $reqpage ;
}
2006-03-12 20:44:32 -05:00
}
2010-05-03 16:19:13 -04:00
} elseif ( '' != $q [ 'attachment' ] ) {
2006-03-12 20:44:32 -05:00
$q [ 'attachment' ] = str_replace ( '%2F' , '/' , urlencode ( urldecode ( $q [ 'attachment' ])));
$attach_paths = '/' . trim ( $q [ 'attachment' ], '/' );
$q [ 'attachment' ] = sanitize_title ( basename ( $attach_paths ));
$q [ 'name' ] = $q [ 'attachment' ];
2008-03-23 13:02:11 -04:00
$where .= " AND $wpdb->posts .post_name = ' " . $q [ 'attachment' ] . " ' " ;
2006-03-12 20:44:32 -05:00
}
2007-03-08 23:05:28 -05:00
if ( $q [ 'w' ] )
2010-05-07 01:01:29 -04:00
$where .= ' AND ' . _wp_mysql_week ( " ` $wpdb->posts `.`post_date` " ) . " = ' " . $q [ 'w' ] . " ' " ;
2006-03-12 20:44:32 -05:00
if ( intval ( $q [ 'comments_popup' ]) )
2008-05-08 01:17:27 -04:00
$q [ 'p' ] = absint ( $q [ 'comments_popup' ]);
2006-03-12 20:44:32 -05:00
2007-03-08 23:05:28 -05:00
// If an attachment is requested by number, let it supercede any post number.
if ( $q [ 'attachment_id' ] )
2008-05-08 01:17:27 -04:00
$q [ 'p' ] = absint ( $q [ 'attachment_id' ]);
2006-03-12 20:44:32 -05:00
// If a post number is specified, load that post
2008-05-08 01:17:27 -04:00
if ( $q [ 'p' ] ) {
$where .= " AND { $wpdb -> posts } .ID = " . $q [ 'p' ];
} elseif ( $q [ 'post__in' ] ) {
$post__in = implode ( ',' , array_map ( 'absint' , $q [ 'post__in' ] ));
$where .= " AND { $wpdb -> posts } .ID IN ( $post__in ) " ;
2008-05-03 16:08:32 -04:00
} elseif ( $q [ 'post__not_in' ] ) {
2008-05-08 01:17:27 -04:00
$post__not_in = implode ( ',' , array_map ( 'absint' , $q [ 'post__not_in' ] ));
$where .= " AND { $wpdb -> posts } .ID NOT IN ( $post__not_in ) " ;
2008-05-03 16:08:32 -04:00
}
2006-03-12 20:44:32 -05:00
2008-11-19 15:48:05 -05:00
if ( is_numeric ( $q [ 'post_parent' ]) )
2008-05-08 01:17:27 -04:00
$where .= $wpdb -> prepare ( " AND $wpdb->posts .post_parent = %d " , $q [ 'post_parent' ] );
2007-03-08 23:05:28 -05:00
if ( $q [ 'page_id' ] ) {
2007-02-28 00:22:29 -05:00
if ( ( 'page' != get_option ( 'show_on_front' ) ) || ( $q [ 'page_id' ] != get_option ( 'page_for_posts' ) ) ) {
2006-03-12 20:44:32 -05:00
$q [ 'p' ] = $q [ 'page_id' ];
2007-11-03 15:00:33 -04:00
$where = " AND { $wpdb -> posts } .ID = " . $q [ 'page_id' ];
2006-03-12 20:44:32 -05:00
}
}
// If a search pattern is specified, load the posts that match
2007-03-08 23:05:28 -05:00
if ( ! empty ( $q [ 's' ]) ) {
2006-10-26 23:47:43 -04:00
// added slashes screw with quote grouping when done early, so done later
$q [ 's' ] = stripslashes ( $q [ 's' ]);
2008-11-15 12:56:44 -05:00
if ( ! empty ( $q [ 'sentence' ]) ) {
2006-10-26 23:47:43 -04:00
$q [ 'search_terms' ] = array ( $q [ 's' ]);
2007-12-22 03:19:10 -05:00
} else {
2008-11-15 12:56:44 -05:00
preg_match_all ( '/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/' , $q [ 's' ], $matches );
2009-10-18 07:50:59 -04:00
$q [ 'search_terms' ] = array_map ( '_search_terms_tidy' , $matches [ 0 ]);
2006-10-26 23:47:43 -04:00
}
2008-11-15 12:56:44 -05:00
$n = ! empty ( $q [ 'exact' ]) ? '' : '%' ;
2006-10-26 23:47:43 -04:00
$searchand = '' ;
2010-05-03 16:19:13 -04:00
foreach ( ( array ) $q [ 'search_terms' ] as $term ) {
2006-10-26 23:47:43 -04:00
$term = addslashes_gpc ( $term );
2008-03-23 13:02:11 -04:00
$search .= " { $searchand } (( $wpdb->posts .post_title LIKE ' { $n } { $term } { $n } ') OR ( $wpdb->posts .post_content LIKE ' { $n } { $term } { $n } ')) " ;
2006-10-26 23:47:43 -04:00
$searchand = ' AND ' ;
2006-03-12 20:44:32 -05:00
}
2009-09-27 01:33:56 -04:00
$term = esc_sql ( $q [ 's' ]);
2010-02-28 02:47:11 -05:00
if ( empty ( $q [ 'sentence' ]) && count ( $q [ 'search_terms' ]) > 1 && $q [ 'search_terms' ][ 0 ] != $q [ 's' ] )
2008-03-23 13:02:11 -04:00
$search .= " OR ( $wpdb->posts .post_title LIKE ' { $n } { $term } { $n } ') OR ( $wpdb->posts .post_content LIKE ' { $n } { $term } { $n } ') " ;
2007-02-21 20:54:28 -05:00
2009-04-27 20:05:43 -04:00
if ( ! empty ( $search ) ) {
2007-02-21 20:54:28 -05:00
$search = " AND ( { $search } ) " ;
2009-04-27 20:05:43 -04:00
if ( ! is_user_logged_in () )
$search .= " AND ( $wpdb->posts .post_password = '') " ;
}
2006-03-12 20:44:32 -05:00
}
2010-05-25 22:42:15 -04:00
2010-05-13 13:34:43 -04:00
// Allow plugins to contextually add/remove/modify the search section of the database query
2010-03-18 17:55:25 -04:00
$search = apply_filters_ref_array ( 'posts_search' , array ( $search , & $this ) );
2006-03-12 20:44:32 -05:00
2010-09-13 12:44:14 -04:00
// Taxonomies
2010-10-09 06:19:15 -04:00
if ( ! empty ( $q [ 'tax_query' ] ) ) {
2010-09-23 19:19:47 -04:00
if ( empty ( $post_type ) ) {
$post_type = 'any' ;
$post_status_join = true ;
} elseif ( in_array ( 'attachment' , ( array ) $post_type ) ) {
$post_status_join = true ;
}
2010-10-09 06:19:15 -04:00
$where .= $this -> get_tax_sql ( $q [ 'tax_query' ], " $wpdb->posts .ID " );
2010-10-02 14:03:06 -04:00
// Back-compat
if ( ! empty ( $ids ) ) {
2010-10-09 06:19:15 -04:00
$cat_query = wp_list_filter ( $q [ 'tax_query' ], array ( 'taxonomy' => 'category' ) );
2010-10-02 14:03:06 -04:00
if ( ! empty ( $cat_query ) ) {
$cat_query = reset ( $cat_query );
$cat = get_term_by ( $cat_query [ 'field' ], $cat_query [ 'terms' ][ 0 ], 'category' );
if ( $cat ) {
$this -> set ( 'cat' , $cat -> term_id );
$this -> set ( 'category_name' , $cat -> slug );
}
}
}
unset ( $ids );
2007-09-02 23:24:23 -04:00
}
2010-09-13 12:44:14 -04:00
if ( ! empty ( $q [ 'meta_key' ]) ) {
$groupby = " { $wpdb -> posts } .ID " ;
2008-03-23 13:02:11 -04:00
}
2006-03-12 20:44:32 -05:00
// Author/user stuff
2007-03-08 23:05:28 -05:00
if ( empty ( $q [ 'author' ]) || ( $q [ 'author' ] == '0' ) ) {
2010-05-03 16:19:13 -04:00
$whichauthor = '' ;
2006-03-12 20:44:32 -05:00
} else {
2010-05-03 16:19:13 -04:00
$q [ 'author' ] = ( string ) urldecode ( $q [ 'author' ]);
2006-03-12 20:44:32 -05:00
$q [ 'author' ] = addslashes_gpc ( $q [ 'author' ]);
2010-05-03 16:19:13 -04:00
if ( strpos ( $q [ 'author' ], '-' ) !== false ) {
2006-03-12 20:44:32 -05:00
$eq = '!=' ;
$andor = 'AND' ;
$q [ 'author' ] = explode ( '-' , $q [ 'author' ]);
2010-05-03 16:19:13 -04:00
$q [ 'author' ] = ( string ) absint ( $q [ 'author' ][ 1 ]);
2006-03-12 20:44:32 -05:00
} else {
$eq = '=' ;
$andor = 'OR' ;
}
$author_array = preg_split ( '/[,\s]+/' , $q [ 'author' ]);
2010-05-03 16:19:13 -04:00
$_author_array = array ();
foreach ( $author_array as $key => $_author )
$_author_array [] = " $wpdb->posts .post_author " . $eq . ' ' . absint ( $_author );
$whichauthor .= ' AND (' . implode ( " $andor " , $_author_array ) . ')' ;
unset ( $author_array , $_author_array );
2006-03-12 20:44:32 -05:00
}
2006-08-30 12:40:17 -04:00
// Author stuff for nice URLs
2006-03-12 20:44:32 -05:00
2010-05-03 16:19:13 -04:00
if ( '' != $q [ 'author_name' ] ) {
if ( strpos ( $q [ 'author_name' ], '/' ) !== false ) {
$q [ 'author_name' ] = explode ( '/' , $q [ 'author_name' ]);
if ( $q [ 'author_name' ][ count ( $q [ 'author_name' ]) - 1 ] ) {
2010-05-03 16:20:46 -04:00
$q [ 'author_name' ] = $q [ 'author_name' ][ count ( $q [ 'author_name' ]) - 1 ]; // no trailing slash
2006-03-12 20:44:32 -05:00
} else {
2010-05-03 16:20:46 -04:00
$q [ 'author_name' ] = $q [ 'author_name' ][ count ( $q [ 'author_name' ]) - 2 ]; // there was a trailling slash
2006-03-12 20:44:32 -05:00
}
}
$q [ 'author_name' ] = sanitize_title ( $q [ 'author_name' ]);
2009-04-17 17:25:11 -04:00
$q [ 'author' ] = get_user_by ( 'slug' , $q [ 'author_name' ]);
if ( $q [ 'author' ] )
2009-04-20 14:18:39 -04:00
$q [ 'author' ] = $q [ 'author' ] -> ID ;
2010-05-03 16:19:13 -04:00
$whichauthor .= " AND ( $wpdb->posts .post_author = " . absint ( $q [ 'author' ]) . ')' ;
2006-03-12 20:44:32 -05:00
}
2008-02-19 01:13:20 -05:00
// MIME-Type stuff for attachment browsing
2010-05-06 14:03:05 -04:00
if ( isset ( $q [ 'post_mime_type' ]) && '' != $q [ 'post_mime_type' ] ) {
$table_alias = $post_status_join ? $wpdb -> posts : '' ;
$whichmimetype = wp_post_mime_type_where ( $q [ 'post_mime_type' ], $table_alias );
}
2008-02-19 01:13:20 -05:00
2010-09-13 12:44:14 -04:00
$where .= $search . $whichauthor . $whichmimetype ;
2006-03-12 20:44:32 -05:00
2007-03-08 23:05:28 -05:00
if ( empty ( $q [ 'order' ]) || (( strtoupper ( $q [ 'order' ]) != 'ASC' ) && ( strtoupper ( $q [ 'order' ]) != 'DESC' )) )
$q [ 'order' ] = 'DESC' ;
2006-03-12 20:44:32 -05:00
// Order by
2007-03-08 23:05:28 -05:00
if ( empty ( $q [ 'orderby' ]) ) {
2010-05-03 16:19:13 -04:00
$q [ 'orderby' ] = " $wpdb->posts .post_date " . $q [ 'order' ];
2009-05-20 17:26:00 -04:00
} elseif ( 'none' == $q [ 'orderby' ] ) {
$q [ 'orderby' ] = '' ;
2006-03-12 20:44:32 -05:00
} else {
// Used to filter values
2009-10-29 14:02:55 -04:00
$allowed_keys = array ( 'author' , 'date' , 'title' , 'modified' , 'menu_order' , 'parent' , 'ID' , 'rand' , 'comment_count' );
2008-09-18 01:34:37 -04:00
if ( ! empty ( $q [ 'meta_key' ]) ) {
$allowed_keys [] = $q [ 'meta_key' ];
$allowed_keys [] = 'meta_value' ;
2010-02-28 07:49:10 -05:00
$allowed_keys [] = 'meta_value_num' ;
2008-09-18 01:34:37 -04:00
}
2006-03-12 20:44:32 -05:00
$q [ 'orderby' ] = urldecode ( $q [ 'orderby' ]);
$q [ 'orderby' ] = addslashes_gpc ( $q [ 'orderby' ]);
2010-02-28 07:49:10 -05:00
$orderby_array = explode ( ' ' , $q [ 'orderby' ]);
2006-03-12 20:44:32 -05:00
$q [ 'orderby' ] = '' ;
2010-02-28 07:49:10 -05:00
foreach ( $orderby_array as $i => $orderby ) {
2006-03-12 20:44:32 -05:00
// Only allow certain values for safety
2010-02-28 07:49:10 -05:00
if ( ! in_array ( $orderby , $allowed_keys ) )
continue ;
2010-05-03 16:19:13 -04:00
switch ( $orderby ) {
2008-02-08 14:50:10 -05:00
case 'menu_order' :
2008-04-14 21:39:33 -04:00
break ;
2008-02-08 14:50:10 -05:00
case 'ID' :
2008-03-23 13:02:11 -04:00
$orderby = " $wpdb->posts .ID " ;
2008-02-08 14:50:10 -05:00
break ;
case 'rand' :
$orderby = 'RAND()' ;
break ;
2008-09-18 01:34:37 -04:00
case $q [ 'meta_key' ] :
case 'meta_value' :
$orderby = " $wpdb->postmeta .meta_value " ;
break ;
2010-02-28 07:49:10 -05:00
case 'meta_value_num' :
$orderby = " $wpdb->postmeta .meta_value+0 " ;
break ;
2009-10-29 14:02:55 -04:00
case 'comment_count' :
$orderby = " $wpdb->posts .comment_count " ;
2009-11-05 15:02:18 -05:00
break ;
2008-02-08 14:50:10 -05:00
default :
2008-03-23 13:02:11 -04:00
$orderby = " $wpdb->posts .post_ " . $orderby ;
2008-02-08 14:50:10 -05:00
}
2010-02-28 07:49:10 -05:00
$q [ 'orderby' ] .= (( $i == 0 ) ? '' : ',' ) . $orderby ;
2006-03-12 20:44:32 -05:00
}
2010-02-28 07:49:10 -05:00
2008-02-22 15:48:28 -05:00
// append ASC or DESC at the end
if ( ! empty ( $q [ 'orderby' ]))
2007-12-14 01:20:42 -05:00
$q [ 'orderby' ] .= " { $q [ 'order' ] } " ;
2008-02-05 01:47:27 -05:00
2006-03-12 20:44:32 -05:00
if ( empty ( $q [ 'orderby' ]) )
2008-03-23 13:02:11 -04:00
$q [ 'orderby' ] = " $wpdb->posts .post_date " . $q [ 'order' ];
2006-03-12 20:44:32 -05:00
}
2010-02-16 16:13:44 -05:00
if ( is_array ( $post_type ) ) {
2009-11-05 11:08:53 -05:00
$post_type_cap = 'multiple_post_type' ;
2010-02-16 16:13:44 -05:00
} else {
2010-01-04 11:58:43 -05:00
$post_type_object = get_post_type_object ( $post_type );
if ( ! empty ( $post_type_object ) )
2010-01-15 17:11:12 -05:00
$post_type_cap = $post_type_object -> capability_type ;
2010-01-04 11:58:43 -05:00
else
$post_type_cap = $post_type ;
}
2009-09-22 18:57:01 -04:00
2009-10-06 10:43:05 -04:00
$exclude_post_types = '' ;
2010-05-03 18:22:34 -04:00
$in_search_post_types = get_post_types ( array ( 'exclude_from_search' => false ) );
if ( ! empty ( $in_search_post_types ) )
$exclude_post_types .= $wpdb -> prepare ( " AND $wpdb->posts .post_type IN (' " . join ( " ', ' " , $in_search_post_types ) . " ') " );
2009-10-06 10:43:05 -04:00
2009-02-04 15:32:27 -05:00
if ( 'any' == $post_type ) {
2009-10-06 10:43:05 -04:00
$where .= $exclude_post_types ;
2009-11-05 11:08:53 -05:00
} elseif ( ! empty ( $post_type ) && is_array ( $post_type ) ) {
2010-01-15 17:11:12 -05:00
$where .= " AND $wpdb->posts .post_type IN (' " . join ( " ', ' " , $post_type ) . " ') " ;
2009-08-14 23:28:03 -04:00
} elseif ( ! empty ( $post_type ) ) {
$where .= " AND $wpdb->posts .post_type = ' $post_type ' " ;
2010-02-16 16:13:44 -05:00
$post_type_object = get_post_type_object ( $post_type );
2009-02-04 15:32:27 -05:00
} elseif ( $this -> is_attachment ) {
2008-03-23 13:02:11 -04:00
$where .= " AND $wpdb->posts .post_type = 'attachment' " ;
2010-02-16 16:13:44 -05:00
$post_type_object = get_post_type_object ( 'attachment' );
2010-05-03 16:19:13 -04:00
} elseif ( $this -> is_page ) {
2008-03-23 13:02:11 -04:00
$where .= " AND $wpdb->posts .post_type = 'page' " ;
2010-02-16 16:13:44 -05:00
$post_type_object = get_post_type_object ( 'page' );
2009-08-15 06:57:56 -04:00
} else {
2008-03-23 13:02:11 -04:00
$where .= " AND $wpdb->posts .post_type = 'post' " ;
2010-02-16 16:13:44 -05:00
$post_type_object = get_post_type_object ( 'post' );
}
if ( ! empty ( $post_type_object ) ) {
$post_type_cap = $post_type_object -> capability_type ;
2010-05-12 16:45:18 -04:00
$edit_cap = $post_type_object -> cap -> edit_post ;
$read_cap = $post_type_object -> cap -> read_post ;
2010-05-12 17:03:33 -04:00
$edit_others_cap = $post_type_object -> cap -> edit_others_posts ;
2010-05-12 16:45:18 -04:00
$read_private_cap = $post_type_object -> cap -> read_private_posts ;
2010-02-16 16:13:44 -05:00
} else {
$edit_cap = 'edit_' . $post_type_cap ;
$read_cap = 'read_' . $post_type_cap ;
$edit_others_cap = 'edit_others_' . $post_type_cap . 's' ;
$read_private_cap = 'read_private_' . $post_type_cap . 's' ;
2007-05-28 14:34:06 -04:00
}
if ( isset ( $q [ 'post_status' ]) && '' != $q [ 'post_status' ] ) {
2008-03-23 13:02:11 -04:00
$statuswheres = array ();
2007-05-28 14:34:06 -04:00
$q_status = explode ( ',' , $q [ 'post_status' ]);
$r_status = array ();
2008-02-29 16:49:49 -05:00
$p_status = array ();
2010-02-10 17:36:50 -05:00
$e_status = array ();
2009-12-01 03:14:42 -05:00
if ( $q [ 'post_status' ] == 'any' ) {
2010-02-10 17:36:50 -05:00
foreach ( get_post_stati ( array ( 'exclude_from_search' => true ) ) as $status )
$e_status [] = " $wpdb->posts .post_status <> ' $status ' " ;
2009-12-01 03:14:42 -05:00
} else {
2010-02-06 12:51:24 -05:00
foreach ( get_post_stati () as $status ) {
2010-02-10 15:37:18 -05:00
if ( in_array ( $status , $q_status ) ) {
if ( 'private' == $status )
$p_status [] = " $wpdb->posts .post_status = ' $status ' " ;
else
$r_status [] = " $wpdb->posts .post_status = ' $status ' " ;
}
2010-02-06 12:51:24 -05:00
}
2009-12-01 03:14:42 -05:00
}
2008-02-29 16:49:49 -05:00
if ( empty ( $q [ 'perm' ] ) || 'readable' != $q [ 'perm' ] ) {
$r_status = array_merge ( $r_status , $p_status );
unset ( $p_status );
}
2010-02-10 17:36:50 -05:00
if ( ! empty ( $e_status ) ) {
$statuswheres [] = " ( " . join ( ' AND ' , $e_status ) . " ) " ;
}
2008-02-29 16:49:49 -05:00
if ( ! empty ( $r_status ) ) {
2010-02-16 16:13:44 -05:00
if ( ! empty ( $q [ 'perm' ] ) && 'editable' == $q [ 'perm' ] && ! current_user_can ( $edit_others_cap ) )
2008-03-23 13:02:11 -04:00
$statuswheres [] = " ( $wpdb->posts .post_author = $user_ID " . " AND ( " . join ( ' OR ' , $r_status ) . " )) " ;
2008-02-29 16:49:49 -05:00
else
2008-03-23 13:02:11 -04:00
$statuswheres [] = " ( " . join ( ' OR ' , $r_status ) . " ) " ;
2008-02-29 16:49:49 -05:00
}
if ( ! empty ( $p_status ) ) {
2010-02-16 16:13:44 -05:00
if ( ! empty ( $q [ 'perm' ] ) && 'readable' == $q [ 'perm' ] && ! current_user_can ( $read_private_cap ) )
2008-03-23 13:02:11 -04:00
$statuswheres [] = " ( $wpdb->posts .post_author = $user_ID " . " AND ( " . join ( ' OR ' , $p_status ) . " )) " ;
2008-02-29 16:49:49 -05:00
else
2008-03-23 13:02:11 -04:00
$statuswheres [] = " ( " . join ( ' OR ' , $p_status ) . " ) " ;
}
2009-05-20 20:10:04 -04:00
if ( $post_status_join ) {
2009-05-25 01:36:48 -04:00
$join .= " LEFT JOIN $wpdb->posts AS p2 ON ( $wpdb->posts .post_parent = p2.ID) " ;
2009-05-20 20:10:04 -04:00
foreach ( $statuswheres as $index => $statuswhere )
$statuswheres [ $index ] = " ( $statuswhere OR ( $wpdb->posts .post_status = 'inherit' AND " . str_replace ( $wpdb -> posts , 'p2' , $statuswhere ) . " )) " ;
}
2008-03-23 13:02:11 -04:00
foreach ( $statuswheres as $statuswhere )
$where .= " AND $statuswhere " ;
2007-05-28 14:34:06 -04:00
} elseif ( ! $this -> is_singular ) {
2008-03-23 13:02:11 -04:00
$where .= " AND ( $wpdb->posts .post_status = 'publish' " ;
2006-03-12 20:44:32 -05:00
2010-02-16 16:13:44 -05:00
// Add public states.
$public_states = get_post_stati ( array ( 'public' => true ) );
foreach ( ( array ) $public_states as $state ) {
if ( 'publish' == $state ) // Publish is hard-coded above.
continue ;
$where .= " OR $wpdb->posts .post_status = ' $state ' " ;
}
if ( is_admin () ) {
// Add protected states that should show in the admin all list.
2010-04-16 10:08:58 -04:00
$admin_all_states = get_post_stati ( array ( 'protected' => true , 'show_in_admin_all_list' => true ) );
2010-02-16 16:13:44 -05:00
foreach ( ( array ) $admin_all_states as $state )
$where .= " OR $wpdb->posts .post_status = ' $state ' " ;
}
2007-06-13 22:25:30 -04:00
2007-05-28 16:39:24 -04:00
if ( is_user_logged_in () ) {
2010-02-16 16:13:44 -05:00
// Add private states that are limited to viewing by the author of a post or someone who has caps to read private states.
$private_states = get_post_stati ( array ( 'private' => true ) );
foreach ( ( array ) $private_states as $state )
$where .= current_user_can ( $read_private_cap ) ? " OR $wpdb->posts .post_status = ' $state ' " : " OR $wpdb->posts .post_author = $user_ID AND $wpdb->posts .post_status = ' $state ' " ;
2007-05-28 16:39:24 -04:00
}
2006-05-11 19:13:35 -04:00
2007-05-28 14:34:06 -04:00
$where .= ')' ;
2006-03-12 20:44:32 -05:00
}
2010-10-09 08:18:52 -04:00
if ( ! empty ( $q [ 'meta_query' ] ) ) {
list ( $meta_join , $meta_where ) = $this -> get_meta_sql ( $q [ 'meta_query' ], $wpdb -> posts , 'ID' , $wpdb -> postmeta , 'post_id' );
$join .= $meta_join ;
$where .= $meta_where ;
}
2008-05-03 16:08:32 -04:00
2006-03-12 20:44:32 -05:00
// Apply filters on where and join prior to paging so that any
// manipulations to them are reflected in the paging by day queries.
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] ) {
2010-03-18 17:55:25 -04:00
$where = apply_filters_ref_array ( 'posts_where' , array ( $where , & $this ) );
$join = apply_filters_ref_array ( 'posts_join' , array ( $join , & $this ) );
2008-08-28 18:30:27 -04:00
}
2006-03-12 20:44:32 -05:00
// Paging
2007-03-08 23:05:28 -05:00
if ( empty ( $q [ 'nopaging' ]) && ! $this -> is_singular ) {
2008-01-29 13:48:38 -05:00
$page = absint ( $q [ 'paged' ]);
2010-04-17 05:03:33 -04:00
if ( empty ( $page ) )
2006-03-12 20:44:32 -05:00
$page = 1 ;
2006-11-08 16:22:35 -05:00
if ( empty ( $q [ 'offset' ]) ) {
$pgstrt = '' ;
2008-05-08 01:17:27 -04:00
$pgstrt = ( $page - 1 ) * $q [ 'posts_per_page' ] . ', ' ;
2010-05-03 16:19:13 -04:00
$limits = 'LIMIT ' . $pgstrt . $q [ 'posts_per_page' ];
2006-11-08 16:22:35 -05:00
} else { // we're ignoring $page and using 'offset'
2008-01-29 13:48:38 -05:00
$q [ 'offset' ] = absint ( $q [ 'offset' ]);
2006-11-08 16:22:35 -05:00
$pgstrt = $q [ 'offset' ] . ', ' ;
$limits = 'LIMIT ' . $pgstrt . $q [ 'posts_per_page' ];
2006-03-12 20:44:32 -05:00
}
}
2007-02-27 10:24:54 -05:00
2007-02-24 02:33:29 -05:00
// Comments feeds
if ( $this -> is_comment_feed && ( $this -> is_archive || $this -> is_search || ! $this -> is_singular ) ) {
if ( $this -> is_archive || $this -> is_search ) {
2009-05-11 00:56:00 -04:00
$cjoin = " JOIN $wpdb->posts ON ( $wpdb->comments .comment_post_ID = $wpdb->posts .ID) $join " ;
2007-02-24 02:33:29 -05:00
$cwhere = " WHERE comment_approved = '1' $where " ;
2009-05-05 18:41:26 -04:00
$cgroupby = " $wpdb->comments .comment_id " ;
2007-02-24 02:33:29 -05:00
} else { // Other non singular e.g. front
2009-05-11 00:56:00 -04:00
$cjoin = " JOIN $wpdb->posts ON ( $wpdb->comments .comment_post_ID = $wpdb->posts .ID ) " ;
2007-02-24 02:33:29 -05:00
$cwhere = " WHERE post_status = 'publish' AND comment_approved = '1' " ;
$cgroupby = '' ;
}
2007-02-27 10:24:54 -05:00
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] ) {
2010-03-18 17:55:25 -04:00
$cjoin = apply_filters_ref_array ( 'comment_feed_join' , array ( $cjoin , & $this ) );
$cwhere = apply_filters_ref_array ( 'comment_feed_where' , array ( $cwhere , & $this ) );
$cgroupby = apply_filters_ref_array ( 'comment_feed_groupby' , array ( $cgroupby , & $this ) );
$corderby = apply_filters_ref_array ( 'comment_feed_orderby' , array ( 'comment_date_gmt DESC' , & $this ) );
$climits = apply_filters_ref_array ( 'comment_feed_limits' , array ( 'LIMIT ' . get_option ( 'posts_per_rss' ), & $this ) );
2008-08-28 18:30:27 -04:00
}
2009-05-05 18:41:26 -04:00
$cgroupby = ( ! empty ( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '' ;
$corderby = ( ! empty ( $corderby ) ) ? 'ORDER BY ' . $corderby : '' ;
2007-02-27 10:24:54 -05:00
2009-05-05 18:41:26 -04:00
$this -> comments = ( array ) $wpdb -> get_results ( " SELECT $distinct $wpdb->comments .* FROM $wpdb->comments $cjoin $cwhere $cgroupby $corderby $climits " );
2007-02-24 02:33:29 -05:00
$this -> comment_count = count ( $this -> comments );
$post_ids = array ();
2007-02-27 10:24:54 -05:00
2010-05-03 16:19:13 -04:00
foreach ( $this -> comments as $comment )
2007-02-24 02:33:29 -05:00
$post_ids [] = ( int ) $comment -> comment_post_ID ;
2007-02-27 10:24:54 -05:00
2007-02-24 02:33:29 -05:00
$post_ids = join ( ',' , $post_ids );
$join = '' ;
if ( $post_ids )
$where = " AND $wpdb->posts .ID IN ( $post_ids ) " ;
else
$where = " AND 0 " ;
}
2006-03-12 20:44:32 -05:00
2008-08-29 14:33:04 -04:00
$orderby = $q [ 'orderby' ];
2010-10-13 12:37:01 -04:00
$pieces = array ( 'where' , 'groupby' , 'join' , 'orderby' , 'distinct' , 'fields' , 'limits' );
2006-03-12 20:44:32 -05:00
// Apply post-paging filters on where and join. Only plugins that
2007-09-03 19:32:58 -04:00
// manipulate paging queries should use these hooks.
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] ) {
2010-10-13 12:37:01 -04:00
$where = apply_filters_ref_array ( 'posts_where_paged' , array ( $where , & $this ) );
$groupby = apply_filters_ref_array ( 'posts_groupby' , array ( $groupby , & $this ) );
$join = apply_filters_ref_array ( 'posts_join_paged' , array ( $join , & $this ) );
$orderby = apply_filters_ref_array ( 'posts_orderby' , array ( $orderby , & $this ) );
$distinct = apply_filters_ref_array ( 'posts_distinct' , array ( $distinct , & $this ) );
$limits = apply_filters_ref_array ( 'post_limits' , array ( $limits , & $this ) );
$fields = apply_filters_ref_array ( 'posts_fields' , array ( $fields , & $this ) );
// Filter all clauses at once, for convenience
$clauses = apply_filters_ref_array ( 'posts_clauses' , array ( compact ( $pieces ), & $this ) );
foreach ( $pieces as $piece )
$$piece = isset ( $clauses [ $piece ] ) ? $clauses [ $piece ] : '' ;
2008-08-28 18:30:27 -04:00
}
2007-11-18 14:36:30 -05:00
// Announce current selection parameters. For use by caching plugins.
do_action ( 'posts_selection' , $where . $groupby . $orderby . $limits . $join );
// Filter again for the benefit of caching plugins. Regular plugins should use the hooks above.
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] ) {
2010-10-13 12:37:01 -04:00
$where = apply_filters_ref_array ( 'posts_where_request' , array ( $where , & $this ) );
$groupby = apply_filters_ref_array ( 'posts_groupby_request' , array ( $groupby , & $this ) );
$join = apply_filters_ref_array ( 'posts_join_request' , array ( $join , & $this ) );
$orderby = apply_filters_ref_array ( 'posts_orderby_request' , array ( $orderby , & $this ) );
$distinct = apply_filters_ref_array ( 'posts_distinct_request' , array ( $distinct , & $this ) );
$fields = apply_filters_ref_array ( 'posts_fields_request' , array ( $fields , & $this ) );
$limits = apply_filters_ref_array ( 'post_limits_request' , array ( $limits , & $this ) );
// Filter all clauses at once, for convenience
$clauses = apply_filters_ref_array ( 'posts_clauses_request' , array ( compact ( $pieces ), & $this ) );
foreach ( $pieces as $piece )
$$piece = isset ( $clauses [ $piece ] ) ? $clauses [ $piece ] : '' ;
2008-08-28 18:30:27 -04:00
}
2007-11-18 14:36:30 -05:00
if ( ! empty ( $groupby ) )
$groupby = 'GROUP BY ' . $groupby ;
if ( ! empty ( $orderby ) )
$orderby = 'ORDER BY ' . $orderby ;
2006-11-08 04:13:11 -05:00
$found_rows = '' ;
2010-03-10 13:37:03 -05:00
if ( ! $q [ 'no_found_rows' ] && ! empty ( $limits ) )
2006-11-08 04:13:11 -05:00
$found_rows = 'SQL_CALC_FOUND_ROWS' ;
2006-12-01 05:15:15 -05:00
2008-08-29 14:33:04 -04:00
$this -> request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits " ;
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] )
2010-03-18 17:55:25 -04:00
$this -> request = apply_filters_ref_array ( 'posts_request' , array ( $this -> request , & $this ) );
2010-03-27 02:03:58 -04:00
2006-03-12 20:44:32 -05:00
$this -> posts = $wpdb -> get_results ( $this -> request );
2007-08-22 14:03:26 -04:00
// Raw results filter. Prior to status checks.
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] )
2010-03-18 17:55:25 -04:00
$this -> posts = apply_filters_ref_array ( 'posts_results' , array ( $this -> posts , & $this ) );
2007-02-24 02:33:29 -05:00
2008-01-29 14:01:39 -05:00
if ( ! empty ( $this -> posts ) && $this -> is_comment_feed && $this -> is_singular ) {
2010-03-18 17:55:25 -04:00
$cjoin = apply_filters_ref_array ( 'comment_feed_join' , array ( '' , & $this ) );
$cwhere = apply_filters_ref_array ( 'comment_feed_where' , array ( " WHERE comment_post_ID = ' { $this -> posts [ 0 ] -> ID } ' AND comment_approved = '1' " , & $this ) );
$cgroupby = apply_filters_ref_array ( 'comment_feed_groupby' , array ( '' , & $this ) );
2009-05-05 18:41:26 -04:00
$cgroupby = ( ! empty ( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '' ;
2010-03-18 17:55:25 -04:00
$corderby = apply_filters_ref_array ( 'comment_feed_orderby' , array ( 'comment_date_gmt DESC' , & $this ) );
2009-05-05 18:41:26 -04:00
$corderby = ( ! empty ( $corderby ) ) ? 'ORDER BY ' . $corderby : '' ;
2010-03-18 17:55:25 -04:00
$climits = apply_filters_ref_array ( 'comment_feed_limits' , array ( 'LIMIT ' . get_option ( 'posts_per_rss' ), & $this ) );
2009-05-05 18:41:26 -04:00
$comments_request = " SELECT $wpdb->comments .* FROM $wpdb->comments $cjoin $cwhere $cgroupby $corderby $climits " ;
2007-02-24 02:33:29 -05:00
$this -> comments = $wpdb -> get_results ( $comments_request );
$this -> comment_count = count ( $this -> comments );
}
2007-02-27 10:24:54 -05:00
2010-03-10 13:37:03 -05:00
if ( ! $q [ 'no_found_rows' ] && ! empty ( $limits ) ) {
2010-03-18 17:55:25 -04:00
$found_posts_query = apply_filters_ref_array ( 'found_posts_query' , array ( 'SELECT FOUND_ROWS()' , & $this ) );
2006-12-01 05:15:15 -05:00
$this -> found_posts = $wpdb -> get_var ( $found_posts_query );
2010-03-18 17:55:25 -04:00
$this -> found_posts = apply_filters_ref_array ( 'found_posts' , array ( $this -> found_posts , & $this ) );
2006-11-18 19:58:15 -05:00
$this -> max_num_pages = ceil ( $this -> found_posts / $q [ 'posts_per_page' ]);
2006-11-08 04:13:11 -05:00
}
2007-02-27 10:24:54 -05:00
2006-03-12 20:44:32 -05:00
// Check post status to determine if post should be displayed.
if ( ! empty ( $this -> posts ) && ( $this -> is_single || $this -> is_page ) ) {
$status = get_post_status ( $this -> posts [ 0 ]);
2010-02-16 16:13:44 -05:00
$post_status_obj = get_post_status_object ( $status );
2006-03-12 20:44:32 -05:00
//$type = get_post_type($this->posts[0]);
2010-02-16 16:13:44 -05:00
if ( ! $post_status_obj -> public ) {
2006-03-12 20:44:32 -05:00
if ( ! is_user_logged_in () ) {
// User must be logged in to view unpublished posts.
$this -> posts = array ();
} else {
2010-02-16 16:13:44 -05:00
if ( $post_status_obj -> protected ) {
2006-03-12 20:44:32 -05:00
// User must have edit permissions on the draft to preview.
2010-05-03 16:19:13 -04:00
if ( ! current_user_can ( $edit_cap , $this -> posts [ 0 ] -> ID ) ) {
2006-03-12 20:44:32 -05:00
$this -> posts = array ();
} else {
$this -> is_preview = true ;
2010-05-03 16:19:13 -04:00
if ( 'future' != $status )
2010-02-16 16:13:44 -05:00
$this -> posts [ 0 ] -> post_date = current_time ( 'mysql' );
2006-03-12 20:44:32 -05:00
}
2010-02-16 16:13:44 -05:00
} elseif ( $post_status_obj -> private ) {
if ( ! current_user_can ( $read_cap , $this -> posts [ 0 ] -> ID ) )
2006-03-12 20:44:32 -05:00
$this -> posts = array ();
2010-02-16 16:13:44 -05:00
} else {
$this -> posts = array ();
2006-03-12 20:44:32 -05:00
}
}
}
2008-11-04 08:00:12 -05:00
2010-02-16 16:13:44 -05:00
if ( $this -> is_preview && current_user_can ( $edit_cap , $this -> posts [ 0 ] -> ID ) )
2010-03-18 17:55:25 -04:00
$this -> posts [ 0 ] = apply_filters_ref_array ( 'the_preview' , array ( $this -> posts [ 0 ], & $this ));
2006-03-12 20:44:32 -05:00
}
2008-08-05 01:48:21 -04:00
// Put sticky posts at the top of the posts array
$sticky_posts = get_option ( 'sticky_posts' );
2010-09-07 00:46:08 -04:00
if ( $this -> is_home && $page <= 1 && is_array ( $sticky_posts ) && ! empty ( $sticky_posts ) && ! $q [ 'ignore_sticky_posts' ] ) {
2008-08-05 01:48:21 -04:00
$num_posts = count ( $this -> posts );
$sticky_offset = 0 ;
// Loop over posts and relocate stickies to the front.
for ( $i = 0 ; $i < $num_posts ; $i ++ ) {
if ( in_array ( $this -> posts [ $i ] -> ID , $sticky_posts ) ) {
$sticky_post = $this -> posts [ $i ];
// Remove sticky from current position
array_splice ( $this -> posts , $i , 1 );
// Move to front, after other stickies
array_splice ( $this -> posts , $sticky_offset , 0 , array ( $sticky_post ));
// Increment the sticky offset. The next sticky will be placed at this offset.
$sticky_offset ++ ;
// Remove post from sticky posts array
$offset = array_search ( $sticky_post -> ID , $sticky_posts );
2010-04-18 01:11:05 -04:00
unset ( $sticky_posts [ $offset ] );
2008-08-05 01:48:21 -04:00
}
}
2010-04-24 02:04:05 -04:00
// If any posts have been excluded specifically, Ignore those that are sticky.
if ( ! empty ( $sticky_posts ) && ! empty ( $q [ 'post__not_in' ]) )
$sticky_posts = array_diff ( $sticky_posts , $q [ 'post__not_in' ]);
2008-08-05 01:48:21 -04:00
// Fetch sticky posts that weren't in the query results
2008-08-13 14:21:52 -04:00
if ( ! empty ( $sticky_posts ) ) {
$stickies__in = implode ( ',' , array_map ( 'absint' , $sticky_posts ));
2009-11-05 10:52:01 -05:00
// honor post type(s) if not set to any
$stickies_where = '' ;
if ( 'any' != $post_type && '' != $post_type ) {
if ( is_array ( $post_type ) ) {
$post_types = join ( " ', ' " , $post_type );
} else {
$post_types = $post_type ;
}
$stickies_where = " AND $wpdb->posts .post_type IN (' " . $post_types . " ') " ;
}
2010-04-24 02:04:05 -04:00
2009-11-05 10:52:01 -05:00
$stickies = $wpdb -> get_results ( " SELECT * FROM $wpdb->posts WHERE $wpdb->posts .ID IN ( $stickies__in ) $stickies_where " );
2008-08-13 14:21:52 -04:00
foreach ( $stickies as $sticky_post ) {
2010-04-24 02:04:05 -04:00
// Ignore sticky posts the current user cannot read or are not published.
2010-05-03 16:26:11 -04:00
if ( 'publish' != $sticky_post -> post_status )
2008-08-13 14:21:52 -04:00
continue ;
2010-02-13 01:08:15 -05:00
array_splice ( $this -> posts , $sticky_offset , 0 , array ( $sticky_post ));
$sticky_offset ++ ;
2008-08-13 14:21:52 -04:00
}
2008-08-05 01:48:21 -04:00
}
}
2008-08-28 18:30:27 -04:00
if ( ! $q [ 'suppress_filters' ] )
2010-03-18 17:55:25 -04:00
$this -> posts = apply_filters_ref_array ( 'the_posts' , array ( $this -> posts , & $this ) );
2006-11-23 10:38:22 -05:00
2009-10-19 17:28:44 -04:00
$this -> post_count = count ( $this -> posts );
// Sanitize before caching so it'll only get done once
2010-05-03 16:19:13 -04:00
for ( $i = 0 ; $i < $this -> post_count ; $i ++ ) {
2009-10-19 17:28:44 -04:00
$this -> posts [ $i ] = sanitize_post ( $this -> posts [ $i ], 'raw' );
}
2010-04-29 16:43:59 -04:00
if ( $q [ 'cache_results' ] )
2010-05-09 20:58:39 -04:00
update_post_caches ( $this -> posts , $post_type , $q [ 'update_post_term_cache' ], $q [ 'update_post_meta_cache' ]);
2006-03-12 20:44:32 -05:00
2010-05-03 16:19:13 -04:00
if ( $this -> post_count > 0 ) {
2006-03-12 20:44:32 -05:00
$this -> post = $this -> posts [ 0 ];
}
return $this -> posts ;
}
2008-09-04 15:19:32 -04:00
/**
2010-03-17 00:39:50 -04:00
* Set up the next post and iterate current post index .
2008-09-04 15:19:32 -04:00
*
* @ since 1.5 . 0
* @ access public
*
* @ return object Next post .
*/
2006-03-12 20:44:32 -05:00
function next_post () {
2006-11-19 02:56:05 -05:00
2006-03-12 20:44:32 -05:00
$this -> current_post ++ ;
$this -> post = $this -> posts [ $this -> current_post ];
return $this -> post ;
}
2008-09-04 15:19:32 -04:00
/**
* Sets up the current post .
*
* Retrieves the next post , sets up the post , sets the 'in the loop'
* property to true .
*
* @ since 1.5 . 0
* @ access public
* @ uses $post
2009-05-19 12:13:50 -04:00
* @ uses do_action_ref_array () Calls 'loop_start' if loop has just started
2008-09-04 15:19:32 -04:00
*/
2006-03-12 20:44:32 -05:00
function the_post () {
global $post ;
$this -> in_the_loop = true ;
2009-05-26 19:57:01 -04:00
if ( $this -> current_post == - 1 ) // loop has just started
2009-05-19 12:13:50 -04:00
do_action_ref_array ( 'loop_start' , array ( & $this ));
2009-05-26 19:57:01 -04:00
$post = $this -> next_post ();
setup_postdata ( $post );
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
* Whether there are more posts available in the loop .
*
* Calls action 'loop_end' , when the loop is complete .
*
* @ since 1.5 . 0
* @ access public
2009-05-19 12:13:50 -04:00
* @ uses do_action_ref_array () Calls 'loop_end' if loop is ended
2008-09-04 15:19:32 -04:00
*
* @ return bool True if posts are available , false if end of loop .
*/
2006-03-12 20:44:32 -05:00
function have_posts () {
2010-05-03 16:19:13 -04:00
if ( $this -> current_post + 1 < $this -> post_count ) {
2006-03-12 20:44:32 -05:00
return true ;
2010-05-03 16:19:13 -04:00
} elseif ( $this -> current_post + 1 == $this -> post_count && $this -> post_count > 0 ) {
2009-05-19 12:13:50 -04:00
do_action_ref_array ( 'loop_end' , array ( & $this ));
2006-03-12 20:44:32 -05:00
// Do some cleaning up after the loop
$this -> rewind_posts ();
}
$this -> in_the_loop = false ;
return false ;
}
2008-09-04 15:19:32 -04:00
/**
* Rewind the posts and reset post index .
*
* @ since 1.5 . 0
* @ access public
*/
2006-03-12 20:44:32 -05:00
function rewind_posts () {
$this -> current_post = - 1 ;
2010-05-03 16:19:13 -04:00
if ( $this -> post_count > 0 ) {
2006-03-12 20:44:32 -05:00
$this -> post = $this -> posts [ 0 ];
}
}
2007-02-27 10:24:54 -05:00
2008-09-04 15:19:32 -04:00
/**
* Iterate current comment index and return comment object .
*
* @ since 2.2 . 0
* @ access public
*
* @ return object Comment object .
*/
2007-02-24 02:33:29 -05:00
function next_comment () {
$this -> current_comment ++ ;
2007-02-27 10:24:54 -05:00
2007-02-24 02:33:29 -05:00
$this -> comment = $this -> comments [ $this -> current_comment ];
return $this -> comment ;
}
2007-02-27 10:24:54 -05:00
2008-09-04 15:19:32 -04:00
/**
* Sets up the current comment .
*
* @ since 2.2 . 0
* @ access public
* @ global object $comment Current comment .
* @ uses do_action () Calls 'comment_loop_start' hook when first comment is processed .
*/
2007-02-24 02:33:29 -05:00
function the_comment () {
global $comment ;
2007-02-27 10:24:54 -05:00
2007-02-24 02:33:29 -05:00
$comment = $this -> next_comment ();
2007-02-27 10:24:54 -05:00
2010-05-03 16:19:13 -04:00
if ( $this -> current_comment == 0 ) {
2007-02-24 02:33:29 -05:00
do_action ( 'comment_loop_start' );
}
}
2007-02-27 10:24:54 -05:00
2008-09-04 15:19:32 -04:00
/**
* Whether there are more comments available .
*
* Automatically rewinds comments when finished .
*
* @ since 2.2 . 0
* @ access public
*
* @ return bool True , if more comments . False , if no more posts .
*/
2007-02-24 02:33:29 -05:00
function have_comments () {
2010-05-03 16:19:13 -04:00
if ( $this -> current_comment + 1 < $this -> comment_count ) {
2007-02-24 02:33:29 -05:00
return true ;
2010-05-03 16:19:13 -04:00
} elseif ( $this -> current_comment + 1 == $this -> comment_count ) {
2007-02-24 02:33:29 -05:00
$this -> rewind_comments ();
}
2007-02-27 10:24:54 -05:00
2007-02-24 02:33:29 -05:00
return false ;
}
2007-02-27 10:24:54 -05:00
2008-09-04 15:19:32 -04:00
/**
* Rewind the comments , resets the comment index and comment to first .
*
* @ since 2.2 . 0
* @ access public
*/
2007-02-24 02:33:29 -05:00
function rewind_comments () {
$this -> current_comment = - 1 ;
2010-05-03 16:19:13 -04:00
if ( $this -> comment_count > 0 ) {
2007-02-24 02:33:29 -05:00
$this -> comment = $this -> comments [ 0 ];
}
}
2006-11-19 02:56:05 -05:00
2008-09-04 15:19:32 -04:00
/**
* Sets up the WordPress query by parsing query string .
*
* @ since 1.5 . 0
* @ access public
*
* @ param string $query URL query string .
* @ return array List of posts .
*/
2006-03-12 20:44:32 -05:00
function & query ( $query ) {
$this -> parse_query ( $query );
return $this -> get_posts ();
}
2008-09-04 15:19:32 -04:00
/**
* Retrieve queried object .
*
* If queried object is not set , then the queried object will be set from
* the category , tag , taxonomy , posts page , single post , page , or author
* query variable . After it is set up , it will be returned .
*
* @ since 1.5 . 0
* @ access public
*
* @ return object
*/
2006-03-12 20:44:32 -05:00
function get_queried_object () {
2010-02-08 17:05:05 -05:00
if ( isset ( $this -> queried_object ) )
2006-03-12 20:44:32 -05:00
return $this -> queried_object ;
$this -> queried_object = NULL ;
$this -> queried_object_id = 0 ;
2010-10-09 06:19:15 -04:00
$tax_query = $this -> get ( 'tax_query' );
if ( ! empty ( $tax_query ) ) {
$query = reset ( $tax_query );
2010-10-17 02:14:58 -04:00
2010-10-09 06:19:15 -04:00
if ( 'term_id' == $query [ 'field' ] )
2010-09-13 12:44:14 -04:00
$term = get_term ( reset ( $query [ 'terms' ] ), $query [ 'taxonomy' ] );
else
$term = get_term_by ( $query [ 'field' ], reset ( $query [ 'terms' ] ), $query [ 'taxonomy' ] );
2010-10-17 02:14:58 -04:00
if ( $term && ! is_wp_error ( $term ) ) {
$this -> queried_object = $term ;
$this -> queried_object_id = $term -> term_id ;
}
2010-02-08 17:05:05 -05:00
} elseif ( $this -> is_posts_page ) {
2010-07-25 03:35:59 -04:00
$page_for_posts = get_option ( 'page_for_posts' );
$this -> queried_object = & get_page ( $page_for_posts );
2007-03-22 20:59:21 -04:00
$this -> queried_object_id = ( int ) $this -> queried_object -> ID ;
2010-03-13 02:47:20 -05:00
} elseif ( $this -> is_single && ! is_null ( $this -> post ) ) {
2006-03-12 20:44:32 -05:00
$this -> queried_object = $this -> post ;
2007-03-22 20:59:21 -04:00
$this -> queried_object_id = ( int ) $this -> post -> ID ;
2010-02-28 07:49:10 -05:00
} elseif ( $this -> is_page && ! is_null ( $this -> post ) ) {
2006-03-12 20:44:32 -05:00
$this -> queried_object = $this -> post ;
2007-03-22 20:59:21 -04:00
$this -> queried_object_id = ( int ) $this -> post -> ID ;
2010-02-08 17:05:05 -05:00
} elseif ( $this -> is_author ) {
2007-03-22 20:59:21 -04:00
$author_id = ( int ) $this -> get ( 'author' );
2006-03-12 20:44:32 -05:00
$author = get_userdata ( $author_id );
$this -> queried_object = $author ;
$this -> queried_object_id = $author_id ;
}
return $this -> queried_object ;
}
2008-09-04 15:19:32 -04:00
/**
* Retrieve ID of the current queried object .
*
* @ since 1.5 . 0
* @ access public
*
* @ return int
*/
2006-03-12 20:44:32 -05:00
function get_queried_object_id () {
$this -> get_queried_object ();
2010-05-03 16:19:13 -04:00
if ( isset ( $this -> queried_object_id ) ) {
2006-03-12 20:44:32 -05:00
return $this -> queried_object_id ;
}
return 0 ;
}
2008-09-04 15:19:32 -04:00
/**
* PHP4 type constructor .
*
* Sets up the WordPress query , if parameter is not empty .
*
* @ since 1.5 . 0
* @ access public
*
* @ param string $query URL query string .
* @ return WP_Query
*/
2010-03-20 22:52:00 -04:00
function WP_Query ( $query = '' ) {
2010-05-03 16:19:13 -04:00
if ( ! empty ( $query ) ) {
2006-03-12 20:44:32 -05:00
$this -> query ( $query );
}
}
2010-08-25 14:05:33 -04:00
/**
* Is the query for an archive page ?
*
* Month , Year , Category , Author , ...
*
2010-10-14 06:39:47 -04:00
* If the $post_types parameter is specified , this function will additionally
2010-10-19 03:48:22 -04:00
* check if the query is for exactly one of the post types specified . If a plugin
2010-10-14 06:39:47 -04:00
* is causing multiple post types to appear in the query , specifying a post type
* will cause this check to return false .
*
2010-08-25 14:05:33 -04:00
* @ since 3.1 . 0
*
2010-10-14 06:39:47 -04:00
* @ param mixed $post_types Optional . Post type or array of post types
2010-08-25 14:05:33 -04:00
* @ return bool
*/
2010-10-14 06:39:47 -04:00
function is_archive ( $post_types ) {
if ( empty ( $post_types ) || ! $this -> is_archive )
return ( bool ) $this -> is_archive ;
if ( ! isset ( $this -> posts [ 0 ] ) )
return false ;
$post = $this -> posts [ 0 ];
return in_array ( $post -> post_type , ( array ) $post_types );
2010-08-25 14:05:33 -04:00
}
2010-10-15 15:44:57 -04:00
/**
* Is the query for a post type archive page ?
*
* @ since 3.1 . 0
*
* @ param mixed $post_types Optional . Post type or array of posts types to check against .
* @ return bool
*/
function is_post_type_archive ( $post_types = '' ) {
if ( empty ( $post_types ) || ! $this -> is_post_type_archive )
return ( bool ) $this -> is_post_type_archive ;
if ( ! isset ( $this -> posts [ 0 ] ) )
return false ;
$post = $this -> posts [ 0 ];
return in_array ( $post -> post_type , ( array ) $post_types );
}
2010-08-25 14:05:33 -04:00
/**
* Is the query for an attachment page ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_attachment () {
return ( bool ) $this -> is_attachment ;
}
/**
* Is the query for an author archive page ?
*
* If the $author parameter is specified , this function will additionally
* check if the query is for one of the authors specified .
*
* @ since 3.1 . 0
*
* @ param mixed $author Optional . User ID , nickname , nicename , or array of User IDs , nicknames , and nicenames
* @ return bool
*/
function is_author ( $author = '' ) {
if ( ! $this -> is_author )
return false ;
if ( empty ( $author ) )
return true ;
$author_obj = $this -> get_queried_object ();
$author = ( array ) $author ;
if ( in_array ( $author_obj -> ID , $author ) )
return true ;
elseif ( in_array ( $author_obj -> nickname , $author ) )
return true ;
elseif ( in_array ( $author_obj -> user_nicename , $author ) )
return true ;
return false ;
}
/**
* Is the query for a category archive page ?
*
* If the $category parameter is specified , this function will additionally
* check if the query is for one of the categories specified .
*
* @ since 3.1 . 0
*
* @ param mixed $category Optional . Category ID , name , slug , or array of Category IDs , names , and slugs .
* @ return bool
*/
function is_category ( $category = '' ) {
if ( ! $this -> is_category )
return false ;
if ( empty ( $category ) )
return true ;
$cat_obj = $this -> get_queried_object ();
$category = ( array ) $category ;
if ( in_array ( $cat_obj -> term_id , $category ) )
return true ;
elseif ( in_array ( $cat_obj -> name , $category ) )
return true ;
elseif ( in_array ( $cat_obj -> slug , $category ) )
return true ;
return false ;
}
/**
* Is the query for a tag archive page ?
*
* If the $tag parameter is specified , this function will additionally
* check if the query is for one of the tags specified .
*
* @ since 3.1 . 0
*
* @ param mixed $slug Optional . Tag slug or array of slugs .
* @ return bool
*/
function is_tag ( $slug = '' ) {
if ( ! $this -> is_tag )
return false ;
if ( empty ( $slug ) )
return true ;
$tag_obj = $this -> get_queried_object ();
$slug = ( array ) $slug ;
if ( in_array ( $tag_obj -> slug , $slug ) )
return true ;
return false ;
}
/**
* Is the query for a taxonomy archive page ?
*
* If the $taxonomy parameter is specified , this function will additionally
* check if the query is for that specific $taxonomy .
*
* If the $term parameter is specified in addition to the $taxonomy parameter ,
* this function will additionally check if the query is for one of the terms
* specified .
*
* @ since 3.1 . 0
*
* @ param mixed $taxonomy Optional . Taxonomy slug or slugs .
* @ param mixed $term . Optional . Term ID , name , slug or array of Term IDs , names , and slugs .
* @ return bool
*/
function is_tax ( $taxonomy = '' , $term = '' ) {
global $wp_taxonomies ;
if ( ! $this -> is_tax )
return false ;
if ( empty ( $taxonomy ) )
return true ;
$queried_object = $this -> get_queried_object ();
$tax_array = array_intersect ( array_keys ( $wp_taxonomies ), ( array ) $taxonomy );
$term_array = ( array ) $term ;
if ( empty ( $term ) ) // Only a Taxonomy provided
return isset ( $queried_object -> taxonomy ) && count ( $tax_array ) && in_array ( $queried_object -> taxonomy , $tax_array );
return isset ( $queried_object -> term_id ) &&
count ( array_intersect (
array ( $queried_object -> term_id , $queried_object -> name , $queried_object -> slug ),
$term_array
) );
}
/**
* Whether the current URL is within the comments popup window .
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_comments_popup () {
return ( bool ) $this -> is_comments_popup ;
}
/**
* Is the query for a date archive ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_date () {
return ( bool ) $this -> is_date ;
}
/**
* Is the query for a day archive ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_day () {
return ( bool ) $this -> is_day ;
}
/**
* Is the query for a feed ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_feed () {
return ( bool ) $this -> is_feed ;
}
/**
* Is the query for a comments feed ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_comment_feed () {
return ( bool ) $this -> is_comment_feed ;
}
/**
* Is the query for the front page of the site ?
*
* This is for what is displayed at your site ' s main URL .
*
* Depends on the site 's "Front page displays" Reading Settings ' show_on_front ' and ' page_on_front ' .
*
* If you set a static page for the front page of your site , this function will return
* true when viewing that page .
*
* Otherwise the same as @ see WP_Query :: is_home ()
*
* @ since 3.1 . 0
* @ uses is_home ()
* @ uses get_option ()
*
* @ return bool True , if front of site .
*/
function is_front_page () {
// most likely case
if ( 'posts' == get_option ( 'show_on_front' ) && $this -> is_home () )
return true ;
elseif ( 'page' == get_option ( 'show_on_front' ) && get_option ( 'page_on_front' ) && $this -> is_page ( get_option ( 'page_on_front' ) ) )
return true ;
else
return false ;
}
/**
* Is the query for the blog homepage ?
*
* This is the page which shows the time based blog content of your site .
*
* Depends on the site 's "Front page displays" Reading Settings ' show_on_front ' and ' page_for_posts ' .
*
* If you set a static page for the front page of your site , this function will return
* true only on the page you set as the " Posts page " .
*
* @ see WP_Query :: is_front_page ()
*
* @ since 3.1 . 0
*
* @ return bool True if blog view homepage .
*/
function is_home () {
return ( bool ) $this -> is_home ;
}
/**
* Is the query for a month archive ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_month () {
return ( bool ) $this -> is_month ;
}
/**
* Is the query for a single Page ?
*
* If the $page parameter is specified , this function will additionally
* check if the query is for one of the Pages specified .
*
* @ see WP_Query :: is_single ()
* @ see WP_Query :: is_singular ()
*
* @ since 3.1 . 0
*
* @ param mixed $page Page ID , title , slug , or array of Page IDs , titles , and slugs .
* @ return bool
*/
function is_page ( $page = '' ) {
if ( ! $this -> is_page )
return false ;
if ( empty ( $page ) )
return true ;
$page_obj = $this -> get_queried_object ();
$page = ( array ) $page ;
if ( in_array ( $page_obj -> ID , $page ) )
return true ;
elseif ( in_array ( $page_obj -> post_title , $page ) )
return true ;
else if ( in_array ( $page_obj -> post_name , $page ) )
return true ;
return false ;
}
/**
* Is the query for paged result and not for the first page ?
*
* @ since 3.1 . 0
*
2010-10-04 13:51:17 -04:00
* @ return bool
2010-08-25 14:05:33 -04:00
*/
function is_paged () {
return ( bool ) $this -> is_paged ;
}
/**
* Is the query for a post or page preview ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_preview () {
return ( bool ) $this -> is_preview ;
}
/**
* Is the query for the robots file ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_robots () {
return ( bool ) $this -> is_robots ;
}
/**
* Is the query for a search ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_search () {
return ( bool ) $this -> is_search ;
}
/**
* Is the query for a single post ?
*
* If the $post parameter is specified , this function will additionally
* check if the query is for one of the Posts specified .
*
* Can also be used for attachments or any other post type except pages .
*
* @ see WP_Query :: is_page ()
* @ see WP_Query :: is_singular ()
*
* @ since 3.1 . 0
*
* @ param mixed $post Post ID , title , slug , or array of Post IDs , titles , and slugs .
* @ return bool
*/
function is_single ( $post = '' ) {
if ( ! $this -> is_single )
return false ;
if ( empty ( $post ) )
return true ;
$post_obj = $this -> get_queried_object ();
$post = ( array ) $post ;
if ( in_array ( $post_obj -> ID , $post ) )
return true ;
elseif ( in_array ( $post_obj -> post_title , $post ) )
return true ;
elseif ( in_array ( $post_obj -> post_name , $post ) )
return true ;
return false ;
}
/**
* Is the query for a single post of any post type ( post , attachment , page , ... ) ?
*
* If the $post_types parameter is specified , this function will additionally
* check if the query is for one of the Posts Types specified .
*
* @ see WP_Query :: is_page ()
* @ see WP_Query :: is_single ()
*
* @ since 3.1 . 0
*
* @ param mixed $post_types Optional . Post Type or array of Post Types
* @ return bool
*/
function is_singular ( $post_types = '' ) {
if ( empty ( $post_types ) || ! $this -> is_singular )
2010-10-14 06:39:47 -04:00
return ( bool ) $this -> is_singular ;
2010-08-25 14:05:33 -04:00
$post_obj = $this -> get_queried_object ();
return in_array ( $post_obj -> post_type , ( array ) $post_types );
}
/**
* Is the query for a specific time ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_time () {
return ( bool ) $this -> is_time ;
}
/**
* Is the query for a trackback endpoint call ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_trackback () {
return ( bool ) $this -> is_trackback ;
}
/**
* Is the query for a specific year ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_year () {
return ( bool ) $this -> is_year ;
}
/**
* Is the query a 404 ( returns no results ) ?
*
* @ since 3.1 . 0
*
* @ return bool
*/
function is_404 () {
return ( bool ) $this -> is_404 ;
}
2006-03-12 20:44:32 -05:00
}
2008-09-04 15:19:32 -04:00
/**
* Redirect old slugs to the correct permalink .
*
* Attempts to find the current slug from the past slugs .
*
* @ since 2.1 . 0
* @ uses $wp_query
* @ uses $wpdb
*
* @ return null If no link is found , null is returned .
*/
2010-03-20 22:52:00 -04:00
function wp_old_slug_redirect () {
2006-11-30 03:48:56 -05:00
global $wp_query ;
if ( is_404 () && '' != $wp_query -> query_vars [ 'name' ] ) :
global $wpdb ;
2010-10-18 07:44:19 -04:00
$query = $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta , $wpdb->posts WHERE ID = post_id AND meta_key = '_wp_old_slug' AND meta_value=%s " , $wp_query -> query_vars [ 'name' ]);
2006-11-30 03:48:56 -05:00
// if year, monthnum, or day have been specified, make our query more precise
// just in case there are multiple identical _wp_old_slug values
if ( '' != $wp_query -> query_vars [ 'year' ] )
2010-10-18 07:44:19 -04:00
$query .= $wpdb -> prepare ( " AND YEAR(post_date) = %d " , $wp_query -> query_vars [ 'year' ]);
2006-11-30 03:48:56 -05:00
if ( '' != $wp_query -> query_vars [ 'monthnum' ] )
2010-10-18 07:44:19 -04:00
$query .= $wpdb -> prepare ( " AND MONTH(post_date) = %d " , $wp_query -> query_vars [ 'monthnum' ]);
2006-11-30 03:48:56 -05:00
if ( '' != $wp_query -> query_vars [ 'day' ] )
2010-10-18 07:44:19 -04:00
$query .= $wpdb -> prepare ( " AND DAYOFMONTH(post_date) = %d " , $wp_query -> query_vars [ 'day' ]);
2006-11-30 03:48:56 -05:00
$id = ( int ) $wpdb -> get_var ( $query );
2010-10-18 07:44:19 -04:00
if ( ! $id )
2006-11-30 03:48:56 -05:00
return ;
$link = get_permalink ( $id );
if ( ! $link )
return ;
wp_redirect ( $link , '301' ); // Permanent redirect
exit ;
endif ;
}
2008-09-04 15:19:32 -04:00
/**
2010-03-17 00:39:50 -04:00
* Set up global post data .
2008-09-04 15:19:32 -04:00
*
* @ since 1.5 . 0
*
* @ param object $post Post data .
2009-05-20 12:05:23 -04:00
* @ uses do_action_ref_array () Calls 'the_post'
2008-09-04 15:19:32 -04:00
* @ return bool True when finished .
*/
2006-06-07 22:22:16 -04:00
function setup_postdata ( $post ) {
2007-12-06 14:49:33 -05:00
global $id , $authordata , $day , $currentmonth , $page , $pages , $multipage , $more , $numpages ;
2006-06-07 22:22:16 -04:00
2007-03-22 20:59:21 -04:00
$id = ( int ) $post -> ID ;
2006-06-07 22:22:16 -04:00
$authordata = get_userdata ( $post -> post_author );
2009-05-13 22:00:32 -04:00
$day = mysql2date ( 'd.m.y' , $post -> post_date , false );
$currentmonth = mysql2date ( 'm' , $post -> post_date , false );
2006-06-07 22:22:16 -04:00
$numpages = 1 ;
$page = get_query_var ( 'page' );
if ( ! $page )
$page = 1 ;
2008-02-08 19:19:48 -05:00
if ( is_single () || is_page () || is_feed () )
2006-06-07 22:22:16 -04:00
$more = 1 ;
$content = $post -> post_content ;
2008-08-27 16:47:01 -04:00
if ( strpos ( $content , '<!--nextpage-->' ) ) {
2006-06-07 22:22:16 -04:00
if ( $page > 1 )
$more = 1 ;
$multipage = 1 ;
$content = str_replace ( " \n <!--nextpage--> \n " , '<!--nextpage-->' , $content );
$content = str_replace ( " \n <!--nextpage--> " , '<!--nextpage-->' , $content );
$content = str_replace ( " <!--nextpage--> \n " , '<!--nextpage-->' , $content );
$pages = explode ( '<!--nextpage-->' , $content );
$numpages = count ( $pages );
} else {
2010-05-19 14:39:48 -04:00
$pages = array ( $post -> post_content );
2006-06-07 22:22:16 -04:00
$multipage = 0 ;
}
2009-05-26 19:57:01 -04:00
do_action_ref_array ( 'the_post' , array ( & $post ));
2009-09-14 10:03:32 -04:00
2006-06-07 22:22:16 -04:00
return true ;
}
2010-05-03 18:22:34 -04:00
?>