This is an old revision of the document!


Wordpress: Suche mit Custom Fields oder ACF Feldern

Dies ist ein Beispiel wie man in der Wordpress Suche nach ACF Fields oder eigene Felder suchen lassen kann. Dieser Code ist eine PHP Klasse, die man am besten in eine eigene Datei packt und durch die functions.php included oder in ein eigenes Plugin schreibt. Der Code Ursprung basiert auf diesem Blog Beitrag auf outsourcify.net. Er ist aber so umgeschrieben, dass er in einer eigenen Klasse arbeitet. Dadurch kommen sich mögliche andere Funktionen nicht in den weg. Außerdem kann man in dieser Version Post-Types noch mit angeben.

<?php
 
namespace optionaler_namespace\deines_plugins;
 
/*
	HOOK FILTER IN SEARCH
 */
$post_types = [ 'post', 'page', 'dv_betriebe' ]; // wird nur benötigt wenn man eigene Post-Types hat
new SearchWithCustomFields( $post_types );
 
 
 
/**
 *
 * === Code Ursprung
 * Code basiert auf einem Beispiel von outsourcify.net
 * @link: https://outsourcify.net/how-to-search-in-acfs-custom-fields-in-wordpress/
 *
 * === Original Bschreibung:
 * Extend WordPress search to include custom fields
 * @link: http://adambalee.com
 *
 */
class SearchWithCustomFields
{
 
	private $wp_filter_priority         = 100;
	private $limit_search_to_post_types = []; // wp_query » post_types
	private $results_per_page           = -1; // wp_query » posts_per_page
 
 
	function __construct( $post_types = [ 'post', 'page' ] )
	{
		$this->set_post_types( $post_types );
 
		add_filter( 'posts_join',     [ $this, 'sql_query_join_post_and_meta_on_search' ], $this->wp_filter_priority );
		add_filter( 'posts_where',    [ $this, 'sql_query_where_replace' ],                $this->wp_filter_priority );
		add_filter( 'posts_distinct', [ $this, 'search_for_distinctive_results' ],         $this->wp_filter_priority );
		add_filter( 'pre_get_posts',  [ $this, 'manipulate_wp_query' ],                    $this->wp_filter_priority );
		//add_filter( 'posts_results',  [ $this, '' ], $this->wp_filter_priority );
	}
 
	public function set_post_types( $post_types = [] )
	{
		$this->limit_search_to_post_types = $post_types;
	}
 
	/**
	*
	* Für die Post-Metas einer temporären Tabelle hinzu, damit diese auch durchsuch werden
	*
	* @link: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
	*/
	public function sql_query_join_post_and_meta_on_search( $join_sql_query )
	{
	    global $wpdb;
 
	    if( $this->is_search() ){
	        $join_sql_query .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
	    }
 
	    return $join_sql_query;
	}
 
 
	/**
	 *
	 * Damit nicht nur im Title, sondern auch in einem Metafeld gesucht wird
	 *
	 * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
	 */
	public function sql_query_where_replace( $where_sql_query ) {
	    global $pagenow, $wpdb;
	    if ( $this->is_search() ) {
	        $where_sql_query = 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_sql_query );
	    }
	    return $where_sql_query;
	}
 
 
 
	/**
	 * Duplikate verhindern
	 *
	 * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
	 */
	public function search_for_distinctive_results( $distinct_mode_string ) {
	    global $wpdb;
	    if ( $this->is_search() ) {
	        return "DISTINCT";
	    }
	    return $distinct_mode_string;
	}
 
 
 
	/**
	 * [manipulate_query_var description]
	 *
	 * @link https://developer.wordpress.org/reference/hooks/pre_get_posts/
	 *
	 * @param  object|wp_query   $wp_query               [description]
	 * @return object|wp_query   [description]
	 */
	public function manipulate_wp_query( $wp_query ) {
 
		if ( $this->is_search() ) {
			$wp_query->set( 'posts_per_page', $this->results_per_page );
			$wp_query->set( 'post_type', $this->limit_search_to_post_types );
		}
 
		// Return query
		return $wp_query;
	}
 
	/**
	 * Alias Methode von WP Funktion is_search()
	 * Ist hier eine eigene Methode, falls noch mehr Bedingen hinzu kommen.
	 *
	 * @link: https://developer.wordpress.org/reference/functions/is_search/
	 *
	 * @return boolean   - true alls es sich um eine Suche handelt
	 */
	private function is_search()
	{
		$is_search = is_search();
		return $is_search;
	}
}

Page Tools