When retrieving data, there times where you may want to change the WHERE clause in WordPress. That is, depending on what you’re retrieving, you may want to filter what it’s searching.

Using WHERE in WordPress to filter results

A favorite, but It’s not that kind of filter.

And that’s exactly what a WHERE clause does. But just as we’ve looked at content in other posts, we can alter the WHERE clause via the WordPress API.

In previous posts, I’ve covered:

Here, I’ll show how to use the API to change the WHERE clause so you’re not having to do so through a custom query.

Changing The WHERE Clause in WordPress

If you’re new to SQL or you need a refresher on the purpose of a WHERE clause, check out this definition:

The MySQL WHERE clause is used to filter the results from a SELECT, INSERT, UPDATE, or DELETE statement.

Perhaps an easier way to say this would be:

A WHERE clause allows use to retrieve results based on the presence (or lack thereof) of a value.

Maybe that’s easier. Maybe not. Either way, I assume if you’ve made it this far, then you’ve got the idea.

An Example

Anyway, here’s how you can use the WordPress API to alter the WHERE clause when performing a search.

First, let’s say that we’re going to be changing the query on the search template. Furthermore, we’re going to alter the query so it includes a value from the postmeta table. (This is doing by JOINing the the tables.)

Given a search search, the code will work like this:

  • Look at the existing WordPress query
  • Replace the clause where it’s searching only the posts table and include the postmeta table

To do this, I’ll use preg_replace to find a substring of the query and expand it to include the postmeta information. This is where viewing the last executed query comes in handy.

And this should achieve exactly what you’re looking to do.

A Note About Performance

Whenever you’re working with a database or working with custom queries, it’s important to be mindful of performance. On small-to-medium sites, queries like this won’t have a huge impact.

But if you’re working on a larger site and the content that you’re trying to find is in columns that are not indexed, then the database engine will have to scan every row (or at least a large number of them).

This can several impact page load. And this is where custom database tables – content for another post – comes in handy.

For now, though, if you’re working with a small data set and you need to change the WHERE clause in WordPress using the native API, this is how you can do it.


Join the conversation! 2 Comments

  1. The code assumes that the database table prefix is ‘wp_’. Maybe you could create the search expressions before the call to preg_replace().

    • You’re right! Having a comment like this helps, so I think keeping it here in the post is enough; however, I’m glad you pointed that out.

      One of those things that I took for granted when writing the post ;).

Leave a Reply