Wp query

Preview:

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

Email: savita@amiworks.comTwitter: @savitas

Thanks

Recommended