Upload
savita-soni
View
421
Download
0
Tags:
Embed Size (px)
Citation preview
WordCamp Pune 2013
Savita Soni, co-founder AmiWorks & chief-poet for WPoetsTwitter @savitas
Power of WP_Query
Ways to fetch posts & related data
• query_posts()• new WP_Query()• get_posts()• $wpdb global db object
query_posts()
How query_posts() looks
query_posts( $args );while ( have_posts() ) :
the_post();//the_title(), the_ID(), the_permalink() etc..
endwhile;
// Reset Query
wp_reset_query();
new WP_Query()
How WP_Query() looks
// The Query
$the_query = new WP_Query( $args );
// The Loop
while ( $the_query->have_posts() ) :$the_query->the_post();echo '<li>' . get_the_title() . '</li>';
endwhile;wp_reset_postdata();
get_posts()
How get_posts() looks
<?phpglobal $post;$args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 );$myposts = get_posts( $args );
foreach( $myposts as $post ) :setup_postdata($post); ?><li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
This all we already know?
So lets see something which we may not know...
Conditional tags
is_author() is_home()is_archive()
we know this as well and use them frequently…
But have you seen this?
$wp_query = new WP_Query( $args );$wp_query->is_author()$wp_query->is_home()$wp_query->is_archive()
Yes every query object has its own methods
so we can do this as well
$my_query = new WP_Query( $args );while( $my_query->have_posts() ):
$my_query->the_post();if( $my_query->is_author()){ // do something for author
}endwhile;wp_reset_postdata();
why we always needs to call
wp_reset_query()wp_reset_postdata();
with query_posts() or WP_Query()
because when we do this
query_posts( 'cat=5');while ( have_posts() ) :
the_post();//the_title(), the_ID(), the_permalink() etc..
endwhile;
We have altered the main query...
How?
global $wp_query; //this is the main query object
Do anyone know this?
$wp_the_query
So the real main query object $wp_the_query
and $wp_query is the live copy of $wp_the_query
it is something like
$wp_the_query = new WP_Query();$wp_query = &$wp_the_query;
when we call query_posts(), it works like this
function query_posts($query) {$GLOBALS['wp_query'] = new WP_Query();return $GLOBALS['wp_query']->query($query);
}
and when we call wp_reset_query()
function wp_reset_query() {$GLOBALS['wp_query'] = $GLOBALS['wp_the_query']; wp_reset_postdata();
}
how many query(s) get called when we call WP_Query()?
Is it running only one query with your passed arguments????
it is running 4 queries
1. Select SQL_CALC_FOUND_ROWS....FROM wp_posts limit 0,10
2. Select FOUND_ROWS();
3. Get all metadata attached to these posts.
4. Get all terms for these posts.
off some arguments selectively
new WP_Query(array(
'no_found_rows' => false,'update_post_meta_cache' => false,'update_post_term_cache' => false
))
what if I need to modify the main query only?
Use pre_get_posts hook
function exclude_category( $query ) { $query->set( 'cat', '-1,-1347' ); }add_action( 'pre_get_posts', 'exclude_category' );
Now problem with this...
it gets called for every post queryget_posts()WP_Query()query_posts()
what if I just need it for home page query?
now $wp_the_query object will help
function exclude_category( $query ) {global $wp_the_query;if( $wp_the_query == $query
and $query->home()){$query->set( 'cat', '-1,-1347' );
} }add_action( 'pre_get_posts', 'exclude_category' );
After WordPress 3.3 we have an awesome function
is_main_query()
So rather than writing
function exclude_category( $query ) {global $wp_the_query;//if( $wp_the_query == $query and $query->home()) if( $query->is_main_query() and $query->home()) {
$query->set( 'cat', '-1,-1347' );
}
Conclusion
Try to avoid using query_posts() If query_posts() is used then reset it with
wp_reset_query() Use pre_get_posts hook to alter main query &
use it with is_main_query() condition tag