[wp-trac] [WordPress Trac] #5141: wp_the_query is not stable

WordPress Trac wp-trac at lists.automattic.com
Thu Oct 4 13:34:37 GMT 2007


#5141: wp_the_query is not stable
---------------------+------------------------------------------------------
 Reporter:  082net   |       Owner:  anonymous                             
     Type:  defect   |      Status:  new                                   
 Priority:  normal   |   Milestone:  2.3.1                                 
Component:  General  |     Version:  2.3                                   
 Severity:  normal   |    Keywords:  wp_the_query, wp_query, queried_object
---------------------+------------------------------------------------------
 See [http://wordpress.org/support/topic/136624?replies=7#post-626268 my
 comment] on support forum.

 $wp_the_query seems tring to remain first WP_Query but 'custom loop'
 overrides $wp_the_query->post and $wp_the_query->posts.

 Example of 'custom loop' :
 {{{
 while($myposts->have_posts()): $mypost->the_post(); .... endwhile;
 }}}
 or
 {{{
 foreach($myposts as $post) { ... }
 }}}

 So $wp_the_query->get_queried_object() would not stable until it is
 firstly called before any plugin or theme because it returns pre-set value
 if available.
 {{{
         function get_queried_object() {
                 if (isset($this->queried_object)) {
                         return $this->queried_object;
                 }
         ......
 }}}



 Because almost wordpress theme use 'wp_title()' for <title> </title> and
 wp_title call 'wp_query->get_queried_object()', there seems no problem.

 But if a theme does not use wp_title but something else by hand,
 $wp_the_query->queried_object would remain NULL. So if a page contains
 'custom loop' and when any plugin, theme or wordpress hook call
 '$wp_the_query->get_queried_object()' after the custom loop, it returns
 last post data of the custom loop.

 And I suggest two way to solve this.

 wp-includes/class.php 'WP::query_posts()'
 {{{
         function query_posts() {
                 global $wp_the_query;
                 $this->build_query_string();
                 $wp_the_query->query($this->query_vars);
                 $wp_the_query->get_queried_object();// add this line
         }

 }}}

 '''OR'''

 wp-includes/class.php 'WP::register_globals()'
 {{{
         function register_globals() {
                 global $wp_query;
                 // Extract updated query vars back into global namespace.
                 foreach ($wp_query->query_vars as $key => $value) {
                         $GLOBALS[$key] = $value;
                 }

                 $GLOBALS['query_string'] = & $this->query_string;
                 $GLOBALS['posts'] = $wp_query->posts;// remove reference
                 $GLOBALS['post'] = $wp_query->post;// remove reference
                 $GLOBALS['request'] = & $wp_query->request;

                 if ( is_single() || is_page() ) {
                         $GLOBALS['more'] = 1;
                         $GLOBALS['single'] = 1;
                 }
         }
 }}}

 I think the first is better one.

-- 
Ticket URL: <http://trac.wordpress.org/ticket/5141>
WordPress Trac <http://trac.wordpress.org/>
WordPress blogging software


More information about the wp-trac mailing list