Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Correct way to list multiple $query->set

Tags:

php

wordpress

What is the correct way to list multiple $query->set ? Am I allowed to have multiple $query->set like "CODE A" below ?
Or am I supposed to combine them into one? If yes, how would you combine the three $query->set code? I tried combining them in "CODE B" below but it didn't work.

.
CODE A: Before combine $query->set

This code goes in functions.php

function featured_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
    $query->set( 'category_name', 'new' );
    $query->set( 'cat', '-60, -61' );
    $query->set( 'posts_per_page', 5 );
    }
}
add_action( 'pre_get_posts', 'featured_category' );

.
CODE B: After combine $query->set

This code goes in functions.php

function featured_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
    $query->set( array( 'category_name' => 'new', 'cat' => '-60, -61', 'posts_per_page' => 5) );
    }
}
add_action( 'pre_get_posts', 'featured_category' );
like image 237
stadisco Avatar asked Oct 19 '14 18:10

stadisco


2 Answers

The correct way to use the set method (which is part of the WP_Query class) is to pass 2 parameters - a query parameter key and a query parameter value. So your first example (CODE A) is the correct way to do it.

You can take a look at the method code here: https://core.trac.wordpress.org/browser/tags/4.0/src/wp-includes/query.php#L2328

P.S. If you want to exclude multiple categories from a query, consider using the category__not_in query parameters, for example:

$query->set( 'category__not_in', array(60, 61) );

For more information about category query parameters, check http://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters

like image 120
m1r0 Avatar answered Oct 13 '22 21:10

m1r0


Alternatively, for a more elegant and concise approach. You could group them in an array and loop through them.

<?php

$query_vars = array(
    'post_type' => 'question',
    'post_status' => 'publish',
    'posts_per_page' => 1,
    'posts_per_archive_page' => 1,
    'orderby' => 'rand(' . get_query_var( 'docket' ) . ')',
);

foreach ( $query_vars as $key => $value ) {

    $wp_query->set( $key, $value );

};
like image 1
amarinediary Avatar answered Oct 13 '22 21:10

amarinediary