Forked from charleslouis/custom-search-acf-wordpress.php
Last active
July 7, 2022 16:46
-
-
Save whitesided/d9ae410fe029477d705316b5beec307a to your computer and use it in GitHub Desktop.
PHP - Wordpress - Search - wordpress custom search function that encompasses ACF/advanced custom fields and taxonomies and split expression before request
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 ) { | |
//it's important to actually USE THIS to get the table names so this doesn't fail | |
//miserably when the installation has used prefixed table names | |
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 ( | |
($wpdb->posts.post_title LIKE '%$tag%') | |
OR ($wpdb->posts.post_content LIKE '%$tag%') | |
OR EXISTS ( | |
SELECT * FROM $wpdb->postmeta | |
WHERE post_id = $wpdb->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 $wpdb->comments | |
WHERE comment_post_ID = $wpdb->posts.ID | |
AND comment_content LIKE '%$tag%' | |
) | |
OR EXISTS ( | |
SELECT * FROM $wpdb->terms | |
INNER JOIN $wpdb->term_taxonomy | |
ON $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id | |
INNER JOIN $wpdb->term_relationships | |
ON $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id | |
WHERE ( | |
taxonomy = 'post_tag' | |
OR taxonomy = 'category' | |
OR taxonomy = 'myCustomTax' | |
) | |
AND object_id = $wpdb->posts.ID | |
AND $wpdb->terms.name LIKE '%$tag%' | |
) | |
)"; | |
endforeach; | |
return $where; | |
} | |
add_filter( 'posts_search', 'advanced_custom_search', 500, 2 ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment