ACF Felder (Advanced Custom Fields) in die WordPress-Suche aufnehmen
Wer ausgiebiger auf beliebte Plugins wie "Advanced Custom Fields" setzt, wird früher oder später das Problem haben, dass der Kunde eine Suchmaske auf der Website wünscht aber keine oder zu wenige Resultate ausgegeben werden. Was ist da los?
Standardmäßig spuckt die Standard-WordPress-Suche keine Informationen aus, die in „Custom Fields“ bzw. „ACF-Feldern“ eingegeben wurden. Während der TinyMCE Editor des „klassischen Inhalts-Feldes“ sowie der Titel stets berücksichtigt werden, haben ACF-Felder das Nachsehen. Sie werden bei der Suche ausgespart.
Folgendes Snippet (welches wir übrigens ebenfalls über einen Blogartikel gefunden haben) einfach in die Datei functions.php integrieren und schon „spuckt“ die WordPress-Suche nicht nur Inhalte aus, die sich im klassischen TinyMCE-Editor befinden, sondern auch Informationen, die in ACF-Felder platziert wurden. Et voila!
<?php
/**
* Extend WordPress search to include custom fields
*
* http://adambalee.com
*/
/**
* Join posts and postmeta tables
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
*/
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
add_filter('posts_join', 'cf_search_join' );
/**
* Modify the search query with posts_where
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
*/
function cf_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
/**
* Prevent duplicates
*
* http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
*/
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
?>