Filtering Data with WP_Meta_Query

WordPress allows us to filter data by custom fields. The WP_Meta_Query class is used to generate SQL WHERE clauses to filter queries by meta fields. Now after we announced our WP_Date_Query Generator, the next natural move was to let you easily create advanced meta queries using our new WP_Meta_Query Generator.

 

Filtering by Custom Fields

WordPress allows you to filter posts based on post parameters like publish date, author, status, type, ect. Filter posts based on all kinds of taxonomies And filter posts based on other default values. But that is not always enough and you might need some extra data which is your own data – your own custom meta fields.

Custom fields are additional data fragments added to the main post, they are saved in a separate table – wp_postmeta. This is also applies to comments, users and terms each of them with as a separate meta own table.

When retrieving posts / users / comments filtered by meta data it has a performance toll as you use SQL JOIN. But in most cases the benefits outweigh the disadvantages. To reduce performance impact, you should not use the your own SQL statements but use WP_Meta_Query class which implements internal cache.

Retrieving filtered data with WP_Query and other supported query classes is easy squeezy. To filter with custom fields we will use the meta_query argument. As a developer you all you have to do is pass a valid array. The rest will be handled by WP_Meta_Query class which won’t return data, it will generate an SQL WHERE clause to be used in the main query.

 

The Meta Query Generator

With the completion of our latest WP_Date_Query tool, we went straight away to build the Meta Query tool to help newbie developers and advanced coders to create custom meta queries, save them to your account and integrate to other queries.

You can use the Generator to learn the query internals or use it in your workflow to create simple queries or very complex queries with multiple rules.

 

Meta Query Parameters
Meta Query Parameters

 

The generator also has a builtin support for nested queries, allowing you to combine several meta queries inside each other to retrieve very specific result. WordPress even knows how to handle nested queries for you.

 

Nested WP_Meta_Query
Nested WP_Meta_Query

 

Examples

Imagine we have an e-commerce website with thousands of products. Lets say we need to filter only the blue items.

 

Now we are going to use multiple filters. Lets say we need to filter items by color – to retrieve only blue OR red items. We will need to use an “OR” compare operator.

 

Lets take those blue/red items, and add a price parameter to show items under 500 USD (numeric field type). We will use nested snippet from the previous example.

 

Finally we are going to wrap it all up in to our WP_Query query. We will use the meta query generated above in our general query.

 

Upgrade to GenerateWP Premium Enjoy better WordPress generators  Upgrade Now

The same principle can be applied on the WP_Comment_Query. Lets see an example, a comment with a “review” type and a under 5 star rating.

 

Lastly the WP_User_Query. Lets retrieve all the users from the city of Montreal in Canada.

 

For Conclusion

This is a very simple-to-use class with many powerful capabilities that lets you create simple to very complex filters. All those capabilities are now integrated into our generators. Happy Filtering.

Share on facebook
Share on twitter
Share on linkedin
Share on reddit
Share on whatsapp
Share on email
Rami Yushuvaev

Rami Yushuvaev

I'm an entrepreneur, a web developer and a blogger. I’ve contributed code to each and every release since WordPress 2.8. I'm the Hebrew GTE responsible for the translation and the release of WordPress Hebrew version. The founder GenerateWP.com and several other WordPress related projects. I work mainly with Israeli startups and hi-tech companies, providing development services.

6 Comments:

  • Ciaran Michael Whelan

    Hi there. For the filter to pickup value under $500 it should be
    array(
    'key' => 'price',
    'value' => '500',
    'compare' => '<',
    'type' => 'NUMERIC',
    ),

    Reply

  • Carlos

    Thank you! Great insight to WordPress.

    Reply

  • Nishit

    Hi Can we display users with multiple orderby with multiple meta key like below :

    array(
    'relation' => 'AND',
    'rating_score' => array(
    'key' => 'rating_score',
    'compare' => 'EXISTS',
    ),
    'total_job_complete' => array(
    'key' => 'total_job_complete',
    'compare' => 'EXISTS',
    ),
    ),
    'orderby' => array(
    'rating_score' => 'DESC',
    'total_job_complete' => 'DESC',

    )
    ),
    'number' => $users_per_page,
    'offset' => $offset
    );

    $user_query = new WP_User_Query( $args );

    Reply

  • JY

    Hi Based on the above example, (color & price seems like in the same table ‘product’),
    How about if color is in another table? how to write the query for that?

    Reply

  • Berat Gashi

    Hi there,

    I’m trying to order posts via jquery ajax but it is not ordering my method is to order by custom field Price in this case but it doesn’t order no matter what

    My code,

    $args['meta_key'] = 'offer_details_offer_price';
    $args['orderby'] = 'rand';
    $args['order'] = $order_type;

    As you see this is an array of $args to use in wp_query but it doesnt work, any help is appreciated.

    Reply

Leave a Reply

Subscribe to our Blog

Receive email notifications when new blog posts are published.