<?php | |
/** | |
* [list_searcheable_acf list all the custom fields we want to include in our search query] | |
* @return [array] [list of custom fields] | |
*/ | |
function list_searcheable_acf(){ | |
$list_searcheable_acf = array("title", "sub_title", "excerpt_short", "excerpt_long", "xyz", "myACF"); | |
return $list_searcheable_acf; | |
} | |
/** | |
* [advanced_custom_search search that encompasses ACF/advanced custom fields and taxonomies and split expression before request] | |
* @param [query-part/string] $where [the initial "where" part of the search query] | |
* @param [object] $wp_query [] | |
* @return [query-part/string] $where [the "where" part of the search query as we customized] | |
* see https://vzurczak.wordpress.com/2013/06/15/extend-the-default-wordpress-search/ | |
* credits to Vincent Zurczak for the base query structure/spliting tags section | |
*/ | |
function advanced_custom_search( $where, &$wp_query ) { | |
global $wpdb; | |
if ( empty( $where )) | |
return $where; | |
// get search expression | |
$terms = $wp_query->query_vars[ 's' ]; | |
// explode search expression to get search terms | |
$exploded = explode( ' ', $terms ); | |
if( $exploded === FALSE || count( $exploded ) == 0 ) | |
$exploded = array( 0 => $terms ); | |
// reset search in order to rebuilt it as we whish | |
$where = ''; | |
// get searcheable_acf, a list of advanced custom fields you want to search content in | |
$list_searcheable_acf = list_searcheable_acf(); | |
foreach( $exploded as $tag ) : | |
$where .= " | |
AND ( | |
(wp_posts.post_title LIKE '%$tag%') | |
OR (wp_posts.post_content LIKE '%$tag%') | |
OR EXISTS ( | |
SELECT * FROM wp_postmeta | |
WHERE post_id = wp_posts.ID | |
AND ("; | |
foreach ($list_searcheable_acf as $searcheable_acf) : | |
if ($searcheable_acf == $list_searcheable_acf[0]): | |
$where .= " (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value LIKE '%$tag%') "; | |
else : | |
$where .= " OR (meta_key LIKE '%" . $searcheable_acf . "%' AND meta_value LIKE '%$tag%') "; | |
endif; | |
endforeach; | |
$where .= ") | |
) | |
OR EXISTS ( | |
SELECT * FROM wp_comments | |
WHERE comment_post_ID = wp_posts.ID | |
AND comment_content LIKE '%$tag%' | |
) | |
OR EXISTS ( | |
SELECT * FROM wp_terms | |
INNER JOIN wp_term_taxonomy | |
ON wp_term_taxonomy.term_id = wp_terms.term_id | |
INNER JOIN wp_term_relationships | |
ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id | |
WHERE ( | |
taxonomy = 'post_tag' | |
OR taxonomy = 'category' | |
OR taxonomy = 'myCustomTax' | |
) | |
AND object_id = wp_posts.ID | |
AND wp_terms.name LIKE '%$tag%' | |
) | |
)"; | |
endforeach; | |
return $where; | |
} | |
add_filter( 'posts_search', 'advanced_custom_search', 500, 2 ); |
This comment has been minimized.
This comment has been minimized.
Thank you :) |
This comment has been minimized.
This comment has been minimized.
This is super! Works like a charm. |
This comment has been minimized.
This comment has been minimized.
This worked awesome for me! I wonder if it would be worth the investment in time to make it a plugin so it's more available to all users? |
This comment has been minimized.
This comment has been minimized.
Thanxxxxx very much ! I was on this problem since 1 week and I was about to get crazyyy ! Thank you again :) |
This comment has been minimized.
This comment has been minimized.
I still have a problem with this search. I have a field where you can type your departement number (in France, it's like a region, an area). When I search content which has department #80 for example, it lists many posts that don't have any number "80" in it. So, what's going on ? I tried deleting lines 62 to 80 but it doesn't change anything ; and also deleting parts on lines 54 and 56 (deleting meta_key part) |
This comment has been minimized.
This comment has been minimized.
Thanx for sharing this :) A suggestion : you may replace all defaults |
This comment has been minimized.
This comment has been minimized.
Amazing!!! |
This comment has been minimized.
This comment has been minimized.
So great! Tried a bunch of plugins including Relevanssi and Search Everything, but this worked much better and is a much more elegant solution. Thank you for sharing! |
This comment has been minimized.
This comment has been minimized.
How can you call this in? I'm a little confused to what |
This comment has been minimized.
This comment has been minimized.
This is great thank you for sharing. |
This comment has been minimized.
This comment has been minimized.
Thanks, i upgraded this to change the |
This comment has been minimized.
This comment has been minimized.
Great work Charles! @smeric Sébastien thanks for posting. DB prefix was my problem. |
This comment has been minimized.
This comment has been minimized.
Thanks! Good job. |
This comment has been minimized.
This comment has been minimized.
This is fantastic. Many thanks! |
This comment has been minimized.
This comment has been minimized.
thank you for sharing! |
This comment has been minimized.
This comment has been minimized.
Thanks! |
This comment has been minimized.
This comment has been minimized.
wow!!!!! one plugin less :) |
This comment has been minimized.
This comment has been minimized.
legit! thanks!! |
This comment has been minimized.
This comment has been minimized.
Works Perfectly! |
This comment has been minimized.
This comment has been minimized.
Nice one, thanks! Make sure to escape each $tag though as it's currently open to SQL injection! ( Line 43: $tag = esc_sql($wpdb->esc_like($tag)); ) |
This comment has been minimized.
This comment has been minimized.
Amazing! Thanks |
This comment has been minimized.
This comment has been minimized.
put this code in functions.php? |
This comment has been minimized.
This comment has been minimized.
wow - inspires me to learn how to code better- amazing piece of coding skills here. |
This comment has been minimized.
This comment has been minimized.
You seriously need to escape your inputs, this isn't safe to use as-is and is vulnerable to SQL injection. In sharing this vulnerable gist you've opened up a bunch of sites to SQL injection, and that's definitely bad. |
This comment has been minimized.
This comment has been minimized.
incredible!! just added some escape to prevent sql injection! |
This comment has been minimized.
This comment has been minimized.
For those of you stumbling into this script via Google, I reworked it to include XSS and SQL injection attack protection (via PHP's |
This comment has been minimized.
This comment has been minimized.
AMAZING. Thanks |
This comment has been minimized.
This comment has been minimized.
@charleslouis and @jserrao: Thank you both for this, seriously! I had a plugin conflict with 'searchwp' and using your code instead worked perfectly (I credited you in the theme). All the best! |
This comment has been minimized.
This comment has been minimized.
Is there a way to search the (user) type subfield in a repeater? |
This comment has been minimized.
This comment has been minimized.
Would really love to know how to include Repeater fields in this. |
This comment has been minimized.
This comment has been minimized.
Brilliant. Thank you! |
This comment has been minimized.
This comment has been minimized.
Perfect - thank you so much!!! |
This comment has been minimized.
This comment has been minimized.
If someone is looking for a solution to this problem is to recommend the plugin: This plugin adds to default WordPress search engine the ability to search by content from selected fields of Advanced Custom Fields plugin. Everything works automatically, no need to add any additional code. |
This comment has been minimized.
This comment has been minimized.
How to use this script for get_posts()? |
This comment has been minimized.
This comment has been minimized.
Amazing, thanks! One thing I'd add is |
This comment has been minimized.
This comment has been minimized.
Great code! Thanks for sharing with me @janchimugica! |
This comment has been minimized.
This comment has been minimized.
Note that the original query WordPress sends includes ...and this query does not. So you'll want to re-add that, unless you want protected posts to be included as well. |
This comment has been minimized.
This comment has been minimized.
issues after upgrading to php7.2; |
This comment has been minimized.
This comment has been minimized.
As far as I can see you can remove the & in front of $wp_query on line 21. It doesnt need to be passed by reference since it isnt actually being modified, we're just extracting the search term. For me that removes the warning and still works fine :) |
This comment has been minimized.
This comment has been minimized.
Amazing. Thank you |
This comment has been minimized.
This comment has been minimized.
Slim version where we don't reset the $where query:
|
This comment has been minimized.
This comment has been minimized.
Nifty piece of code, thank you, and thank you @jserrao for the mods to escape the inputs cleanly, and although it's 6 years old, still works like a charm :) |
This comment has been minimized.
This is fantastic, thanks!