Skip to content

Instantly share code, notes, and snippets.

@wking-io
Last active July 24, 2024 18:00
Show Gist options
  • Save wking-io/b304653b360ba23c75499afada705a38 to your computer and use it in GitHub Desktop.
Save wking-io/b304653b360ba23c75499afada705a38 to your computer and use it in GitHub Desktop.
How to search a specific custom post type and the ACF fields within
<?php
/**
* [list_searcheable_acf list all the custom fields we want to include in our search query]
* This could easily be something that is added to the admin as a plugin so that users can
* add searchable fields in an options table
* @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 );
<form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>">
<input type="text" name="s" value="Enter a keyword" placeholder="Search" />
<!-- This hidden field will default your search to be only post type you want -->
<input type="hidden" name="post_type" value="Your Post Type" />
<input id="searchsubmit" type="submit" alt="Search" value="Search" />
</form>
@foldesistudio
Copy link

Hey William,
I wanted to reach out and let you know that the code you provided was absolutely awesome! It worked perfectly and made a huge positive difference and performance in my WP project. Your expertise and assistance have been invaluable, and I wanted to express my heartfelt thanks. You rock!

Best regards,
Mihály | foldesistudio.hu
Hungary

@wking-io
Copy link
Author

@foldesistudio

Glad it helped!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment