Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to programmatically fetch posts matching a search query in WordPress?

Tags:

php

wordpress

In my plugin code I would like to perform a WP_Query (or similar) which returns all posts matching a given query string, as if the user typed that same string into the WordPress search form. Perhaps I'm just being dense, but I cannot seem to find a way to do so. I would expect to have a special parameter for WP_Query, such as matching, but I see no evidence of one.

I'll start going through the WordPress codebase to see how it's done internally, and I'll post the answer here if I find it. I just thought someone might happen to know offhand.

like image 399
Alan Bellows Avatar asked Apr 01 '12 01:04

Alan Bellows


2 Answers

Passing a query variable of "s" to WP_Query with a search term will filter post results by search term:

$query_args = array( 's' => 'disquiet' );
$query = new WP_Query( $query_args );

The corresponding SQL WHERE clause generated by this query looks like this:

AND (((wp_posts.post_title LIKE '%disquiet%') OR (wp_posts.post_content LIKE '%disquiet%')))

Default search includes the wildcards as shown above, which is most likely what you're looking for. If you want an exact search, you can also pass a query var of "exact" => true.

For the details see the get_posts method of WP_Query in wp-includes/query.php.

like image 191
gradyetc Avatar answered Oct 21 '22 13:10

gradyetc


I use this in my plugin:

$query = new WP_Query(array(
    'post_type' => 'any',
    'suppress_filters' => TRUE,
    'posts_per_page' => '-1'
));

foreach ($query->posts as $post) {
    // ...
}

post_type is needed if you're going to work with custom post types. suppress_filters will prevent the content from being formatted if you need to analyse it. posts_per_page will return all posts, not the default per page.

like image 45
Aram Kocharyan Avatar answered Oct 21 '22 13:10

Aram Kocharyan