2006-03-13 02:44:32 +01:00
< ? php
/*
* The Big Query .
*/
2006-11-19 08:56:05 +01:00
2006-03-13 02:44:32 +01:00
function get_query_var ( $var ) {
global $wp_query ;
return $wp_query -> get ( $var );
}
2007-02-24 08:33:29 +01:00
function set_query_var ( $var , $value ) {
global $wp_query ;
return $wp_query -> set ( $var , $value );
}
2006-03-13 02:44:32 +01:00
function & query_posts ( $query ) {
2006-11-09 07:50:58 +01:00
unset ( $GLOBALS [ 'wp_query' ]);
$GLOBALS [ 'wp_query' ] =& new WP_Query ();
return $GLOBALS [ 'wp_query' ] -> query ( $query );
2006-03-13 02:44:32 +01:00
}
2007-08-21 00:55:43 +02:00
function wp_reset_query () {
unset ( $GLOBALS [ 'wp_query' ]);
$GLOBALS [ 'wp_query' ] =& $GLOBALS [ 'wp_the_query' ];
2008-01-23 19:20:59 +01:00
global $wp_query ;
if ( ! empty ( $wp_query -> post ) ) {
2008-01-30 00:58:41 +01:00
$GLOBALS [ 'post' ] = $wp_query -> post ;
2008-01-23 19:20:59 +01:00
setup_postdata ( $wp_query -> post );
}
2007-08-21 00:55:43 +02:00
}
2006-03-13 02:44:32 +01:00
/*
* Query type checks .
*/
function is_admin () {
2008-02-05 07:47:27 +01:00
if ( defined ( 'WP_ADMIN' ) )
2007-12-19 18:56:16 +01:00
return WP_ADMIN ;
return false ;
2006-03-13 02:44:32 +01:00
}
function is_archive () {
global $wp_query ;
return $wp_query -> is_archive ;
}
function is_attachment () {
global $wp_query ;
return $wp_query -> is_attachment ;
}
function is_author ( $author = '' ) {
global $wp_query ;
if ( ! $wp_query -> is_author )
return false ;
if ( empty ( $author ) )
return true ;
$author_obj = $wp_query -> get_queried_object ();
2008-02-13 20:02:08 +01:00
$author = ( array ) $author ;
if ( in_array ( $author_obj -> ID , $author ) )
2006-03-13 02:44:32 +01:00
return true ;
2008-02-13 20:02:08 +01:00
elseif ( in_array ( $author_obj -> nickname , $author ) )
2006-03-13 02:44:32 +01:00
return true ;
2008-02-13 20:02:08 +01:00
elseif ( in_array ( $author_obj -> user_nicename , $author ) )
2006-03-13 02:44:32 +01:00
return true ;
return false ;
}
function is_category ( $category = '' ) {
global $wp_query ;
if ( ! $wp_query -> is_category )
return false ;
if ( empty ( $category ) )
return true ;
$cat_obj = $wp_query -> get_queried_object ();
2008-02-13 20:02:08 +01:00
$category = ( array ) $category ;
if ( in_array ( $cat_obj -> term_id , $category ) )
2006-03-13 02:44:32 +01:00
return true ;
2008-02-13 20:02:08 +01:00
elseif ( in_array ( $cat_obj -> name , $category ) )
2006-03-13 02:44:32 +01:00
return true ;
2008-02-13 20:02:08 +01:00
elseif ( in_array ( $cat_obj -> slug , $category ) )
2006-03-13 02:44:32 +01:00
return true ;
return false ;
}
2007-03-31 08:16:12 +02:00
function is_tag ( $slug = '' ) {
global $wp_query ;
2008-02-13 20:02:08 +01:00
2007-03-31 08:16:12 +02:00
if ( ! $wp_query -> is_tag )
return false ;
if ( empty ( $slug ) )
return true ;
2007-05-23 05:57:20 +02:00
$tag_obj = $wp_query -> get_queried_object ();
2008-02-13 20:02:08 +01:00
$slug = ( array ) $slug ;
if ( in_array ( $tag_obj -> slug , $slug ) )
2007-03-31 08:16:12 +02:00
return true ;
2008-02-13 20:02:08 +01:00
2007-03-31 08:16:12 +02:00
return false ;
}
2008-03-23 18:02:11 +01:00
function is_tax ( $slug = '' ) {
global $wp_query ;
if ( ! $wp_query -> is_tax )
return false ;
if ( empty ( $slug ) )
return true ;
$term = $wp_query -> get_queried_object ();
$slug = ( array ) $slug ;
if ( in_array ( $term -> slug , $slug ) )
return true ;
return false ;
}
2006-03-13 02:44:32 +01:00
function is_comments_popup () {
global $wp_query ;
return $wp_query -> is_comments_popup ;
}
function is_date () {
global $wp_query ;
return $wp_query -> is_date ;
}
function is_day () {
global $wp_query ;
return $wp_query -> is_day ;
}
function is_feed () {
global $wp_query ;
return $wp_query -> is_feed ;
}
2008-02-02 01:13:34 +01:00
/**
2008-02-06 22:21:22 +01:00
* is_front_page () - Is it the front of the site , whether blog view or a WP Page ?
2008-02-02 01:13:34 +01:00
*
* @ since 2.5
* @ uses is_home
* @ uses get_option
*
* @ return bool True if front of site
*/
2008-02-06 22:21:22 +01:00
function is_front_page () {
2008-02-05 07:47:27 +01:00
// most likely case
if ( 'posts' == get_option ( 'show_on_front' ) && is_home () )
return true ;
elseif ( 'page' == get_option ( 'show_on_front' ) && get_option ( 'page_on_front' ) && is_page ( get_option ( 'page_on_front' )) )
return true ;
else
return false ;
}
2008-02-02 01:13:34 +01:00
/**
* is_home () - Is it the blog view homepage ?
*
* @ since 2.1
* @ global object $wp_query
*
* @ return bool True if blog view homepage
*/
2006-03-13 02:44:32 +01:00
function is_home () {
global $wp_query ;
return $wp_query -> is_home ;
}
function is_month () {
global $wp_query ;
return $wp_query -> is_month ;
}
function is_page ( $page = '' ) {
global $wp_query ;
if ( ! $wp_query -> is_page )
return false ;
if ( empty ( $page ) )
return true ;
$page_obj = $wp_query -> get_queried_object ();
2007-12-17 07:21:43 +01:00
$page = ( array ) $page ;
2008-02-05 07:47:27 +01:00
2008-08-06 22:31:54 +02:00
if ( in_array ( $page_obj -> ID , $page ) )
2006-03-13 02:44:32 +01:00
return true ;
2007-12-17 07:21:43 +01:00
elseif ( in_array ( $page_obj -> post_title , $page ) )
2006-03-13 02:44:32 +01:00
return true ;
2007-12-17 07:21:43 +01:00
else if ( in_array ( $page_obj -> post_name , $page ) )
2006-03-13 02:44:32 +01:00
return true ;
return false ;
}
function is_paged () {
global $wp_query ;
return $wp_query -> is_paged ;
}
function is_plugin_page () {
global $plugin_page ;
if ( isset ( $plugin_page ) )
return true ;
return false ;
}
function is_preview () {
global $wp_query ;
return $wp_query -> is_preview ;
}
2006-05-23 00:06:06 +02:00
function is_robots () {
global $wp_query ;
return $wp_query -> is_robots ;
}
2006-03-13 02:44:32 +01:00
function is_search () {
global $wp_query ;
return $wp_query -> is_search ;
}
function is_single ( $post = '' ) {
global $wp_query ;
if ( ! $wp_query -> is_single )
return false ;
if ( empty ( $post ) )
return true ;
$post_obj = $wp_query -> get_queried_object ();
2008-02-13 20:02:08 +01:00
$post = ( array ) $post ;
if ( in_array ( $post_obj -> ID , $post ) )
2006-03-13 02:44:32 +01:00
return true ;
2008-02-13 20:02:08 +01:00
elseif ( in_array ( $post_obj -> post_title , $post ) )
2006-03-13 02:44:32 +01:00
return true ;
2008-02-13 20:02:08 +01:00
elseif ( in_array ( $post_obj -> post_name , $post ) )
2006-03-13 02:44:32 +01:00
return true ;
return false ;
}
2006-08-30 05:33:39 +02:00
function is_singular () {
global $wp_query ;
2007-02-27 16:24:54 +01:00
return $wp_query -> is_singular ;
2006-08-30 05:33:39 +02:00
}
2006-03-13 02:44:32 +01:00
function is_time () {
global $wp_query ;
return $wp_query -> is_time ;
}
function is_trackback () {
global $wp_query ;
return $wp_query -> is_trackback ;
}
function is_year () {
global $wp_query ;
return $wp_query -> is_year ;
}
function is_404 () {
global $wp_query ;
return $wp_query -> is_404 ;
}
/*
* The Loop . Post loop control .
*/
2006-11-19 08:56:05 +01:00
2006-03-13 02:44:32 +01:00
function have_posts () {
global $wp_query ;
return $wp_query -> have_posts ();
}
function in_the_loop () {
global $wp_query ;
return $wp_query -> in_the_loop ;
}
function rewind_posts () {
global $wp_query ;
return $wp_query -> rewind_posts ();
}
function the_post () {
global $wp_query ;
$wp_query -> the_post ();
}
2007-02-24 08:33:29 +01:00
/*
2007-09-04 01:32:58 +02:00
* Comments loop .
*/
2007-02-24 08:33:29 +01:00
2007-09-04 01:32:58 +02:00
function have_comments () {
global $wp_query ;
return $wp_query -> have_comments ();
}
2007-02-24 08:33:29 +01:00
2007-09-04 01:32:58 +02:00
function the_comment () {
global $wp_query ;
return $wp_query -> the_comment ();
}
2007-02-24 08:33:29 +01:00
2006-03-13 02:44:32 +01:00
/*
* WP_Query
*/
class WP_Query {
var $query ;
2006-10-23 03:34:00 +02:00
var $query_vars = array ();
2006-03-13 02:44:32 +01:00
var $queried_object ;
var $queried_object_id ;
var $request ;
var $posts ;
var $post_count = 0 ;
var $current_post = - 1 ;
var $in_the_loop = false ;
var $post ;
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
var $comments ;
var $comment_count = 0 ;
var $current_comment = - 1 ;
var $comment ;
2006-03-13 02:44:32 +01:00
2006-11-08 22:22:35 +01:00
var $found_posts = 0 ;
var $max_num_pages = 0 ;
2006-03-13 02:44:32 +01:00
var $is_single = false ;
var $is_preview = false ;
var $is_page = false ;
var $is_archive = false ;
var $is_date = false ;
var $is_year = false ;
var $is_month = false ;
var $is_day = false ;
var $is_time = false ;
var $is_author = false ;
var $is_category = false ;
2007-03-31 08:16:12 +02:00
var $is_tag = false ;
2008-03-23 18:02:11 +01:00
var $is_tax = false ;
2006-03-13 02:44:32 +01:00
var $is_search = false ;
var $is_feed = false ;
2007-02-24 08:33:29 +01:00
var $is_comment_feed = false ;
2006-03-13 02:44:32 +01:00
var $is_trackback = false ;
var $is_home = false ;
var $is_404 = false ;
var $is_comments_popup = false ;
var $is_admin = false ;
var $is_attachment = false ;
2006-08-30 05:33:39 +02:00
var $is_singular = false ;
2006-05-23 00:06:06 +02:00
var $is_robots = false ;
2006-07-20 04:05:25 +02:00
var $is_posts_page = false ;
2006-03-13 02:44:32 +01:00
function init_query_flags () {
$this -> is_single = false ;
$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 08:16:12 +02:00
$this -> is_tag = false ;
2008-03-23 18:02:11 +01:00
$this -> is_tax = false ;
2006-03-13 02:44:32 +01:00
$this -> is_search = false ;
$this -> is_feed = false ;
2007-02-24 08:33:29 +01:00
$this -> is_comment_feed = false ;
2006-03-13 02:44:32 +01:00
$this -> is_trackback = false ;
$this -> is_home = false ;
$this -> is_404 = false ;
$this -> is_paged = false ;
$this -> is_admin = false ;
$this -> is_attachment = false ;
2006-08-30 05:33:39 +02:00
$this -> is_singular = false ;
2006-05-23 00:06:06 +02:00
$this -> is_robots = false ;
2006-07-20 04:05:25 +02:00
$this -> is_posts_page = false ;
2006-03-13 02:44:32 +01:00
}
function init () {
unset ( $this -> posts );
unset ( $this -> query );
2006-10-23 03:34:00 +02:00
$this -> query_vars = array ();
2006-03-13 02:44:32 +01:00
unset ( $this -> queried_object );
unset ( $this -> queried_object_id );
$this -> post_count = 0 ;
$this -> current_post = - 1 ;
$this -> in_the_loop = false ;
$this -> init_query_flags ();
}
// Reparse the query vars.
function parse_query_vars () {
$this -> parse_query ( '' );
}
2007-02-27 16:24:54 +01:00
2006-09-21 23:05:38 +02:00
function fill_query_vars ( $array ) {
$keys = array (
'error'
, 'm'
, 'p'
2008-05-03 22:08:32 +02:00
, 'post_parent'
2006-09-21 23:05:38 +02:00
, 'subpost'
, 'subpost_id'
, 'attachment'
, 'attachment_id'
, 'name'
, 'hour'
, 'static'
, 'pagename'
, 'page_id'
, 'second'
, 'minute'
, 'hour'
, 'day'
, 'monthnum'
, 'year'
, 'w'
, 'category_name'
2007-03-31 08:16:12 +02:00
, 'tag'
2008-08-08 19:05:10 +02:00
, 'cat'
2007-09-03 05:24:23 +02:00
, 'tag_id'
2006-09-21 23:05:38 +02:00
, 'author_name'
, 'feed'
, 'tb'
, 'paged'
, 'comments_popup'
2008-05-03 22:08:32 +02:00
, 'meta_key'
, 'meta_value'
2006-09-21 23:05:38 +02:00
, 'preview'
);
foreach ( $keys as $key ) {
if ( ! isset ( $array [ $key ]))
$array [ $key ] = '' ;
}
2007-02-27 16:24:54 +01:00
2008-05-03 22:08:32 +02:00
$array_keys = array ( 'category__in' , 'category__not_in' , 'category__and' , 'post__in' , 'post__not_in' ,
2007-09-03 20:14:05 +02:00
'tag__in' , 'tag__not_in' , 'tag__and' , 'tag_slug__in' , 'tag_slug__and' );
2007-09-04 01:19:20 +02:00
2007-08-16 00:08:51 +02:00
foreach ( $array_keys as $key ) {
if ( ! isset ( $array [ $key ]))
$array [ $key ] = array ();
}
2006-09-21 23:05:38 +02:00
return $array ;
}
2006-03-13 02:44:32 +01:00
// Parse a query string and set query type booleans.
function parse_query ( $query ) {
if ( ! empty ( $query ) || ! isset ( $this -> query ) ) {
$this -> init ();
2006-08-30 06:02:12 +02:00
if ( is_array ( $query ) )
2007-03-09 05:05:28 +01:00
$this -> query_vars = $query ;
2006-08-30 06:02:12 +02:00
else
2007-03-09 05:05:28 +01:00
parse_str ( $query , $this -> query_vars );
2006-03-13 02:44:32 +01:00
$this -> query = $query ;
}
2007-02-27 16:24:54 +01:00
2007-03-09 05:05:28 +01:00
$this -> query_vars = $this -> fill_query_vars ( $this -> query_vars );
$qv = & $this -> query_vars ;
2007-02-27 16:24:54 +01:00
2007-09-05 05:11:04 +02:00
if ( ! empty ( $qv [ 'robots' ]) )
2006-05-23 00:06:06 +02:00
$this -> is_robots = true ;
2006-03-13 02:44:32 +01:00
2008-05-08 07:17:27 +02: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' ]);
2008-04-02 15:15:21 +02:00
$qv [ 'cat' ] = preg_replace ( '|[^0-9,-]|' , '' , $qv [ 'cat' ] ); // comma separated list of positive or negative integers
2008-05-08 07:17:27 +02: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-13 02:44:32 +01: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 07:17:27 +02:00
$qv [ 'attachment_id' ] = absint ( $qv [ 'attachment_id' ]);
2007-06-14 04:25:30 +02:00
2007-03-09 05:05:28 +01:00
if ( ( '' != $qv [ 'attachment' ]) || ! empty ( $qv [ 'attachment_id' ]) ) {
2006-03-13 02:44:32 +01:00
$this -> is_single = true ;
$this -> is_attachment = true ;
2007-03-09 05:05:28 +01:00
} elseif ( '' != $qv [ 'name' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_single = true ;
} elseif ( $qv [ 'p' ] ) {
$this -> is_single = true ;
2007-08-04 18:30:27 +02:00
} elseif ( ( '' !== $qv [ 'hour' ]) && ( '' !== $qv [ 'minute' ]) && ( '' !== $qv [ 'second' ]) && ( '' != $qv [ 'year' ]) && ( '' != $qv [ 'monthnum' ]) && ( '' != $qv [ 'day' ]) ) {
2006-11-19 08:56:05 +01:00
// If year, month, day, hour, minute, and second are set, a single
// post is being queried.
2006-03-13 02:44:32 +01:00
$this -> is_single = true ;
2007-03-09 05:05:28 +01:00
} elseif ( '' != $qv [ 'static' ] || '' != $qv [ 'pagename' ] || ! empty ( $qv [ 'page_id' ]) ) {
2006-03-13 02:44:32 +01:00
$this -> is_page = true ;
$this -> is_single = false ;
2007-03-09 05:05:28 +01:00
} elseif ( ! empty ( $qv [ 's' ]) ) {
2006-03-13 02:44:32 +01:00
$this -> is_search = true ;
} else {
// Look for archive queries. Dates, categories, authors.
2007-08-04 18:30:27 +02:00
if ( '' !== $qv [ 'second' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_time = true ;
$this -> is_date = true ;
}
2007-08-04 18:30:27 +02:00
if ( '' !== $qv [ 'minute' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_time = true ;
$this -> is_date = true ;
}
2007-08-04 18:30:27 +02:00
if ( '' !== $qv [ 'hour' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_time = true ;
$this -> is_date = true ;
}
2007-03-09 05:05:28 +01:00
if ( $qv [ 'day' ] ) {
2006-03-13 02:44:32 +01:00
if ( ! $this -> is_date ) {
$this -> is_day = true ;
$this -> is_date = true ;
}
}
2007-03-09 05:05:28 +01:00
if ( $qv [ 'monthnum' ] ) {
2006-03-13 02:44:32 +01:00
if ( ! $this -> is_date ) {
$this -> is_month = true ;
$this -> is_date = true ;
}
}
2007-03-09 05:05:28 +01:00
if ( $qv [ 'year' ] ) {
2006-03-13 02:44:32 +01:00
if ( ! $this -> is_date ) {
$this -> is_year = true ;
$this -> is_date = true ;
}
}
2007-03-09 05:05:28 +01:00
if ( $qv [ 'm' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_date = true ;
if ( strlen ( $qv [ 'm' ]) > 9 ) {
$this -> is_time = true ;
} else if ( strlen ( $qv [ 'm' ]) > 7 ) {
$this -> is_day = true ;
} else if ( strlen ( $qv [ 'm' ]) > 5 ) {
$this -> is_month = true ;
} else {
$this -> is_year = true ;
}
}
if ( '' != $qv [ 'w' ]) {
$this -> is_date = true ;
}
2007-03-09 05:05:28 +01:00
if ( empty ( $qv [ 'cat' ]) || ( $qv [ 'cat' ] == '0' ) ) {
2006-03-13 02:44:32 +01:00
$this -> is_category = false ;
} else {
2007-03-07 06:29:15 +01:00
if ( strpos ( $qv [ 'cat' ], '-' ) !== false ) {
2006-03-13 02:44:32 +01:00
$this -> is_category = false ;
} else {
$this -> is_category = true ;
}
}
2007-03-09 05:05:28 +01:00
if ( '' != $qv [ 'category_name' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_category = true ;
}
2006-11-19 08:56:05 +01:00
2007-08-16 00:08:51 +02:00
if ( ! is_array ( $qv [ 'category__in' ]) || empty ( $qv [ 'category__in' ]) ) {
$qv [ 'category__in' ] = array ();
} else {
2008-05-08 07:17:27 +02:00
$qv [ 'category__in' ] = array_map ( 'absint' , $qv [ 'category__in' ]);
2007-09-04 01:32:58 +02:00
$this -> is_category = true ;
2007-08-16 00:08:51 +02:00
}
2007-12-20 21:59:53 +01:00
if ( ! is_array ( $qv [ 'category__not_in' ]) || empty ( $qv [ 'category__not_in' ]) ) {
2007-08-16 00:08:51 +02:00
$qv [ 'category__not_in' ] = array ();
} else {
2008-05-08 07:17:27 +02:00
$qv [ 'category__not_in' ] = array_map ( 'absint' , $qv [ 'category__not_in' ]);
2007-08-16 00:08:51 +02:00
}
if ( ! is_array ( $qv [ 'category__and' ]) || empty ( $qv [ 'category__and' ]) ) {
$qv [ 'category__and' ] = array ();
} else {
2008-05-08 07:17:27 +02:00
$qv [ 'category__and' ] = array_map ( 'absint' , $qv [ 'category__and' ]);
2007-09-04 01:32:58 +02:00
$this -> is_category = true ;
2007-08-16 00:08:51 +02:00
}
2007-03-31 08:16:12 +02:00
if ( '' != $qv [ 'tag' ] )
$this -> is_tag = true ;
2008-05-08 07:17:27 +02:00
$qv [ 'tag_id' ] = absint ( $qv [ 'tag_id' ]);
2007-09-03 05:26:57 +02:00
if ( ! empty ( $qv [ 'tag_id' ]) )
2007-09-03 05:24:23 +02:00
$this -> is_tag = true ;
if ( ! is_array ( $qv [ 'tag__in' ]) || empty ( $qv [ 'tag__in' ]) ) {
$qv [ 'tag__in' ] = array ();
} else {
2008-05-08 07:17:27 +02:00
$qv [ 'tag__in' ] = array_map ( 'absint' , $qv [ 'tag__in' ]);
2007-09-04 01:32:58 +02:00
$this -> is_tag = true ;
2007-09-03 05:24:23 +02:00
}
2007-12-20 21:59:53 +01:00
if ( ! is_array ( $qv [ 'tag__not_in' ]) || empty ( $qv [ 'tag__not_in' ]) ) {
2007-09-03 05:24:23 +02:00
$qv [ 'tag__not_in' ] = array ();
} else {
2008-05-08 07:17:27 +02:00
$qv [ 'tag__not_in' ] = array_map ( 'absint' , $qv [ 'tag__not_in' ]);
2007-09-03 05:24:23 +02:00
}
if ( ! is_array ( $qv [ 'tag__and' ]) || empty ( $qv [ 'tag__and' ]) ) {
$qv [ 'tag__and' ] = array ();
} else {
2008-05-08 07:17:27 +02:00
$qv [ 'tag__and' ] = array_map ( 'absint' , $qv [ 'tag__and' ]);
2007-09-04 01:32:58 +02:00
$this -> is_category = true ;
2007-09-03 05:24:23 +02:00
}
2007-09-03 20:14:05 +02:00
if ( ! is_array ( $qv [ 'tag_slug__in' ]) || empty ( $qv [ 'tag_slug__in' ]) ) {
$qv [ 'tag_slug__in' ] = array ();
} else {
$qv [ 'tag_slug__in' ] = array_map ( 'sanitize_title' , $qv [ 'tag_slug__in' ]);
2007-09-04 01:32:58 +02:00
$this -> is_tag = true ;
2007-09-03 20:14:05 +02:00
}
2007-09-11 20:06:52 +02:00
if ( ! is_array ( $qv [ 'tag_slug__and' ]) || empty ( $qv [ 'tag_slug__and' ]) ) {
2007-09-03 20:14:05 +02:00
$qv [ 'tag_slug__and' ] = array ();
} else {
$qv [ 'tag_slug__and' ] = array_map ( 'sanitize_title' , $qv [ 'tag_slug__and' ]);
2007-09-04 01:32:58 +02:00
$this -> is_tag = true ;
2007-09-03 20:14:05 +02:00
}
2008-03-23 18:02:11 +01:00
if ( empty ( $qv [ 'taxonomy' ]) || empty ( $qv [ 'term' ]) ) {
$this -> is_tax = false ;
2008-03-26 07:37:19 +01:00
foreach ( $GLOBALS [ 'wp_taxonomies' ] as $t ) {
if ( isset ( $t -> query_var ) && '' != $qv [ $t -> query_var ] ) {
$this -> is_tax = true ;
break ;
}
}
2008-03-23 18:02:11 +01:00
} else {
$this -> is_tax = true ;
}
2007-03-09 05:05:28 +01:00
if ( empty ( $qv [ 'author' ]) || ( $qv [ 'author' ] == '0' ) ) {
2006-03-13 02:44:32 +01:00
$this -> is_author = false ;
} else {
$this -> is_author = true ;
}
2007-03-09 05:05:28 +01:00
if ( '' != $qv [ 'author_name' ] ) {
2006-03-13 02:44:32 +01:00
$this -> is_author = true ;
}
2007-03-31 08:16:12 +02:00
if ( ( $this -> is_date || $this -> is_author || $this -> is_category || $this -> is_tag ) )
2006-03-13 02:44:32 +01:00
$this -> is_archive = true ;
}
2007-03-09 05:05:28 +01:00
if ( '' != $qv [ 'feed' ] )
2006-03-13 02:44:32 +01:00
$this -> is_feed = true ;
2007-03-09 05:05:28 +01:00
if ( '' != $qv [ 'tb' ] )
2006-03-13 02:44:32 +01:00
$this -> is_trackback = true ;
2007-03-09 05:05:28 +01:00
if ( '' != $qv [ 'paged' ] )
2006-03-13 02:44:32 +01:00
$this -> is_paged = true ;
2007-03-09 05:05:28 +01:00
if ( '' != $qv [ 'comments_popup' ] )
2006-03-13 02:44:32 +01:00
$this -> is_comments_popup = true ;
2007-03-09 05:05:28 +01:00
// if we're previewing inside the write screen
if ( '' != $qv [ 'preview' ])
2006-03-13 02:44:32 +01:00
$this -> is_preview = true ;
2007-12-28 02:04:17 +01:00
if ( is_admin () )
2006-03-13 02:44:32 +01:00
$this -> is_admin = true ;
2007-02-24 08:33:29 +01:00
if ( false !== strpos ( $qv [ 'feed' ], 'comments-' ) ) {
2007-03-09 05:05:28 +01:00
$qv [ 'feed' ] = str_replace ( 'comments-' , '' , $qv [ 'feed' ]);
2007-02-24 08:33:29 +01:00
$qv [ 'withcomments' ] = 1 ;
}
2007-02-28 06:22:29 +01: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 08:33:29 +01:00
$this -> is_comment_feed = true ;
2007-03-09 05:05:28 +01: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 ) )
2006-03-13 02:44:32 +01:00
$this -> is_home = true ;
2007-02-28 06:22:29 +01:00
// Correct is_* for page_on_front and page_for_posts
if ( $this -> is_home && ( empty ( $this -> query ) || $qv [ 'preview' ] == 'true' ) && 'page' == get_option ( 'show_on_front' ) && get_option ( 'page_on_front' ) ) {
$this -> is_page = true ;
$this -> is_home = false ;
2007-03-09 05:05:28 +01:00
$qv [ 'page_id' ] = get_option ( 'page_on_front' );
2007-02-28 06:22:29 +01:00
}
if ( '' != $qv [ 'pagename' ] ) {
$this -> queried_object =& get_page_by_path ( $qv [ 'pagename' ]);
if ( ! empty ( $this -> queried_object ) )
2007-03-23 01:59:21 +01:00
$this -> queried_object_id = ( int ) $this -> queried_object -> ID ;
2007-02-28 06:22:29 +01: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-09 05:05:28 +01:00
if ( $qv [ 'page_id' ] ) {
2007-02-28 06:22:29 +01: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 ;
}
}
2007-08-23 18:09:37 +02:00
if ( ! empty ( $qv [ 'post_type' ]) )
$qv [ 'post_type' ] = sanitize_user ( $qv [ 'post_type' ], true );
if ( ! empty ( $qv [ 'post_status' ]) )
2008-07-30 10:16:56 +02:00
$qv [ 'post_status' ] = preg_replace ( '|[^a-z0-9_,-]|' , '' , $qv [ 'post_status' ]);
2007-08-23 18:09:37 +02:00
2007-02-28 06:22:29 +01:00
if ( $this -> is_posts_page && ! $qv [ 'withcomments' ] )
$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
2007-09-05 05:11:04 +02:00
if ( '404' == $qv [ 'error' ])
$this -> set_404 ();
2007-03-09 05:05:28 +01:00
if ( ! empty ( $query ) )
2006-09-12 19:45:23 +02:00
do_action_ref_array ( 'parse_query' , array ( & $this ));
2006-03-13 02:44:32 +01:00
}
function set_404 () {
2006-08-15 07:03:14 +02:00
$is_feed = $this -> is_feed ;
2006-03-13 02:44:32 +01:00
$this -> init_query_flags ();
$this -> is_404 = true ;
2006-08-15 07:03:14 +02:00
$this -> is_feed = $is_feed ;
2006-03-13 02:44:32 +01:00
}
function get ( $query_var ) {
if ( isset ( $this -> query_vars [ $query_var ])) {
return $this -> query_vars [ $query_var ];
}
return '' ;
}
function set ( $query_var , $value ) {
$this -> query_vars [ $query_var ] = $value ;
}
function & get_posts () {
2007-12-06 20:49:33 +01:00
global $wpdb , $user_ID ;
2006-03-13 02:44:32 +01:00
2006-09-12 19:45:23 +02:00
do_action_ref_array ( 'pre_get_posts' , array ( & $this ));
2006-03-13 02:44:32 +01:00
// Shorthand.
$q = & $this -> query_vars ;
2007-02-27 16:24:54 +01:00
2006-09-21 23:05:38 +02:00
$q = $this -> fill_query_vars ( $q );
2006-03-13 02:44:32 +01:00
// First let's clear some variables
2006-05-08 04:16:24 +02:00
$distinct = '' ;
2006-03-13 02:44:32 +01:00
$whichcat = '' ;
$whichauthor = '' ;
2008-02-19 07:13:20 +01:00
$whichmimetype = '' ;
2006-03-13 02:44:32 +01:00
$where = '' ;
$limits = '' ;
$join = '' ;
2006-09-21 23:05:38 +02:00
$search = '' ;
2006-11-08 00:43:59 +01:00
$groupby = '' ;
2008-03-24 21:30:33 +01:00
$post_status_join = false ;
2006-03-13 02:44:32 +01:00
2008-08-05 07:48:21 +02:00
if ( ! isset ( $q [ 'caller_get_posts' ]) )
$q [ 'caller_get_posts' ] = false ;
2007-12-22 09:19:10 +01:00
if ( ! isset ( $q [ 'post_type' ]) ) {
if ( $this -> is_search )
$q [ 'post_type' ] = 'any' ;
else
$q [ 'post_type' ] = 'post' ;
}
2006-03-13 02:44:32 +01:00
$post_type = $q [ 'post_type' ];
if ( ! isset ( $q [ 'posts_per_page' ]) || $q [ 'posts_per_page' ] == 0 )
2006-08-30 23:46:31 +02:00
$q [ 'posts_per_page' ] = get_option ( 'posts_per_page' );
2006-03-13 02:44:32 +01: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' ]) ) {
if ( $q [ 'posts_per_page' ] == - 1 ) {
$q [ 'nopaging' ] = true ;
} else {
$q [ 'nopaging' ] = false ;
}
}
if ( $this -> is_feed ) {
2006-08-30 23:46:31 +02:00
$q [ 'posts_per_page' ] = get_option ( 'posts_per_rss' );
2006-12-07 00:14:37 +01:00
$q [ 'nopaging' ] = false ;
2006-03-13 02:44:32 +01:00
}
2006-08-25 00:33:16 +02: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-13 02:44:32 +01:00
2006-06-22 05:39:23 +02:00
if ( $this -> is_home && ( empty ( $this -> query ) || $q [ 'preview' ] == 'true' ) && ( 'page' == get_option ( 'show_on_front' ) ) && get_option ( 'page_on_front' ) ) {
2006-03-13 02:44:32 +01:00
$this -> is_page = true ;
$this -> is_home = false ;
$q [ 'page_id' ] = get_option ( 'page_on_front' );
}
if ( isset ( $q [ 'page' ])) {
$q [ 'page' ] = trim ( $q [ 'page' ], '/' );
2008-05-08 07:17:27 +02:00
$q [ 'page' ] = absint ( $q [ 'page' ]);
2006-03-13 02:44:32 +01:00
}
// If a month is specified in the querystring, load that month
2007-03-09 05:05:28 +01:00
if ( $q [ 'm' ] ) {
2006-03-13 02:44:32 +01:00
$q [ 'm' ] = '' . preg_replace ( '|[^0-9]|' , '' , $q [ 'm' ]);
2008-03-23 18:02:11 +01:00
$where .= " AND YEAR( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 0 , 4 );
2006-03-13 02:44:32 +01:00
if ( strlen ( $q [ 'm' ]) > 5 )
2008-03-23 18:02:11 +01:00
$where .= " AND MONTH( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 4 , 2 );
2006-03-13 02:44:32 +01:00
if ( strlen ( $q [ 'm' ]) > 7 )
2008-03-23 18:02:11 +01:00
$where .= " AND DAYOFMONTH( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 6 , 2 );
2006-03-13 02:44:32 +01:00
if ( strlen ( $q [ 'm' ]) > 9 )
2008-03-23 18:02:11 +01:00
$where .= " AND HOUR( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 8 , 2 );
2006-03-13 02:44:32 +01:00
if ( strlen ( $q [ 'm' ]) > 11 )
2008-03-23 18:02:11 +01:00
$where .= " AND MINUTE( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 10 , 2 );
2006-03-13 02:44:32 +01:00
if ( strlen ( $q [ 'm' ]) > 13 )
2008-03-23 18:02:11 +01:00
$where .= " AND SECOND( $wpdb->posts .post_date)= " . substr ( $q [ 'm' ], 12 , 2 );
2006-03-13 02:44:32 +01:00
}
2007-08-04 18:30:27 +02:00
if ( '' !== $q [ 'hour' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND HOUR( $wpdb->posts .post_date)=' " . $q [ 'hour' ] . " ' " ;
2006-03-13 02:44:32 +01:00
2007-08-04 18:30:27 +02:00
if ( '' !== $q [ 'minute' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND MINUTE( $wpdb->posts .post_date)=' " . $q [ 'minute' ] . " ' " ;
2006-03-13 02:44:32 +01:00
2007-08-04 18:30:27 +02:00
if ( '' !== $q [ 'second' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND SECOND( $wpdb->posts .post_date)=' " . $q [ 'second' ] . " ' " ;
2006-03-13 02:44:32 +01:00
2007-03-09 05:05:28 +01:00
if ( $q [ 'year' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND YEAR( $wpdb->posts .post_date)=' " . $q [ 'year' ] . " ' " ;
2006-03-13 02:44:32 +01:00
2007-03-09 05:05:28 +01:00
if ( $q [ 'monthnum' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND MONTH( $wpdb->posts .post_date)=' " . $q [ 'monthnum' ] . " ' " ;
2006-03-13 02:44:32 +01:00
2007-03-09 05:05:28 +01:00
if ( $q [ 'day' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND DAYOFMONTH( $wpdb->posts .post_date)=' " . $q [ 'day' ] . " ' " ;
2006-03-13 02:44:32 +01:00
if ( '' != $q [ 'name' ]) {
$q [ 'name' ] = sanitize_title ( $q [ 'name' ]);
2008-03-23 18:02:11 +01:00
$where .= " AND $wpdb->posts .post_name = ' " . $q [ 'name' ] . " ' " ;
2006-03-13 02:44:32 +01:00
} else if ( '' != $q [ 'pagename' ]) {
2007-02-28 06:22:29 +01:00
if ( isset ( $this -> queried_object_id ) )
$reqpage = $this -> queried_object_id ;
else {
$reqpage = get_page_by_path ( $q [ 'pagename' ]);
if ( ! empty ( $reqpage ) )
$reqpage = $reqpage -> ID ;
else
$reqpage = 0 ;
}
2006-03-13 02:44:32 +01:00
2008-05-07 21:57:15 +02:00
$page_for_posts = get_option ( 'page_for_posts' );
if ( ( 'page' != get_option ( 'show_on_front' ) ) || empty ( $page_for_posts ) || ( $reqpage != $page_for_posts ) ) {
2006-03-13 02:44:32 +01: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 19:49:24 +02:00
$where .= " AND ( $wpdb->posts .ID = ' $reqpage ') " ;
2007-12-12 12:45:55 +01:00
$reqpage_obj = get_page ( $reqpage );
if ( 'attachment' == $reqpage_obj -> post_type ) {
$this -> is_attachment = true ;
2008-02-27 22:30:59 +01:00
$this -> is_page = true ;
2007-12-12 12:45:55 +01:00
$q [ 'attachment_id' ] = $reqpage ;
}
2006-03-13 02:44:32 +01:00
}
} elseif ( '' != $q [ 'attachment' ]) {
$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 18:02:11 +01:00
$where .= " AND $wpdb->posts .post_name = ' " . $q [ 'attachment' ] . " ' " ;
2006-03-13 02:44:32 +01:00
}
2007-03-09 05:05:28 +01:00
if ( $q [ 'w' ] )
2008-03-23 18:02:11 +01:00
$where .= " AND WEEK( $wpdb->posts .post_date, 1)=' " . $q [ 'w' ] . " ' " ;
2006-03-13 02:44:32 +01:00
if ( intval ( $q [ 'comments_popup' ]) )
2008-05-08 07:17:27 +02:00
$q [ 'p' ] = absint ( $q [ 'comments_popup' ]);
2006-03-13 02:44:32 +01:00
2007-03-09 05:05:28 +01:00
// If an attachment is requested by number, let it supercede any post number.
if ( $q [ 'attachment_id' ] )
2008-05-08 07:17:27 +02:00
$q [ 'p' ] = absint ( $q [ 'attachment_id' ]);
2006-03-13 02:44:32 +01:00
// If a post number is specified, load that post
2008-05-08 07:17:27 +02: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 22:08:32 +02:00
} elseif ( $q [ 'post__not_in' ] ) {
2008-05-08 07:17:27 +02: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 22:08:32 +02:00
}
2006-03-13 02:44:32 +01:00
2008-05-08 07:17:27 +02:00
if ( $q [ 'post_parent' ] )
$where .= $wpdb -> prepare ( " AND $wpdb->posts .post_parent = %d " , $q [ 'post_parent' ] );
2007-03-09 05:05:28 +01:00
if ( $q [ 'page_id' ] ) {
2007-02-28 06:22:29 +01:00
if ( ( 'page' != get_option ( 'show_on_front' ) ) || ( $q [ 'page_id' ] != get_option ( 'page_for_posts' ) ) ) {
2006-03-13 02:44:32 +01:00
$q [ 'p' ] = $q [ 'page_id' ];
2007-11-03 20:00:33 +01:00
$where = " AND { $wpdb -> posts } .ID = " . $q [ 'page_id' ];
2006-03-13 02:44:32 +01:00
}
}
// If a search pattern is specified, load the posts that match
2007-03-09 05:05:28 +01:00
if ( ! empty ( $q [ 's' ]) ) {
2006-10-27 05:47:43 +02:00
// added slashes screw with quote grouping when done early, so done later
$q [ 's' ] = stripslashes ( $q [ 's' ]);
if ( $q [ 'sentence' ]) {
$q [ 'search_terms' ] = array ( $q [ 's' ]);
2007-12-22 09:19:10 +01:00
} else {
2006-10-27 05:47:43 +02:00
preg_match_all ( '/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/' , $q [ s ], $matches );
$q [ 'search_terms' ] = array_map ( create_function ( '$a' , 'return trim($a, "\\"\'\\n\\r ");' ), $matches [ 0 ]);
}
$n = ( $q [ 'exact' ]) ? '' : '%' ;
$searchand = '' ;
2008-08-06 22:31:54 +02:00
foreach ( ( array ) $q [ 'search_terms' ] as $term ) {
2006-10-27 05:47:43 +02:00
$term = addslashes_gpc ( $term );
2008-03-23 18:02:11 +01:00
$search .= " { $searchand } (( $wpdb->posts .post_title LIKE ' { $n } { $term } { $n } ') OR ( $wpdb->posts .post_content LIKE ' { $n } { $term } { $n } ')) " ;
2006-10-27 05:47:43 +02:00
$searchand = ' AND ' ;
2006-03-13 02:44:32 +01:00
}
2007-12-22 09:19:10 +01:00
$term = $wpdb -> escape ( $q [ 's' ]);
2007-02-22 02:54:28 +01:00
if ( ! $q [ 'sentence' ] && count ( $q [ 'search_terms' ]) > 1 && $q [ 'search_terms' ][ 0 ] != $q [ 's' ] )
2008-03-23 18:02:11 +01:00
$search .= " OR ( $wpdb->posts .post_title LIKE ' { $n } { $term } { $n } ') OR ( $wpdb->posts .post_content LIKE ' { $n } { $term } { $n } ') " ;
2007-02-22 02:54:28 +01:00
if ( ! empty ( $search ) )
$search = " AND ( { $search } ) " ;
2006-03-13 02:44:32 +01:00
}
// Category stuff
2007-03-09 05:05:28 +01:00
if ( empty ( $q [ 'cat' ]) || ( $q [ 'cat' ] == '0' ) ||
2006-03-13 02:44:32 +01:00
// Bypass cat checks if fetching specific posts
2007-03-09 05:05:28 +01:00
$this -> is_singular ) {
$whichcat = '' ;
2006-03-13 02:44:32 +01:00
} else {
$q [ 'cat' ] = '' . urldecode ( $q [ 'cat' ]) . '' ;
$q [ 'cat' ] = addslashes_gpc ( $q [ 'cat' ]);
$cat_array = preg_split ( '/[,\s]+/' , $q [ 'cat' ]);
2008-03-25 18:47:02 +01:00
$q [ 'cat' ] = '' ;
$req_cats = array ();
2008-08-06 22:31:54 +02:00
foreach ( ( array ) $cat_array as $cat ) {
2006-06-01 09:42:46 +02:00
$cat = intval ( $cat );
2008-03-25 18:47:02 +01:00
$req_cats [] = $cat ;
2007-05-29 23:27:49 +02:00
$in = ( $cat > 0 );
$cat = abs ( $cat );
if ( $in ) {
2007-08-16 00:08:51 +02:00
$q [ 'category__in' ][] = $cat ;
$q [ 'category__in' ] = array_merge ( $q [ 'category__in' ], get_term_children ( $cat , 'category' ));
2007-05-29 23:27:49 +02:00
} else {
2007-08-16 00:08:51 +02:00
$q [ 'category__not_in' ][] = $cat ;
$q [ 'category__not_in' ] = array_merge ( $q [ 'category__not_in' ], get_term_children ( $cat , 'category' ));
2007-05-29 23:27:49 +02:00
}
2006-03-13 02:44:32 +01:00
}
2008-03-25 18:47:02 +01:00
$q [ 'cat' ] = implode ( ',' , $req_cats );
2007-08-16 00:08:51 +02:00
}
if ( ! empty ( $q [ 'category__in' ]) || ! empty ( $q [ 'category__not_in' ]) || ! empty ( $q [ 'category__and' ]) ) {
$groupby = " { $wpdb -> posts } .ID " ;
}
if ( ! empty ( $q [ 'category__in' ]) ) {
2007-10-11 19:43:49 +02:00
$join = " INNER JOIN $wpdb->term_relationships ON ( $wpdb->posts .ID = $wpdb->term_relationships .object_id) INNER JOIN $wpdb->term_taxonomy ON ( $wpdb->term_relationships .term_taxonomy_id = $wpdb->term_taxonomy .term_taxonomy_id) " ;
2007-08-16 00:08:51 +02:00
$whichcat .= " AND $wpdb->term_taxonomy .taxonomy = 'category' " ;
$include_cats = " ' " . implode ( " ', ' " , $q [ 'category__in' ]) . " ' " ;
$whichcat .= " AND $wpdb->term_taxonomy .term_id IN ( $include_cats ) " ;
}
if ( ! empty ( $q [ 'category__not_in' ]) ) {
$ids = get_objects_in_term ( $q [ 'category__not_in' ], 'category' );
2008-02-05 07:47:27 +01:00
if ( is_wp_error ( $ids ) )
2007-09-18 18:32:22 +02:00
return $ids ;
2007-08-16 00:08:51 +02:00
if ( is_array ( $ids ) && count ( $ids > 0 ) ) {
$out_posts = " ' " . implode ( " ', ' " , $ids ) . " ' " ;
$whichcat .= " AND $wpdb->posts .ID NOT IN ( $out_posts ) " ;
2007-05-29 23:27:49 +02:00
}
2007-08-16 00:08:51 +02:00
}
2007-05-29 23:27:49 +02:00
2006-08-30 18:40:17 +02:00
// Category stuff for nice URLs
2008-03-26 21:17:31 +01:00
if ( '' != $q [ 'category_name' ] && ! $this -> is_singular ) {
2006-03-13 02:44:32 +01:00
$reqcat = get_category_by_path ( $q [ 'category_name' ]);
$q [ 'category_name' ] = str_replace ( '%2F' , '/' , urlencode ( urldecode ( $q [ 'category_name' ])));
$cat_paths = '/' . trim ( $q [ 'category_name' ], '/' );
$q [ 'category_name' ] = sanitize_title ( basename ( $cat_paths ));
$cat_paths = '/' . trim ( urldecode ( $q [ 'category_name' ]), '/' );
$q [ 'category_name' ] = sanitize_title ( basename ( $cat_paths ));
$cat_paths = explode ( '/' , $cat_paths );
2006-12-09 07:35:22 +01:00
$cat_path = '' ;
foreach ( ( array ) $cat_paths as $pathdir )
$cat_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title ( $pathdir );
2006-03-13 02:44:32 +01:00
//if we don't match the entire hierarchy fallback on just matching the nicename
if ( empty ( $reqcat ) )
$reqcat = get_category_by_path ( $q [ 'category_name' ], false );
if ( ! empty ( $reqcat ) )
2007-05-23 20:59:12 +02:00
$reqcat = $reqcat -> term_id ;
2006-03-13 02:44:32 +01:00
else
$reqcat = 0 ;
$q [ 'cat' ] = $reqcat ;
2006-11-19 08:56:05 +01:00
2007-10-11 19:43:49 +02:00
$join = " INNER JOIN $wpdb->term_relationships ON ( $wpdb->posts .ID = $wpdb->term_relationships .object_id) INNER JOIN $wpdb->term_taxonomy ON ( $wpdb->term_relationships .term_taxonomy_id = $wpdb->term_taxonomy .term_taxonomy_id) " ;
2007-05-23 20:59:12 +02:00
$whichcat = " AND $wpdb->term_taxonomy .taxonomy = 'category' " ;
2007-06-06 18:13:12 +02:00
$in_cats = array ( $q [ 'cat' ]);
$in_cats = array_merge ( $in_cats , get_term_children ( $q [ 'cat' ], 'category' ));
$in_cats = " ' " . implode ( " ', ' " , $in_cats ) . " ' " ;
$whichcat .= " AND $wpdb->term_taxonomy .term_id IN ( $in_cats ) " ;
2006-11-08 00:43:59 +01:00
$groupby = " { $wpdb -> posts } .ID " ;
2006-03-13 02:44:32 +01:00
}
2007-09-03 05:24:23 +02:00
// Tags
if ( '' != $q [ 'tag' ] ) {
2007-09-03 20:14:05 +02:00
if ( strpos ( $q [ 'tag' ], ',' ) !== false ) {
$tags = preg_split ( '/[,\s]+/' , $q [ 'tag' ]);
foreach ( ( array ) $tags as $tag ) {
$tag = sanitize_term_field ( 'slug' , $tag , 0 , 'post_tag' , 'db' );
$q [ 'tag_slug__in' ][] = $tag ;
}
} else if ( preg_match ( '/[+\s]+/' , $q [ 'tag' ]) ) {
$tags = preg_split ( '/[+\s]+/' , $q [ 'tag' ]);
foreach ( ( array ) $tags as $tag ) {
$tag = sanitize_term_field ( 'slug' , $tag , 0 , 'post_tag' , 'db' );
$q [ 'tag_slug__and' ][] = $tag ;
}
} else {
$q [ 'tag' ] = sanitize_term_field ( 'slug' , $q [ 'tag' ], 0 , 'post_tag' , 'db' );
2007-10-13 20:53:28 +02:00
$q [ 'tag_slug__in' ][] = $q [ 'tag' ];
2007-09-03 20:14:05 +02:00
}
2007-09-03 05:24:23 +02:00
}
2007-09-03 20:14:05 +02:00
if ( ! empty ( $q [ 'tag__in' ]) || ! empty ( $q [ 'tag__not_in' ]) || ! empty ( $q [ 'tag__and' ]) ||
! empty ( $q [ 'tag_slug__in' ]) || ! empty ( $q [ 'tag_slug__and' ]) ) {
2007-09-03 05:24:23 +02:00
$groupby = " { $wpdb -> posts } .ID " ;
}
if ( ! empty ( $q [ 'tag__in' ]) ) {
2007-10-11 19:43:49 +02:00
$join = " INNER JOIN $wpdb->term_relationships ON ( $wpdb->posts .ID = $wpdb->term_relationships .object_id) INNER JOIN $wpdb->term_taxonomy ON ( $wpdb->term_relationships .term_taxonomy_id = $wpdb->term_taxonomy .term_taxonomy_id) " ;
2007-09-03 05:24:23 +02:00
$whichcat .= " AND $wpdb->term_taxonomy .taxonomy = 'post_tag' " ;
$include_tags = " ' " . implode ( " ', ' " , $q [ 'tag__in' ]) . " ' " ;
$whichcat .= " AND $wpdb->term_taxonomy .term_id IN ( $include_tags ) " ;
2007-09-11 20:06:52 +02:00
$reqtag = is_term ( $q [ 'tag__in' ][ 0 ], 'post_tag' );
if ( ! empty ( $reqtag ) )
$q [ 'tag_id' ] = $reqtag [ 'term_id' ];
2007-09-03 05:24:23 +02:00
}
2007-09-03 20:14:05 +02:00
if ( ! empty ( $q [ 'tag_slug__in' ]) ) {
2007-10-11 19:43:49 +02:00
$join = " INNER JOIN $wpdb->term_relationships ON ( $wpdb->posts .ID = $wpdb->term_relationships .object_id) INNER JOIN $wpdb->term_taxonomy ON ( $wpdb->term_relationships .term_taxonomy_id = $wpdb->term_taxonomy .term_taxonomy_id) INNER JOIN $wpdb->terms ON ( $wpdb->term_taxonomy .term_id = $wpdb->terms .term_id) " ;
2007-09-03 20:14:05 +02:00
$whichcat .= " AND $wpdb->term_taxonomy .taxonomy = 'post_tag' " ;
$include_tags = " ' " . implode ( " ', ' " , $q [ 'tag_slug__in' ]) . " ' " ;
$whichcat .= " AND $wpdb->terms .slug IN ( $include_tags ) " ;
2008-08-05 23:07:59 +02:00
$reqtag = get_term_by ( 'slug' , $q [ 'tag_slug__in' ][ 0 ], 'post_tag' );
2007-09-11 20:06:52 +02:00
if ( ! empty ( $reqtag ) )
2008-08-05 23:07:59 +02:00
$q [ 'tag_id' ] = $reqtag -> term_id ;
2007-09-03 20:14:05 +02:00
}
2007-09-03 05:24:23 +02:00
if ( ! empty ( $q [ 'tag__not_in' ]) ) {
$ids = get_objects_in_term ( $q [ 'tag__not_in' ], 'post_tag' );
if ( is_array ( $ids ) && count ( $ids > 0 ) ) {
$out_posts = " ' " . implode ( " ', ' " , $ids ) . " ' " ;
$whichcat .= " AND $wpdb->posts .ID NOT IN ( $out_posts ) " ;
}
}
2007-10-04 20:10:03 +02:00
// Tag and slug intersections.
$intersections = array ( 'category__and' => 'category' , 'tag__and' => 'post_tag' , 'tag_slug__and' => 'post_tag' );
foreach ( $intersections as $item => $taxonomy ) {
if ( empty ( $q [ $item ]) ) continue ;
if ( $item != 'category__and' ) {
$reqtag = is_term ( $q [ $item ][ 0 ], 'post_tag' );
if ( ! empty ( $reqtag ) )
$q [ 'tag_id' ] = $reqtag [ 'term_id' ];
2007-09-11 20:06:52 +02:00
}
2007-10-04 20:10:03 +02:00
$taxonomy_field = $item == 'tag_slug__and' ? 'slug' : 'term_id' ;
$q [ $item ] = array_unique ( $q [ $item ]);
2007-10-11 19:43:49 +02:00
$tsql = " SELECT p.ID FROM $wpdb->posts p INNER JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id) INNER JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN $wpdb->terms t ON (tt.term_id = t.term_id) " ;
2007-10-05 18:27:48 +02:00
$tsql .= " WHERE tt.taxonomy = ' $taxonomy ' AND t. $taxonomy_field IN (' " . implode ( " ', ' " , $q [ $item ]) . " ') " ;
$tsql .= " GROUP BY p.ID HAVING count(p.ID) = " . count ( $q [ $item ]);
2007-10-04 20:10:03 +02:00
$post_ids = $wpdb -> get_col ( $tsql );
if ( count ( $post_ids ) )
$whichcat .= " AND $wpdb->posts .ID IN ( " . implode ( ', ' , $post_ids ) . " ) " ;
else {
$whichcat = " AND 0 = 1 " ;
break ;
2007-09-03 05:24:23 +02:00
}
}
2008-03-23 18:02:11 +01:00
// Taxonomies
if ( $this -> is_tax ) {
2008-03-26 07:37:19 +01:00
if ( '' != $q [ 'taxonomy' ] ) {
$taxonomy = $q [ 'taxonomy' ];
$tt [ $taxonomy ] = $q [ 'term' ];
$terms = get_terms ( $q [ 'taxonomy' ], array ( 'slug' => $q [ 'term' ]));
2008-03-23 18:02:11 +01:00
} else {
2008-03-26 07:37:19 +01:00
foreach ( $GLOBALS [ 'wp_taxonomies' ] as $taxonomy => $t ) {
if ( isset ( $t -> query_var ) && '' != $q [ $t -> query_var ] ) {
$terms = get_terms ( $taxonomy , array ( 'slug' => $q [ $t -> query_var ]));
if ( ! is_wp_error ( $terms ) )
break ;
}
}
}
if ( is_wp_error ( $terms ) || empty ( $terms ) ) {
$whichcat = " AND 0 " ;
} else {
foreach ( $terms as $term )
$term_ids [] = $term -> term_id ;
$post_ids = get_objects_in_term ( $term_ids , $taxonomy );
if ( ! is_wp_error ( $post_ids ) && count ( $post_ids ) ) {
$whichcat .= " AND $wpdb->posts .ID IN ( " . implode ( ', ' , $post_ids ) . " ) " ;
$post_type = 'any' ;
$q [ 'post_status' ] = 'publish' ;
$post_status_join = true ;
} else {
$whichcat = " AND 0 " ;
}
2008-03-23 18:02:11 +01:00
}
}
2006-03-13 02:44:32 +01:00
// Author/user stuff
2007-03-09 05:05:28 +01:00
if ( empty ( $q [ 'author' ]) || ( $q [ 'author' ] == '0' ) ) {
2006-03-13 02:44:32 +01:00
$whichauthor = '' ;
} else {
$q [ 'author' ] = '' . urldecode ( $q [ 'author' ]) . '' ;
$q [ 'author' ] = addslashes_gpc ( $q [ 'author' ]);
2007-03-07 06:29:15 +01:00
if ( strpos ( $q [ 'author' ], '-' ) !== false ) {
2006-03-13 02:44:32 +01:00
$eq = '!=' ;
$andor = 'AND' ;
$q [ 'author' ] = explode ( '-' , $q [ 'author' ]);
2008-05-08 07:17:27 +02:00
$q [ 'author' ] = '' . absint ( $q [ 'author' ][ 1 ]);
2006-03-13 02:44:32 +01:00
} else {
$eq = '=' ;
$andor = 'OR' ;
}
$author_array = preg_split ( '/[,\s]+/' , $q [ 'author' ]);
2008-05-08 07:17:27 +02:00
$whichauthor .= " AND ( $wpdb->posts .post_author " . $eq . ' ' . absint ( $author_array [ 0 ]);
2006-03-13 02:44:32 +01:00
for ( $i = 1 ; $i < ( count ( $author_array )); $i = $i + 1 ) {
2008-05-08 07:17:27 +02:00
$whichauthor .= ' ' . $andor . " $wpdb->posts .post_author " . $eq . ' ' . absint ( $author_array [ $i ]);
2006-03-13 02:44:32 +01:00
}
$whichauthor .= ')' ;
}
2006-08-30 18:40:17 +02:00
// Author stuff for nice URLs
2006-03-13 02:44:32 +01:00
if ( '' != $q [ 'author_name' ]) {
2007-03-07 06:29:15 +01:00
if ( strpos ( $q [ 'author_name' ], '/' ) !== false ) {
2006-03-13 02:44:32 +01:00
$q [ 'author_name' ] = explode ( '/' , $q [ 'author_name' ]);
if ( $q [ 'author_name' ][ count ( $q [ 'author_name' ]) - 1 ]) {
$q [ 'author_name' ] = $q [ 'author_name' ][ count ( $q [ 'author_name' ]) - 1 ]; #no trailing slash
} else {
$q [ 'author_name' ] = $q [ 'author_name' ][ count ( $q [ 'author_name' ]) - 2 ]; #there was a trailling slash
}
}
$q [ 'author_name' ] = sanitize_title ( $q [ 'author_name' ]);
$q [ 'author' ] = $wpdb -> get_var ( " SELECT ID FROM $wpdb->users WHERE user_nicename=' " . $q [ 'author_name' ] . " ' " );
2008-05-08 07:17:27 +02:00
$whichauthor .= " AND ( $wpdb->posts .post_author = " . absint ( $q [ 'author' ]) . ')' ;
2006-03-13 02:44:32 +01:00
}
2008-02-19 07:13:20 +01:00
// MIME-Type stuff for attachment browsing
2008-02-22 18:43:56 +01:00
if ( isset ( $q [ 'post_mime_type' ]) && '' != $q [ 'post_mime_type' ] )
2008-02-19 07:13:20 +01:00
$whichmimetype = wp_post_mime_type_where ( $q [ 'post_mime_type' ]);
$where .= $search . $whichcat . $whichauthor . $whichmimetype ;
2006-03-13 02:44:32 +01:00
2007-03-09 05:05:28 +01:00
if ( empty ( $q [ 'order' ]) || (( strtoupper ( $q [ 'order' ]) != 'ASC' ) && ( strtoupper ( $q [ 'order' ]) != 'DESC' )) )
$q [ 'order' ] = 'DESC' ;
2006-03-13 02:44:32 +01:00
// Order by
2007-03-09 05:05:28 +01:00
if ( empty ( $q [ 'orderby' ]) ) {
2008-03-23 18:02:11 +01:00
$q [ 'orderby' ] = " $wpdb->posts .post_date " . $q [ 'order' ];
2006-03-13 02:44:32 +01:00
} else {
// Used to filter values
2008-02-08 20:50:10 +01:00
$allowed_keys = array ( 'author' , 'date' , 'category' , 'title' , 'modified' , 'menu_order' , 'parent' , 'ID' , 'rand' );
2006-03-13 02:44:32 +01:00
$q [ 'orderby' ] = urldecode ( $q [ 'orderby' ]);
$q [ 'orderby' ] = addslashes_gpc ( $q [ 'orderby' ]);
$orderby_array = explode ( ' ' , $q [ 'orderby' ]);
if ( empty ( $orderby_array ) )
$orderby_array [] = $q [ 'orderby' ];
$q [ 'orderby' ] = '' ;
for ( $i = 0 ; $i < count ( $orderby_array ); $i ++ ) {
// Only allow certain values for safety
$orderby = $orderby_array [ $i ];
2008-02-08 20:50:10 +01:00
switch ( $orderby ) {
case 'menu_order' :
2008-04-15 03:39:33 +02:00
break ;
2008-02-08 20:50:10 +01:00
case 'ID' :
2008-03-23 18:02:11 +01:00
$orderby = " $wpdb->posts .ID " ;
2008-02-08 20:50:10 +01:00
break ;
case 'rand' :
$orderby = 'RAND()' ;
break ;
default :
2008-03-23 18:02:11 +01:00
$orderby = " $wpdb->posts .post_ " . $orderby ;
2008-02-08 20:50:10 +01:00
}
2006-03-13 02:44:32 +01:00
if ( in_array ( $orderby_array [ $i ], $allowed_keys ) )
2007-12-14 07:20:42 +01:00
$q [ 'orderby' ] .= (( $i == 0 ) ? '' : ',' ) . $orderby ;
2006-03-13 02:44:32 +01:00
}
2008-02-22 21:48:28 +01:00
// append ASC or DESC at the end
if ( ! empty ( $q [ 'orderby' ]))
2007-12-14 07:20:42 +01:00
$q [ 'orderby' ] .= " { $q [ 'order' ] } " ;
2008-02-05 07:47:27 +01:00
2006-03-13 02:44:32 +01:00
if ( empty ( $q [ 'orderby' ]) )
2008-03-23 18:02:11 +01:00
$q [ 'orderby' ] = " $wpdb->posts .post_date " . $q [ 'order' ];
2006-03-13 02:44:32 +01:00
}
if ( $this -> is_attachment ) {
2008-03-23 18:02:11 +01:00
$where .= " AND $wpdb->posts .post_type = 'attachment' " ;
2006-03-13 02:44:32 +01:00
} elseif ( $this -> is_page ) {
2008-03-23 18:02:11 +01:00
$where .= " AND $wpdb->posts .post_type = 'page' " ;
2006-03-13 02:44:32 +01:00
} elseif ( $this -> is_single ) {
2008-03-23 18:02:11 +01:00
$where .= " AND $wpdb->posts .post_type = 'post' " ;
2007-12-22 09:19:10 +01:00
} elseif ( 'any' == $post_type ) {
$where .= '' ;
2006-03-13 02:44:32 +01:00
} else {
2008-03-23 18:02:11 +01:00
$where .= " AND $wpdb->posts .post_type = ' $post_type ' " ;
2007-05-28 20:34:06 +02:00
}
if ( isset ( $q [ 'post_status' ]) && '' != $q [ 'post_status' ] ) {
2008-03-23 18:02:11 +01:00
$statuswheres = array ();
2007-05-28 20:34:06 +02:00
$q_status = explode ( ',' , $q [ 'post_status' ]);
$r_status = array ();
2008-02-29 22:49:49 +01:00
$p_status = array ();
2007-05-28 20:34:06 +02:00
if ( in_array ( 'draft' , $q_status ) )
2008-03-23 18:02:11 +01:00
$r_status [] = " $wpdb->posts .post_status = 'draft' " ;
2007-06-14 18:24:28 +02:00
if ( in_array ( 'pending' , $q_status ) )
2008-03-23 18:02:11 +01:00
$r_status [] = " $wpdb->posts .post_status = 'pending' " ;
2007-05-28 20:34:06 +02:00
if ( in_array ( 'future' , $q_status ) )
2008-03-23 18:02:11 +01:00
$r_status [] = " $wpdb->posts .post_status = 'future' " ;
2007-05-28 20:34:06 +02:00
if ( in_array ( 'inherit' , $q_status ) )
2008-03-23 18:02:11 +01:00
$r_status [] = " $wpdb->posts .post_status = 'inherit' " ;
2007-05-28 20:34:06 +02:00
if ( in_array ( 'private' , $q_status ) )
2008-03-23 18:02:11 +01:00
$p_status [] = " $wpdb->posts .post_status = 'private' " ;
2007-05-28 20:34:06 +02:00
if ( in_array ( 'publish' , $q_status ) )
2008-03-23 18:02:11 +01:00
$r_status [] = " $wpdb->posts .post_status = 'publish' " ;
2008-02-29 22:49:49 +01:00
if ( empty ( $q [ 'perm' ] ) || 'readable' != $q [ 'perm' ] ) {
$r_status = array_merge ( $r_status , $p_status );
unset ( $p_status );
}
if ( ! empty ( $r_status ) ) {
if ( ! empty ( $q [ 'perm' ] ) && 'editable' == $q [ 'perm' ] && ! current_user_can ( " edit_others_ { $post_type } s " ) )
2008-03-23 18:02:11 +01:00
$statuswheres [] = " ( $wpdb->posts .post_author = $user_ID " . " AND ( " . join ( ' OR ' , $r_status ) . " )) " ;
2008-02-29 22:49:49 +01:00
else
2008-03-23 18:02:11 +01:00
$statuswheres [] = " ( " . join ( ' OR ' , $r_status ) . " ) " ;
2008-02-29 22:49:49 +01:00
}
if ( ! empty ( $p_status ) ) {
if ( ! empty ( $q [ 'perm' ] ) && 'readable' == $q [ 'perm' ] && ! current_user_can ( " read_private_ { $post_type } s " ) )
2008-03-23 18:02:11 +01:00
$statuswheres [] = " ( $wpdb->posts .post_author = $user_ID " . " AND ( " . join ( ' OR ' , $p_status ) . " )) " ;
2008-02-29 22:49:49 +01:00
else
2008-03-23 18:02:11 +01:00
$statuswheres [] = " ( " . join ( ' OR ' , $p_status ) . " ) " ;
}
if ( $post_status_join ) {
2008-03-26 07:37:19 +01:00
$join .= " LEFT JOIN $wpdb->posts AS p2 ON ( $wpdb->posts .post_parent = p2.ID) " ;
2008-03-23 18:02:11 +01:00
foreach ( $statuswheres as $index => $statuswhere )
$statuswheres [ $index ] = " ( $statuswhere OR ( $wpdb->posts .post_status = 'inherit' AND " . str_replace ( $wpdb -> posts , 'p2' , $statuswhere ) . " )) " ;
2008-02-29 22:49:49 +01:00
}
2008-03-23 18:02:11 +01:00
foreach ( $statuswheres as $statuswhere )
$where .= " AND $statuswhere " ;
2007-05-28 20:34:06 +02:00
} elseif ( ! $this -> is_singular ) {
2008-03-23 18:02:11 +01:00
$where .= " AND ( $wpdb->posts .post_status = 'publish' " ;
2006-03-13 02:44:32 +01:00
2006-06-22 21:44:36 +02:00
if ( is_admin () )
2008-03-23 18:02:11 +01:00
$where .= " OR $wpdb->posts .post_status = 'future' OR $wpdb->posts .post_status = 'draft' OR $wpdb->posts .post_status = 'pending' " ;
2007-06-14 04:25:30 +02:00
2007-05-28 22:39:24 +02:00
if ( is_user_logged_in () ) {
2008-03-23 18:02:11 +01:00
$where .= current_user_can ( " read_private_ { $post_type } s " ) ? " OR $wpdb->posts .post_status = 'private' " : " OR $wpdb->posts .post_author = $user_ID AND $wpdb->posts .post_status = 'private' " ;
2007-05-28 22:39:24 +02:00
}
2006-05-12 01:13:35 +02:00
2007-05-28 20:34:06 +02:00
$where .= ')' ;
2006-03-13 02:44:32 +01:00
}
2008-05-03 22:08:32 +02:00
// postmeta queries
if ( ! empty ( $q [ 'meta_key' ]) || ! empty ( $q [ 'meta_value' ]) )
$join .= " LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts .ID = $wpdb->postmeta .post_id) " ;
if ( ! empty ( $q [ 'meta_key' ]) )
$where .= $wpdb -> prepare ( " AND $wpdb->postmeta .meta_key = %s " , $q [ 'meta_key' ]);
if ( ! empty ( $q [ 'meta_value' ]) )
$where .= $wpdb -> prepare ( " AND $wpdb->postmeta .meta_value = %s " , $q [ 'meta_value' ]);
2006-03-13 02:44:32 +01:00
// Apply filters on where and join prior to paging so that any
// manipulations to them are reflected in the paging by day queries.
$where = apply_filters ( 'posts_where' , $where );
$join = apply_filters ( 'posts_join' , $join );
// Paging
2007-03-09 05:05:28 +01:00
if ( empty ( $q [ 'nopaging' ]) && ! $this -> is_singular ) {
2008-01-29 19:48:38 +01:00
$page = absint ( $q [ 'paged' ]);
2006-03-13 02:44:32 +01:00
if ( empty ( $page )) {
$page = 1 ;
}
2006-11-08 22:22:35 +01:00
if ( empty ( $q [ 'offset' ]) ) {
$pgstrt = '' ;
2008-05-08 07:17:27 +02:00
$pgstrt = ( $page - 1 ) * $q [ 'posts_per_page' ] . ', ' ;
2006-11-08 22:22:35 +01:00
$limits = 'LIMIT ' . $pgstrt . $q [ 'posts_per_page' ];
} else { // we're ignoring $page and using 'offset'
2008-01-29 19:48:38 +01:00
$q [ 'offset' ] = absint ( $q [ 'offset' ]);
2006-11-08 22:22:35 +01:00
$pgstrt = $q [ 'offset' ] . ', ' ;
$limits = 'LIMIT ' . $pgstrt . $q [ 'posts_per_page' ];
2006-03-13 02:44:32 +01:00
}
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
// Comments feeds
if ( $this -> is_comment_feed && ( $this -> is_archive || $this -> is_search || ! $this -> is_singular ) ) {
if ( $this -> is_archive || $this -> is_search ) {
$cjoin = " LEFT JOIN $wpdb->posts ON ( $wpdb->comments .comment_post_ID = $wpdb->posts .ID) $join " ;
$cwhere = " WHERE comment_approved = '1' $where " ;
$cgroupby = " GROUP BY $wpdb->comments .comment_id " ;
} else { // Other non singular e.g. front
$cjoin = " LEFT JOIN $wpdb->posts ON ( $wpdb->comments .comment_post_ID = $wpdb->posts .ID ) " ;
$cwhere = " WHERE post_status = 'publish' AND comment_approved = '1' " ;
$cgroupby = '' ;
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
$cjoin = apply_filters ( 'comment_feed_join' , $cjoin );
$cwhere = apply_filters ( 'comment_feed_where' , $cwhere );
$cgroupby = apply_filters ( 'comment_feed_groupby' , $cgroupby );
2007-02-27 16:24:54 +01:00
2007-04-19 04:53:19 +02:00
$this -> comments = ( array ) $wpdb -> get_results ( " SELECT $distinct $wpdb->comments .* FROM $wpdb->comments $cjoin $cwhere $cgroupby ORDER BY comment_date_gmt DESC LIMIT " . get_option ( 'posts_per_rss' ));
2007-02-24 08:33:29 +01:00
$this -> comment_count = count ( $this -> comments );
$post_ids = array ();
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
foreach ( $this -> comments as $comment )
$post_ids [] = ( int ) $comment -> comment_post_ID ;
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
$post_ids = join ( ',' , $post_ids );
$join = '' ;
if ( $post_ids )
$where = " AND $wpdb->posts .ID IN ( $post_ids ) " ;
else
$where = " AND 0 " ;
}
2006-03-13 02:44:32 +01:00
// Apply post-paging filters on where and join. Only plugins that
2007-09-04 01:32:58 +02:00
// manipulate paging queries should use these hooks.
2007-08-22 20:03:26 +02:00
2006-03-13 02:44:32 +01:00
$where = apply_filters ( 'posts_where_paged' , $where );
$groupby = apply_filters ( 'posts_groupby' , $groupby );
$join = apply_filters ( 'posts_join_paged' , $join );
2006-05-08 04:16:24 +02:00
$orderby = apply_filters ( 'posts_orderby' , $q [ 'orderby' ]);
$distinct = apply_filters ( 'posts_distinct' , $distinct );
$fields = apply_filters ( 'posts_fields' , " $wpdb->posts .* " );
2006-12-01 11:15:15 +01:00
$limits = apply_filters ( 'post_limits' , $limits );
2007-11-18 20:36:30 +01: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.
$where = apply_filters ( 'posts_where_request' , $where );
$groupby = apply_filters ( 'posts_groupby_request' , $groupby );
$join = apply_filters ( 'posts_join_request' , $join );
$orderby = apply_filters ( 'posts_orderby_request' , $orderby );
$distinct = apply_filters ( 'posts_distinct_request' , $distinct );
$fields = apply_filters ( 'posts_fields_request' , $fields );
$limits = apply_filters ( 'post_limits_request' , $limits );
if ( ! empty ( $groupby ) )
$groupby = 'GROUP BY ' . $groupby ;
if ( ! empty ( $orderby ) )
$orderby = 'ORDER BY ' . $orderby ;
2006-11-08 10:13:11 +01:00
$found_rows = '' ;
if ( ! empty ( $limits ) )
$found_rows = 'SQL_CALC_FOUND_ROWS' ;
2006-12-01 11:15:15 +01:00
2007-08-22 20:03:26 +02:00
$request = " SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits " ;
2006-03-13 02:44:32 +01:00
$this -> request = apply_filters ( 'posts_request' , $request );
$this -> posts = $wpdb -> get_results ( $this -> request );
2007-08-22 20:03:26 +02:00
// Raw results filter. Prior to status checks.
$this -> posts = apply_filters ( 'posts_results' , $this -> posts );
2007-02-24 08:33:29 +01:00
2008-01-29 20:01:39 +01:00
if ( ! empty ( $this -> posts ) && $this -> is_comment_feed && $this -> is_singular ) {
2007-02-24 08:33:29 +01:00
$cjoin = apply_filters ( 'comment_feed_join' , '' );
2008-01-29 20:01:39 +01:00
$cwhere = apply_filters ( 'comment_feed_where' , " WHERE comment_post_ID = ' { $this -> posts [ 0 ] -> ID } ' AND comment_approved = '1' " );
2007-04-19 04:53:19 +02:00
$comments_request = " SELECT $wpdb->comments .* FROM $wpdb->comments $cjoin $cwhere ORDER BY comment_date_gmt DESC LIMIT " . get_option ( 'posts_per_rss' );
2007-02-24 08:33:29 +01:00
$this -> comments = $wpdb -> get_results ( $comments_request );
$this -> comment_count = count ( $this -> comments );
}
2007-02-27 16:24:54 +01:00
2006-11-08 10:13:11 +01:00
if ( ! empty ( $limits ) ) {
2006-12-01 11:15:15 +01:00
$found_posts_query = apply_filters ( 'found_posts_query' , 'SELECT FOUND_ROWS()' );
$this -> found_posts = $wpdb -> get_var ( $found_posts_query );
$this -> found_posts = apply_filters ( 'found_posts' , $this -> found_posts );
2006-11-19 01:58:15 +01:00
$this -> max_num_pages = ceil ( $this -> found_posts / $q [ 'posts_per_page' ]);
2006-11-08 10:13:11 +01:00
}
2007-02-27 16:24:54 +01:00
2006-03-13 02:44:32 +01: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 ]);
//$type = get_post_type($this->posts[0]);
if ( ( 'publish' != $status ) ) {
if ( ! is_user_logged_in () ) {
// User must be logged in to view unpublished posts.
$this -> posts = array ();
} else {
2007-06-14 18:24:28 +02:00
if ( in_array ( $status , array ( 'draft' , 'pending' )) ) {
2006-03-13 02:44:32 +01:00
// User must have edit permissions on the draft to preview.
if ( ! current_user_can ( 'edit_post' , $this -> posts [ 0 ] -> ID )) {
$this -> posts = array ();
} else {
$this -> is_preview = true ;
$this -> posts [ 0 ] -> post_date = current_time ( 'mysql' );
}
} else if ( 'future' == $status ) {
$this -> is_preview = true ;
if ( ! current_user_can ( 'edit_post' , $this -> posts [ 0 ] -> ID )) {
$this -> posts = array ( );
}
} else {
if ( ! current_user_can ( 'read_post' , $this -> posts [ 0 ] -> ID ))
$this -> posts = array ();
}
}
}
}
2008-08-05 07:48:21 +02:00
// Put sticky posts at the top of the posts array
$sticky_posts = get_option ( 'sticky_posts' );
if ( $this -> is_home && $page <= 1 && ! empty ( $sticky_posts ) && ! $q [ 'caller_get_posts' ] ) {
$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 );
array_splice ( $sticky_posts , $offset , 1 );
}
}
// Fetch sticky posts that weren't in the query results
$stickies__in = implode ( ',' , array_map ( 'absint' , $sticky_posts ));
$stickies = $wpdb -> get_results ( " SELECT * FROM $wpdb->posts WHERE $wpdb->posts .ID IN ( $stickies__in ) " );
// TODO Make sure post is published or viewable by the current user
foreach ( $stickies as $sticky_post ) {
if ( 'publish' != $sticky_post -> post_status )
continue ;
array_splice ( $this -> posts , $sticky_offset , 0 , array ( $sticky_post ));
$sticky_offset ++ ;
}
}
2006-11-23 16:38:22 +01:00
$this -> posts = apply_filters ( 'the_posts' , $this -> posts );
2006-03-13 02:44:32 +01:00
update_post_caches ( $this -> posts );
$this -> post_count = count ( $this -> posts );
if ( $this -> post_count > 0 ) {
$this -> post = $this -> posts [ 0 ];
}
return $this -> posts ;
}
function next_post () {
2006-11-19 08:56:05 +01:00
2006-03-13 02:44:32 +01:00
$this -> current_post ++ ;
$this -> post = $this -> posts [ $this -> current_post ];
return $this -> post ;
}
function the_post () {
global $post ;
$this -> in_the_loop = true ;
$post = $this -> next_post ();
setup_postdata ( $post );
if ( $this -> current_post == 0 ) // loop has just started
do_action ( 'loop_start' );
}
function have_posts () {
if ( $this -> current_post + 1 < $this -> post_count ) {
return true ;
2008-06-24 21:58:54 +02:00
} elseif ( $this -> current_post + 1 == $this -> post_count && $this -> post_count > 0 ) {
2006-03-13 02:44:32 +01:00
do_action ( 'loop_end' );
// Do some cleaning up after the loop
$this -> rewind_posts ();
}
$this -> in_the_loop = false ;
return false ;
}
function rewind_posts () {
$this -> current_post = - 1 ;
if ( $this -> post_count > 0 ) {
$this -> post = $this -> posts [ 0 ];
}
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
function next_comment () {
$this -> current_comment ++ ;
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
$this -> comment = $this -> comments [ $this -> current_comment ];
return $this -> comment ;
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
function the_comment () {
global $comment ;
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
$comment = $this -> next_comment ();
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
if ( $this -> current_comment == 0 ) {
do_action ( 'comment_loop_start' );
}
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
function have_comments () {
if ( $this -> current_comment + 1 < $this -> comment_count ) {
return true ;
} elseif ( $this -> current_comment + 1 == $this -> comment_count ) {
$this -> rewind_comments ();
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
return false ;
}
2007-02-27 16:24:54 +01:00
2007-02-24 08:33:29 +01:00
function rewind_comments () {
$this -> current_comment = - 1 ;
if ( $this -> comment_count > 0 ) {
$this -> comment = $this -> comments [ 0 ];
}
}
2006-11-19 08:56:05 +01:00
2006-03-13 02:44:32 +01:00
function & query ( $query ) {
$this -> parse_query ( $query );
return $this -> get_posts ();
}
function get_queried_object () {
if ( isset ( $this -> queried_object )) {
return $this -> queried_object ;
}
$this -> queried_object = NULL ;
$this -> queried_object_id = 0 ;
if ( $this -> is_category ) {
$cat = $this -> get ( 'cat' );
$category = & get_category ( $cat );
$this -> queried_object = & $category ;
2007-03-23 01:59:21 +01:00
$this -> queried_object_id = ( int ) $cat ;
2007-08-21 20:39:45 +02:00
} else if ( $this -> is_tag ) {
$tag_id = $this -> get ( 'tag_id' );
$tag = & get_term ( $tag_id , 'post_tag' );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $tag ) )
return $tag ;
2007-08-21 20:39:45 +02:00
$this -> queried_object = & $tag ;
$this -> queried_object_id = ( int ) $tag_id ;
2008-03-23 18:02:11 +01:00
} else if ( $this -> is_tax ) {
$tax = $this -> get ( 'taxonomy' );
$slug = $this -> get ( 'term' );
$term = & get_terms ( $tax , array ( 'slug' => $slug ));
2008-05-16 05:57:09 +02:00
if ( is_wp_error ( $term ) || empty ( $term ) )
2008-03-23 18:02:11 +01:00
return $term ;
2008-05-16 05:57:09 +02:00
$term = $term [ 0 ];
2008-03-23 18:02:11 +01:00
$this -> queried_object = $term ;
$this -> queried_object_id = $term -> term_id ;
2006-07-20 04:05:25 +02:00
} else if ( $this -> is_posts_page ) {
$this -> queried_object = & get_page ( get_option ( 'page_for_posts' ));
2007-03-23 01:59:21 +01:00
$this -> queried_object_id = ( int ) $this -> queried_object -> ID ;
2006-03-13 02:44:32 +01:00
} else if ( $this -> is_single ) {
$this -> queried_object = $this -> post ;
2007-03-23 01:59:21 +01:00
$this -> queried_object_id = ( int ) $this -> post -> ID ;
2006-03-13 02:44:32 +01:00
} else if ( $this -> is_page ) {
$this -> queried_object = $this -> post ;
2007-03-23 01:59:21 +01:00
$this -> queried_object_id = ( int ) $this -> post -> ID ;
2006-03-13 02:44:32 +01:00
} else if ( $this -> is_author ) {
2007-03-23 01:59:21 +01:00
$author_id = ( int ) $this -> get ( 'author' );
2006-03-13 02:44:32 +01:00
$author = get_userdata ( $author_id );
$this -> queried_object = $author ;
$this -> queried_object_id = $author_id ;
}
return $this -> queried_object ;
}
function get_queried_object_id () {
$this -> get_queried_object ();
if ( isset ( $this -> queried_object_id )) {
return $this -> queried_object_id ;
}
return 0 ;
}
function WP_Query ( $query = '' ) {
if ( ! empty ( $query )) {
$this -> query ( $query );
}
}
}
2006-11-30 09:48:56 +01:00
// Redirect old slugs
function wp_old_slug_redirect () {
global $wp_query ;
if ( is_404 () && '' != $wp_query -> query_vars [ 'name' ] ) :
global $wpdb ;
$query = " SELECT post_id FROM $wpdb->postmeta , $wpdb->posts WHERE ID = post_id AND meta_key = '_wp_old_slug' AND meta_value=' " . $wp_query -> query_vars [ 'name' ] . " ' " ;
// 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' ] )
$query .= " AND YEAR(post_date) = ' { $wp_query -> query_vars [ 'year' ] } ' " ;
if ( '' != $wp_query -> query_vars [ 'monthnum' ] )
$query .= " AND MONTH(post_date) = ' { $wp_query -> query_vars [ 'monthnum' ] } ' " ;
if ( '' != $wp_query -> query_vars [ 'day' ] )
$query .= " AND DAYOFMONTH(post_date) = ' { $wp_query -> query_vars [ 'day' ] } ' " ;
$id = ( int ) $wpdb -> get_var ( $query );
if ( ! $id )
return ;
$link = get_permalink ( $id );
if ( ! $link )
return ;
wp_redirect ( $link , '301' ); // Permanent redirect
exit ;
endif ;
}
2006-06-08 04:22:16 +02:00
//
// Private helper functions
//
// Setup global post data.
function setup_postdata ( $post ) {
2007-12-06 20:49:33 +01:00
global $id , $authordata , $day , $currentmonth , $page , $pages , $multipage , $more , $numpages ;
2006-06-08 04:22:16 +02:00
2007-03-23 01:59:21 +01:00
$id = ( int ) $post -> ID ;
2006-06-08 04:22:16 +02:00
$authordata = get_userdata ( $post -> post_author );
$day = mysql2date ( 'd.m.y' , $post -> post_date );
$currentmonth = mysql2date ( 'm' , $post -> post_date );
$numpages = 1 ;
$page = get_query_var ( 'page' );
if ( ! $page )
$page = 1 ;
2008-02-09 01:19:48 +01:00
if ( is_single () || is_page () || is_feed () )
2006-06-08 04:22:16 +02:00
$more = 1 ;
$content = $post -> post_content ;
if ( preg_match ( '/<!--nextpage-->/' , $content ) ) {
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 {
$pages [ 0 ] = $post -> post_content ;
$multipage = 0 ;
}
return true ;
}
2007-08-21 20:39:45 +02:00
?>