WordPress.org

Make WordPress Core

Changeset 3639


Ignore:
Timestamp:
03/13/2006 01:44:32 AM (12 years ago)
Author:
ryan
Message:

Move WP_Query and its wrapper functions to query.php. #2525

Location:
trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/classes.php

    r3638 r3639  
    11<?php
    2 
    3 class WP_Query {
    4     var $query;
    5     var $query_vars;
    6     var $queried_object;
    7     var $queried_object_id;
    8     var $request;
    9 
    10     var $posts;
    11     var $post_count = 0;
    12     var $current_post = -1;
    13     var $in_the_loop = false;
    14     var $post;
    15 
    16     var $is_single = false;
    17     var $is_preview = false;
    18     var $is_page = false;
    19     var $is_archive = false;
    20     var $is_date = false;
    21     var $is_year = false;
    22     var $is_month = false;
    23     var $is_day = false;
    24     var $is_time = false;
    25     var $is_author = false;
    26     var $is_category = false;
    27     var $is_search = false;
    28     var $is_feed = false;
    29     var $is_trackback = false;
    30     var $is_home = false;
    31     var $is_404 = false;
    32     var $is_comments_popup = false;
    33     var $is_admin = false;
    34     var $is_attachment = false;
    35 
    36     function init_query_flags() {
    37         $this->is_single = false;
    38         $this->is_page = false;
    39         $this->is_archive = false;
    40         $this->is_date = false;
    41         $this->is_year = false;
    42         $this->is_month = false;
    43         $this->is_day = false;
    44         $this->is_time = false;
    45         $this->is_author = false;
    46         $this->is_category = false;
    47         $this->is_search = false;
    48         $this->is_feed = false;
    49         $this->is_trackback = false;
    50         $this->is_home = false;
    51         $this->is_404 = false;
    52         $this->is_paged = false;
    53         $this->is_admin = false;
    54         $this->is_attachment = false;
    55     }
    56 
    57     function init () {
    58         unset($this->posts);
    59         unset($this->query);
    60         unset($this->query_vars);
    61         unset($this->queried_object);
    62         unset($this->queried_object_id);
    63         $this->post_count = 0;
    64         $this->current_post = -1;
    65         $this->in_the_loop = false;
    66 
    67         $this->init_query_flags();
    68     }
    69 
    70     // Reparse the query vars.
    71     function parse_query_vars() {
    72         $this->parse_query('');
    73     }
    74 
    75     // Parse a query string and set query type booleans.
    76     function parse_query ($query) {
    77         if ( !empty($query) || !isset($this->query) ) {
    78             $this->init();
    79             parse_str($query, $qv);
    80             $this->query = $query;
    81             $this->query_vars = $qv;
    82         }
    83 
    84         if ('404' == $qv['error']) {
    85             $this->is_404 = true;
    86             if ( !empty($query) ) {
    87                 do_action('parse_query', array(&$this));
    88             }
    89             return;
    90         }
    91 
    92         $qv['m'] =  (int) $qv['m'];
    93         $qv['p'] =  (int) $qv['p'];
    94 
    95         // Compat.  Map subpost to attachment.
    96         if ( '' != $qv['subpost'] )
    97             $qv['attachment'] = $qv['subpost'];
    98         if ( '' != $qv['subpost_id'] )
    99             $qv['attachment_id'] = $qv['subpost_id'];
    100 
    101         if ( ('' != $qv['attachment']) || (int) $qv['attachment_id'] ) {
    102             $this->is_single = true;
    103             $this->is_attachment = true;
    104         } elseif ('' != $qv['name']) {
    105             $this->is_single = true;
    106         } elseif ( $qv['p'] ) {
    107             $this->is_single = true;
    108         } elseif (('' != $qv['hour']) && ('' != $qv['minute']) &&('' != $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day'])) {
    109             // If year, month, day, hour, minute, and second are set, a single
    110             // post is being queried.       
    111             $this->is_single = true;
    112         } elseif ('' != $qv['static'] || '' != $qv['pagename'] || '' != $qv['page_id']) {
    113             $this->is_page = true;
    114             $this->is_single = false;
    115         } elseif (!empty($qv['s'])) {
    116             $this->is_search = true;
    117         } else {
    118         // Look for archive queries.  Dates, categories, authors.
    119 
    120             if ( (int) $qv['second']) {
    121                 $this->is_time = true;
    122                 $this->is_date = true;
    123             }
    124 
    125             if ( (int) $qv['minute']) {
    126                 $this->is_time = true;
    127                 $this->is_date = true;
    128             }
    129 
    130             if ( (int) $qv['hour']) {
    131                 $this->is_time = true;
    132                 $this->is_date = true;
    133             }
    134 
    135             if ( (int) $qv['day']) {
    136                 if (! $this->is_date) {
    137                     $this->is_day = true;
    138                     $this->is_date = true;
    139                 }
    140             }
    141 
    142             if ( (int)  $qv['monthnum']) {
    143                 if (! $this->is_date) {
    144                     $this->is_month = true;
    145                     $this->is_date = true;
    146                 }
    147             }
    148 
    149             if ( (int)  $qv['year']) {
    150                 if (! $this->is_date) {
    151                     $this->is_year = true;
    152                     $this->is_date = true;
    153                 }
    154             }
    155 
    156             if ( (int)  $qv['m']) {
    157                 $this->is_date = true;
    158                 if (strlen($qv['m']) > 9) {
    159                     $this->is_time = true;
    160                 } else if (strlen($qv['m']) > 7) {
    161                     $this->is_day = true;
    162                 } else if (strlen($qv['m']) > 5) {
    163                     $this->is_month = true;
    164                 } else {
    165                     $this->is_year = true;
    166                 }
    167             }
    168 
    169             if ('' != $qv['w']) {
    170                 $this->is_date = true;
    171             }
    172 
    173             if (empty($qv['cat']) || ($qv['cat'] == '0')) {
    174                 $this->is_category = false;
    175             } else {
    176                 if (stristr($qv['cat'],'-')) {
    177                     $this->is_category = false;
    178                 } else {
    179                     $this->is_category = true;
    180                 }
    181             }
    182 
    183             if ('' != $qv['category_name']) {
    184                 $this->is_category = true;
    185             }
    186            
    187             if ((empty($qv['author'])) || ($qv['author'] == '0')) {
    188                 $this->is_author = false;
    189             } else {
    190                 $this->is_author = true;
    191             }
    192 
    193             if ('' != $qv['author_name']) {
    194                 $this->is_author = true;
    195             }
    196 
    197             if ( ($this->is_date || $this->is_author || $this->is_category)) {
    198                 $this->is_archive = true;
    199             }
    200         }
    201 
    202         if ('' != $qv['feed']) {
    203             $this->is_feed = true;
    204         }
    205 
    206         if ('' != $qv['tb']) {
    207             $this->is_trackback = true;
    208         }
    209 
    210         if ('' != $qv['paged']) {
    211             $this->is_paged = true;
    212         }
    213 
    214         if ('' != $qv['comments_popup']) {
    215             $this->is_comments_popup = true;
    216         }
    217 
    218         //if we're previewing inside the write screen
    219         if ('' != $qv['preview']) {
    220             $this->is_preview = true;
    221         }
    222 
    223         if (strstr($_SERVER['PHP_SELF'], 'wp-admin/')) {
    224             $this->is_admin = true;
    225         }
    226 
    227         if ( ! ($this->is_attachment || $this->is_archive || $this->is_single || $this->is_page || $this->is_search || $this->is_feed || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup)) {
    228             $this->is_home = true;
    229         }
    230 
    231         if ( !empty($query) ) {
    232             do_action('parse_query', array(&$this));
    233         }
    234     }
    235 
    236     function set_404() {
    237         $this->init_query_flags();
    238         $this->is_404 = true;
    239     }
    240 
    241     function get($query_var) {
    242         if (isset($this->query_vars[$query_var])) {
    243             return $this->query_vars[$query_var];
    244         }
    245 
    246         return '';
    247     }
    248 
    249     function set($query_var, $value) {
    250         $this->query_vars[$query_var] = $value;
    251     }
    252 
    253     function &get_posts() {
    254         global $wpdb, $pagenow, $user_ID;
    255 
    256         do_action('pre_get_posts', array(&$this));
    257 
    258         // Shorthand.
    259         $q = &$this->query_vars;
    260 
    261         // First let's clear some variables
    262         $whichcat = '';
    263         $whichauthor = '';
    264         $whichpage = '';
    265         $result = '';
    266         $where = '';
    267         $limits = '';
    268         $distinct = '';
    269         $join = '';
    270 
    271         if ( !isset($q['post_type']) )
    272             $q['post_type'] = 'post';
    273         $post_type = $q['post_type'];
    274         if ( !isset($q['posts_per_page']) || $q['posts_per_page'] == 0 )
    275             $q['posts_per_page'] = get_settings('posts_per_page');
    276         if ( !isset($q['what_to_show']) )
    277             $q['what_to_show'] = get_settings('what_to_show');
    278         if ( isset($q['showposts']) && $q['showposts'] ) {
    279             $q['showposts'] = (int) $q['showposts'];
    280             $q['posts_per_page'] = $q['showposts'];
    281         }
    282         if ( (isset($q['posts_per_archive_page']) && $q['posts_per_archive_page'] != 0) && ($this->is_archive || $this->is_search) )
    283             $q['posts_per_page'] = $q['posts_per_archive_page'];
    284         if ( !isset($q['nopaging']) ) {
    285             if ($q['posts_per_page'] == -1) {
    286                 $q['nopaging'] = true;
    287             } else {
    288                 $q['nopaging'] = false;
    289             }
    290         }
    291         if ( $this->is_feed ) {
    292             $q['posts_per_page'] = get_settings('posts_per_rss');
    293             $q['what_to_show'] = 'posts';
    294         }
    295 
    296         if ( $this->is_home && ( 'page' == get_option('show_on_front') ) && get_option('page_on_front') ) {
    297             $this->is_page = true;
    298             $this->is_home = false;
    299             $q['page_id'] = get_option('page_on_front');
    300         }
    301 
    302         if (isset($q['page'])) {
    303             $q['page'] = trim($q['page'], '/');
    304             $q['page'] = (int) $q['page'];
    305         }
    306 
    307         $add_hours = intval(get_settings('gmt_offset'));
    308         $add_minutes = intval(60 * (get_settings('gmt_offset') - $add_hours));
    309         $wp_posts_post_date_field = "post_date"; // "DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)";
    310 
    311         // If a month is specified in the querystring, load that month
    312         if ( (int) $q['m'] ) {
    313             $q['m'] = '' . preg_replace('|[^0-9]|', '', $q['m']);
    314             $where .= ' AND YEAR(post_date)=' . substr($q['m'], 0, 4);
    315             if (strlen($q['m'])>5)
    316                 $where .= ' AND MONTH(post_date)=' . substr($q['m'], 4, 2);
    317             if (strlen($q['m'])>7)
    318                 $where .= ' AND DAYOFMONTH(post_date)=' . substr($q['m'], 6, 2);
    319             if (strlen($q['m'])>9)
    320                 $where .= ' AND HOUR(post_date)=' . substr($q['m'], 8, 2);
    321             if (strlen($q['m'])>11)
    322                 $where .= ' AND MINUTE(post_date)=' . substr($q['m'], 10, 2);
    323             if (strlen($q['m'])>13)
    324                 $where .= ' AND SECOND(post_date)=' . substr($q['m'], 12, 2);
    325         }
    326 
    327         if ( (int) $q['hour'] ) {
    328             $q['hour'] = '' . intval($q['hour']);
    329             $where .= " AND HOUR(post_date)='" . $q['hour'] . "'";
    330         }
    331 
    332         if ( (int) $q['minute'] ) {
    333             $q['minute'] = '' . intval($q['minute']);
    334             $where .= " AND MINUTE(post_date)='" . $q['minute'] . "'";
    335         }
    336 
    337         if ( (int) $q['second'] ) {
    338             $q['second'] = '' . intval($q['second']);
    339             $where .= " AND SECOND(post_date)='" . $q['second'] . "'";
    340         }
    341 
    342         if ( (int) $q['year'] ) {
    343             $q['year'] = '' . intval($q['year']);
    344             $where .= " AND YEAR(post_date)='" . $q['year'] . "'";
    345         }
    346 
    347         if ( (int) $q['monthnum'] ) {
    348             $q['monthnum'] = '' . intval($q['monthnum']);
    349             $where .= " AND MONTH(post_date)='" . $q['monthnum'] . "'";
    350         }
    351 
    352         if ( (int) $q['day'] ) {
    353             $q['day'] = '' . intval($q['day']);
    354             $where .= " AND DAYOFMONTH(post_date)='" . $q['day'] . "'";
    355         }
    356 
    357         // Compat.  Map subpost to attachment.
    358         if ( '' != $q['subpost'] )
    359             $q['attachment'] = $q['subpost'];
    360         if ( '' != $q['subpost_id'] )
    361             $q['attachment_id'] = $q['subpost_id'];
    362 
    363         if ('' != $q['name']) {
    364             $q['name'] = sanitize_title($q['name']);
    365             $where .= " AND post_name = '" . $q['name'] . "'";
    366         } else if ('' != $q['pagename']) {
    367             $reqpage = get_page_by_path($q['pagename']);
    368             if ( !empty($reqpage) )
    369                 $reqpage = $reqpage->ID;
    370             else
    371                 $reqpage = 0;
    372 
    373             if  ( ('page' == get_option('show_on_front') ) && ( $reqpage == get_option('page_for_posts') ) ) {
    374                 $this->is_page = false;
    375                 $this->is_home = true;
    376             } else {
    377                 $q['pagename'] = str_replace('%2F', '/', urlencode(urldecode($q['pagename'])));
    378                 $page_paths = '/' . trim($q['pagename'], '/');
    379                 $q['pagename'] = sanitize_title(basename($page_paths));
    380                 $q['name'] = $q['pagename'];
    381                 $where .= " AND (ID = '$reqpage')";
    382             }
    383         } elseif ('' != $q['attachment']) {
    384             $q['attachment'] = str_replace('%2F', '/', urlencode(urldecode($q['attachment'])));
    385             $attach_paths = '/' . trim($q['attachment'], '/');
    386             $q['attachment'] = sanitize_title(basename($attach_paths));
    387             $q['name'] = $q['attachment'];
    388             $where .= " AND post_name = '" . $q['attachment'] . "'";
    389         }
    390 
    391         if ( (int) $q['w'] ) {
    392             $q['w'] = ''.intval($q['w']);
    393             $where .= " AND WEEK(post_date, 1)='" . $q['w'] . "'";
    394         }
    395 
    396         if ( intval($q['comments_popup']) )
    397             $q['p'] = intval($q['comments_popup']);
    398 
    399         // If a attachment is requested by number, let it supercede any post number.
    400         if ( ($q['attachment_id'] != '') && (intval($q['attachment_id']) != 0) )
    401             $q['p'] = (int) $q['attachment_id'];
    402 
    403         // If a post number is specified, load that post
    404         if (($q['p'] != '') && intval($q['p']) != 0) {
    405             $q['p'] =  (int) $q['p'];
    406             $where = ' AND ID = ' . $q['p'];
    407         }
    408 
    409         if (($q['page_id'] != '') && (intval($q['page_id']) != 0)) {
    410             $q['page_id'] = intval($q['page_id']);
    411             if  ( ('page' == get_option('show_on_front') ) && ( $q['page_id'] == get_option('page_for_posts') ) ) {
    412                 $this->is_page = false;
    413                 $this->is_home = true;
    414             } else {
    415                 $q['p'] = $q['page_id'];
    416                 $where = ' AND ID = '.$q['page_id'];
    417             }
    418         }
    419 
    420         // If a search pattern is specified, load the posts that match
    421         if (!empty($q['s'])) {
    422             $q['s'] = addslashes_gpc($q['s']);
    423             $search = ' AND (';
    424             $q['s'] = preg_replace('/, +/', ' ', $q['s']);
    425             $q['s'] = str_replace(',', ' ', $q['s']);
    426             $q['s'] = str_replace('"', ' ', $q['s']);
    427             $q['s'] = trim($q['s']);
    428             if ($q['exact']) {
    429                 $n = '';
    430             } else {
    431                 $n = '%';
    432             }
    433             if (!$q['sentence']) {
    434                 $s_array = explode(' ',$q['s']);
    435                 $q['search_terms'] = $s_array;
    436                 $search .= '((post_title LIKE \''.$n.$s_array[0].$n.'\') OR (post_content LIKE \''.$n.$s_array[0].$n.'\'))';
    437                 for ( $i = 1; $i < count($s_array); $i = $i + 1) {
    438                     $search .= ' AND ((post_title LIKE \''.$n.$s_array[$i].$n.'\') OR (post_content LIKE \''.$n.$s_array[$i].$n.'\'))';
    439                 }
    440                 $search .= ' OR (post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\')';
    441                 $search .= ')';
    442             } else {
    443                 $search = ' AND ((post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\'))';
    444             }
    445         }
    446 
    447         // Category stuff
    448 
    449         if ((empty($q['cat'])) || ($q['cat'] == '0') ||
    450                 // Bypass cat checks if fetching specific posts
    451                 ( $this->is_single || $this->is_page )) {
    452             $whichcat='';
    453         } else {
    454             $q['cat'] = ''.urldecode($q['cat']).'';
    455             $q['cat'] = addslashes_gpc($q['cat']);
    456             if (stristr($q['cat'],'-')) {
    457                 // Note: if we have a negative, we ignore all the positives. It must
    458                 // always mean 'everything /except/ this one'. We should be able to do
    459                 // multiple negatives but we don't :-(
    460                 $eq = '!=';
    461                 $andor = 'AND';
    462                 $q['cat'] = explode('-',$q['cat']);
    463                 $q['cat'] = intval($q['cat'][1]);
    464             } else {
    465                 $eq = '=';
    466                 $andor = 'OR';
    467             }
    468             $join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";
    469             $cat_array = preg_split('/[,\s]+/', $q['cat']);
    470             $whichcat .= ' AND (category_id '.$eq.' '.intval($cat_array[0]);
    471             $whichcat .= get_category_children($cat_array[0], ' '.$andor.' category_id '.$eq.' ');
    472             for ($i = 1; $i < (count($cat_array)); $i = $i + 1) {
    473                 $whichcat .= ' '.$andor.' category_id '.$eq.' '.intval($cat_array[$i]);
    474                 $whichcat .= get_category_children($cat_array[$i], ' '.$andor.' category_id '.$eq.' ');
    475             }
    476             $whichcat .= ')';
    477             if ($eq == '!=') {
    478                 $q['cat'] = '-'.$q['cat']; // Put back the knowledge that we are excluding a category.
    479             }
    480         }
    481 
    482         // Category stuff for nice URIs
    483 
    484         global $cache_categories;
    485         if ('' != $q['category_name']) {
    486             $reqcat = get_category_by_path($q['category_name']);
    487             $q['category_name'] = str_replace('%2F', '/', urlencode(urldecode($q['category_name'])));
    488             $cat_paths = '/' . trim($q['category_name'], '/');
    489             $q['category_name'] = sanitize_title(basename($cat_paths));
    490 
    491             $cat_paths = '/' . trim(urldecode($q['category_name']), '/');
    492             $q['category_name'] = sanitize_title(basename($cat_paths));
    493             $cat_paths = explode('/', $cat_paths);
    494             foreach($cat_paths as $pathdir)
    495                 $cat_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir);
    496 
    497             //if we don't match the entire hierarchy fallback on just matching the nicename
    498             if ( empty($reqcat) )
    499                 $reqcat = get_category_by_path($q['category_name'], false);
    500 
    501             if ( !empty($reqcat) )
    502                 $reqcat = $reqcat->cat_ID;
    503             else
    504                 $reqcat = 0;
    505 
    506             $q['cat'] = $reqcat;
    507                
    508             $tables = ", $wpdb->post2cat, $wpdb->categories";
    509             $join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) LEFT JOIN $wpdb->categories ON ($wpdb->post2cat.category_id = $wpdb->categories.cat_ID) ";
    510             $whichcat = " AND (category_id = '" . $q['cat'] . "'";
    511             $whichcat .= get_category_children($q['cat'], " OR category_id = ");
    512             $whichcat .= ")";
    513         }
    514 
    515         // Author/user stuff
    516 
    517         if ((empty($q['author'])) || ($q['author'] == '0')) {
    518             $whichauthor='';
    519         } else {
    520             $q['author'] = ''.urldecode($q['author']).'';
    521             $q['author'] = addslashes_gpc($q['author']);
    522             if (stristr($q['author'], '-')) {
    523                 $eq = '!=';
    524                 $andor = 'AND';
    525                 $q['author'] = explode('-', $q['author']);
    526                 $q['author'] = ''.intval($q['author'][1]);
    527             } else {
    528                 $eq = '=';
    529                 $andor = 'OR';
    530             }
    531             $author_array = preg_split('/[,\s]+/', $q['author']);
    532             $whichauthor .= ' AND (post_author '.$eq.' '.intval($author_array[0]);
    533             for ($i = 1; $i < (count($author_array)); $i = $i + 1) {
    534                 $whichauthor .= ' '.$andor.' post_author '.$eq.' '.intval($author_array[$i]);
    535             }
    536             $whichauthor .= ')';
    537         }
    538 
    539         // Author stuff for nice URIs
    540 
    541         if ('' != $q['author_name']) {
    542             if (stristr($q['author_name'],'/')) {
    543                 $q['author_name'] = explode('/',$q['author_name']);
    544                 if ($q['author_name'][count($q['author_name'])-1]) {
    545                     $q['author_name'] = $q['author_name'][count($q['author_name'])-1];#no trailing slash
    546                 } else {
    547                     $q['author_name'] = $q['author_name'][count($q['author_name'])-2];#there was a trailling slash
    548                 }
    549             }
    550             $q['author_name'] = sanitize_title($q['author_name']);
    551             $q['author'] = $wpdb->get_var("SELECT ID FROM $wpdb->users WHERE user_nicename='".$q['author_name']."'");
    552             $whichauthor .= ' AND (post_author = '.intval($q['author']).')';
    553         }
    554 
    555         $where .= $search.$whichcat.$whichauthor;
    556 
    557         if ((empty($q['order'])) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC'))) {
    558             $q['order']='DESC';
    559         }
    560 
    561         // Order by
    562         if (empty($q['orderby'])) {
    563             $q['orderby'] = 'post_date '.$q['order'];
    564         } else {
    565             // Used to filter values
    566             $allowed_keys = array('author', 'date', 'category', 'title', 'modified', 'menu_order');
    567             $q['orderby'] = urldecode($q['orderby']);
    568             $q['orderby'] = addslashes_gpc($q['orderby']);
    569             $orderby_array = explode(' ',$q['orderby']);
    570             if ( empty($orderby_array) )
    571                 $orderby_array[] = $q['orderby'];
    572             $q['orderby'] = '';
    573             for ($i = 0; $i < count($orderby_array); $i++) {
    574                 // Only allow certain values for safety
    575                 $orderby = $orderby_array[$i];
    576                 if ( 'menu_order' != $orderby )
    577                     $orderby = 'post_' . $orderby;
    578                 if ( in_array($orderby_array[$i], $allowed_keys) )
    579                     $q['orderby'] .= (($i == 0) ? '' : ',') . "$orderby {$q['order']}";
    580             }
    581             if ( empty($q['orderby']) )
    582                 $q['orderby'] = 'post_date '.$q['order'];
    583         }
    584 
    585         //$now = gmdate('Y-m-d H:i:59');
    586        
    587         //only select past-dated posts, except if a logged in user is viewing a single: then, if they
    588         //can edit the post, we let them through
    589         //if ($pagenow != 'post.php' && $pagenow != 'edit.php' && !($this->is_single && $user_ID)) {
    590         //  $where .= " AND post_date_gmt <= '$now'";
    591         //  $distinct = 'DISTINCT';
    592         //}
    593 
    594         if ( $this->is_attachment ) {
    595             $where .= ' AND (post_type = "attachment")';
    596         } elseif ($this->is_page) {
    597             $where .= ' AND (post_type = "page")';
    598         } elseif ($this->is_single) {
    599             $where .= ' AND (post_type = "post")';
    600         } else {
    601             $where .= " AND (post_type = '$post_type' AND (post_status = 'publish'";
    602 
    603             if ( is_admin() )
    604                 $where .= " OR post_status = 'future' OR post_status = 'draft'";
    605             else
    606                 $distinct = 'DISTINCT';
    607    
    608             if ( is_user_logged_in() )
    609                 $where .= " OR post_author = $user_ID AND post_status = 'private'))";
    610             else
    611                 $where .= '))';
    612         }
    613 
    614         // Apply filters on where and join prior to paging so that any
    615         // manipulations to them are reflected in the paging by day queries.
    616         $where = apply_filters('posts_where', $where);
    617         $join = apply_filters('posts_join', $join);
    618 
    619         // Paging
    620         if (empty($q['nopaging']) && ! $this->is_single) {
    621             $page = $q['paged'];
    622             if (empty($page)) {
    623                 $page = 1;
    624             }
    625 
    626             if (($q['what_to_show'] == 'posts')) {
    627                 $pgstrt = '';
    628                 $pgstrt = (intval($page) -1) * $q['posts_per_page'] . ', ';
    629                 $limits = 'LIMIT '.$pgstrt.$q['posts_per_page'];
    630             } elseif ($q['what_to_show'] == 'days') {
    631                 $startrow = $q['posts_per_page'] * (intval($page)-1);
    632                 $start_date = $wpdb->get_var("SELECT max(post_date) FROM $wpdb->posts $join WHERE (1=1) $where GROUP BY year(post_date), month(post_date), dayofmonth(post_date) ORDER BY post_date DESC LIMIT $startrow,1");
    633                 $endrow = $startrow + $q['posts_per_page'] - 1;
    634                 $end_date = $wpdb->get_var("SELECT min(post_date) FROM $wpdb->posts $join WHERE (1=1) $where GROUP BY year(post_date), month(post_date), dayofmonth(post_date) ORDER BY post_date DESC LIMIT $endrow,1");
    635 
    636                 if ($page > 1) {
    637                     $where .= " AND post_date >= '$end_date' AND post_date <= '$start_date'";
    638                 } else {
    639                     $where .= " AND post_date >= '$end_date'";
    640                 }
    641             }
    642         }
    643 
    644         // Apply post-paging filters on where and join.  Only plugins that
    645         // manipulate paging queries should use these hooks.
    646         $where = apply_filters('posts_where_paged', $where);
    647         $groupby = " $wpdb->posts.ID ";
    648         $groupby = apply_filters('posts_groupby', $groupby);
    649         $join = apply_filters('posts_join_paged', $join);
    650         $orderby = apply_filters('posts_orderby', $q['orderby']);
    651         $request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";
    652         $this->request = apply_filters('posts_request', $request);
    653 
    654         $this->posts = $wpdb->get_results($this->request);
    655 
    656         // Check post status to determine if post should be displayed.
    657         if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
    658             $status = get_post_status($this->posts[0]);
    659             //$type = get_post_type($this->posts[0]);
    660             if ( ('publish' != $status) ) {
    661                 if ( ! is_user_logged_in() ) {
    662                     // User must be logged in to view unpublished posts.
    663                     $this->posts = array();
    664                 } else {
    665                     if ('draft' == $status) {
    666                         // User must have edit permissions on the draft to preview.
    667                         if (! current_user_can('edit_post', $this->posts[0]->ID)) {
    668                             $this->posts = array();
    669                         } else {
    670                             $this->is_preview = true;
    671                             $this->posts[0]->post_date = current_time('mysql');
    672                         }
    673                     }  else if ('future' == $status) {
    674                         $this->is_preview = true;
    675                         if (!current_user_can('edit_post', $this->posts[0]->ID)) {
    676                             $this->posts = array ( );
    677                         }
    678                     } else {
    679                         if (! current_user_can('read_post', $this->posts[0]->ID))
    680                             $this->posts = array();
    681                     }
    682                 }
    683             }
    684         }
    685 
    686         update_post_caches($this->posts);
    687 
    688         $this->posts = apply_filters('the_posts', $this->posts);
    689         $this->post_count = count($this->posts);
    690         if ($this->post_count > 0) {
    691             $this->post = $this->posts[0];
    692         }
    693 
    694         return $this->posts;
    695     }
    696 
    697     function next_post() {
    698        
    699         $this->current_post++;
    700 
    701         $this->post = $this->posts[$this->current_post];
    702         return $this->post;
    703     }
    704 
    705     function the_post() {
    706         global $post;
    707         $this->in_the_loop = true;
    708         $post = $this->next_post();
    709         setup_postdata($post);
    710 
    711         if ( $this->current_post == 0 ) // loop has just started
    712             do_action('loop_start');
    713     }
    714 
    715     function have_posts() {
    716         if ($this->current_post + 1 < $this->post_count) {
    717             return true;
    718         } elseif ($this->current_post + 1 == $this->post_count) {
    719             do_action('loop_end');
    720             // Do some cleaning up after the loop
    721             $this->rewind_posts();
    722         }
    723 
    724         $this->in_the_loop = false;
    725         return false;
    726     }
    727 
    728     function rewind_posts() {
    729         $this->current_post = -1;
    730         if ($this->post_count > 0) {
    731             $this->post = $this->posts[0];
    732         }
    733     }
    734    
    735     function &query($query) {
    736         $this->parse_query($query);
    737         return $this->get_posts();
    738     }
    739 
    740     function get_queried_object() {
    741         if (isset($this->queried_object)) {
    742             return $this->queried_object;
    743         }
    744 
    745         $this->queried_object = NULL;
    746         $this->queried_object_id = 0;
    747 
    748         if ($this->is_category) {
    749             $cat = $this->get('cat');
    750             $category = &get_category($cat);
    751             $this->queried_object = &$category;
    752             $this->queried_object_id = $cat;
    753         } else if ($this->is_single) {
    754             $this->queried_object = $this->post;
    755             $this->queried_object_id = $this->post->ID;
    756         } else if ($this->is_page) {
    757             $this->queried_object = $this->post;
    758             $this->queried_object_id = $this->post->ID;
    759         } else if ($this->is_author) {
    760             $author_id = $this->get('author');
    761             $author = get_userdata($author_id);
    762             $this->queried_object = $author;
    763             $this->queried_object_id = $author_id;
    764         }
    765 
    766         return $this->queried_object;
    767     }
    768 
    769     function get_queried_object_id() {
    770         $this->get_queried_object();
    771 
    772         if (isset($this->queried_object_id)) {
    773             return $this->queried_object_id;
    774         }
    775 
    776         return 0;
    777     }
    778 
    779     function WP_Query ($query = '') {
    780         if (! empty($query)) {
    781             $this->query($query);
    782         }
    783     }
    784 }
    7852
    7863class retrospam_mgr {
  • trunk/wp-includes/functions.php

    r3638 r3639  
    14711471}
    14721472
    1473 function &query_posts($query) {
    1474     global $wp_query;
    1475     return $wp_query->query($query);
    1476 }
    1477 
    14781473function update_post_cache(&$posts) {
    14791474    global $post_cache;
     
    15821577function wp_footer() {
    15831578    do_action('wp_footer');
    1584 }
    1585 
    1586 function is_single ($post = '') {
    1587     global $wp_query;
    1588 
    1589     if ( !$wp_query->is_single )
    1590         return false;
    1591 
    1592     if ( empty( $post) )
    1593         return true;
    1594 
    1595     $post_obj = $wp_query->get_queried_object();
    1596 
    1597     if ( $post == $post_obj->ID )
    1598         return true;
    1599     elseif ( $post == $post_obj->post_title )
    1600         return true;
    1601     elseif ( $post == $post_obj->post_name )
    1602         return true;
    1603 
    1604     return false;
    1605 }
    1606 
    1607 function is_page ($page = '') {
    1608     global $wp_query;
    1609 
    1610     if ( !$wp_query->is_page )
    1611         return false;
    1612 
    1613     if ( empty($page) )
    1614         return true;
    1615 
    1616     $page_obj = $wp_query->get_queried_object();
    1617 
    1618     if ( $page == $page_obj->ID )
    1619         return true;
    1620     elseif ( $page == $page_obj->post_title )
    1621         return true;
    1622     else if ( $page == $page_obj->post_name )
    1623         return true;
    1624 
    1625     return false;
    1626 }
    1627 
    1628 function is_attachment () {
    1629     global $wp_query;
    1630 
    1631     return $wp_query->is_attachment;
    1632 }
    1633 
    1634 function is_preview() {
    1635     global $wp_query;
    1636 
    1637     return $wp_query->is_preview;
    1638 }
    1639 
    1640 function is_archive () {
    1641     global $wp_query;
    1642 
    1643     return $wp_query->is_archive;
    1644 }
    1645 
    1646 function is_date () {
    1647     global $wp_query;
    1648 
    1649     return $wp_query->is_date;
    1650 }
    1651 
    1652 function is_year () {
    1653     global $wp_query;
    1654 
    1655     return $wp_query->is_year;
    1656 }
    1657 
    1658 function is_month () {
    1659     global $wp_query;
    1660 
    1661     return $wp_query->is_month;
    1662 }
    1663 
    1664 function is_day () {
    1665     global $wp_query;
    1666 
    1667     return $wp_query->is_day;
    1668 }
    1669 
    1670 function is_time () {
    1671     global $wp_query;
    1672 
    1673     return $wp_query->is_time;
    1674 }
    1675 
    1676 function is_author ($author = '') {
    1677     global $wp_query;
    1678 
    1679     if ( !$wp_query->is_author )
    1680         return false;
    1681 
    1682     if ( empty($author) )
    1683         return true;
    1684 
    1685     $author_obj = $wp_query->get_queried_object();
    1686 
    1687     if ( $author == $author_obj->ID )
    1688         return true;
    1689     elseif ( $author == $author_obj->nickname )
    1690         return true;
    1691     elseif ( $author == $author_obj->user_nicename )
    1692         return true;
    1693 
    1694     return false;
    1695 }
    1696 
    1697 function is_category ($category = '') {
    1698     global $wp_query;
    1699 
    1700     if ( !$wp_query->is_category )
    1701         return false;
    1702 
    1703     if ( empty($category) )
    1704         return true;
    1705 
    1706     $cat_obj = $wp_query->get_queried_object();
    1707 
    1708     if ( $category == $cat_obj->cat_ID )
    1709         return true;
    1710     else if ( $category == $cat_obj->cat_name )
    1711         return true;
    1712     elseif ( $category == $cat_obj->category_nicename )
    1713         return true;
    1714 
    1715     return false;
    1716 }
    1717 
    1718 function is_search () {
    1719     global $wp_query;
    1720 
    1721     return $wp_query->is_search;
    1722 }
    1723 
    1724 function is_feed () {
    1725     global $wp_query;
    1726 
    1727     return $wp_query->is_feed;
    1728 }
    1729 
    1730 function is_trackback () {
    1731     global $wp_query;
    1732 
    1733     return $wp_query->is_trackback;
    1734 }
    1735 
    1736 function is_admin () {
    1737     global $wp_query;
    1738 
    1739     return ( $wp_query->is_admin || strstr($_SERVER['REQUEST_URI'], 'wp-admin/') );
    1740 }
    1741 
    1742 function is_home () {
    1743     global $wp_query;
    1744 
    1745     return $wp_query->is_home;
    1746 }
    1747 
    1748 function is_404 () {
    1749     global $wp_query;
    1750 
    1751     return $wp_query->is_404;
    1752 }
    1753 
    1754 function is_comments_popup () {
    1755     global $wp_query;
    1756 
    1757     return $wp_query->is_comments_popup;
    1758 }
    1759 
    1760 function is_paged () {
    1761     global $wp_query;
    1762 
    1763     return $wp_query->is_paged;
    1764 }
    1765 
    1766 function in_the_loop() {
    1767     global $wp_query;
    1768 
    1769     return $wp_query->in_the_loop;
    1770 }
    1771 
    1772 function get_query_var($var) {
    1773     global $wp_query;
    1774 
    1775     return $wp_query->get($var);
    1776 }
    1777 
    1778 function have_posts() {
    1779     global $wp_query;
    1780 
    1781     return $wp_query->have_posts();
    1782 }
    1783 
    1784 function rewind_posts() {
    1785     global $wp_query;
    1786 
    1787     return $wp_query->rewind_posts();
    1788 }
    1789 
    1790 function the_post() {
    1791     global $wp_query;
    1792 
    1793     $wp_query->the_post();
    17941579}
    17951580
     
    21641949}
    21651950
    2166 
    2167 function is_plugin_page() {
    2168     global $plugin_page;
    2169 
    2170     if ( isset($plugin_page) )
    2171         return true;
    2172 
    2173     return false;
    2174 }
    2175 
    21761951/*
    21771952add_query_arg: Returns a modified querystring by adding
  • trunk/wp-settings.php

    r3638 r3639  
    135135require (ABSPATH . WPINC . '/capabilities.php');
    136136require (ABSPATH . WPINC . '/classes.php');
     137require (ABSPATH . WPINC . '/query.php');
    137138require (ABSPATH . WPINC . '/template-functions-general.php');
    138139require (ABSPATH . WPINC . '/template-functions-links.php');
Note: See TracChangeset for help on using the changeset viewer.