This is an old revision of the document!


<?php

/*

HOOK FILTER IN SEARCH

*/ $post_types = [ 'post', 'page', 'dv_betriebe' ]; 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( 'pre_get_posts', [ $this, 'manipulate_wp_query' ], $this→wp_filter_priority ); 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( 'posts_results', [ $this, '' ], $this→wp_filter_priority ); } public function set_post_types( $post_types = [] ) { $this→limit_search_to_post_types = $post_types; } / * [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 ); wichtig, weil get_posts( $args ) Filter unterdrückt und es sonst nich geht $wp_query→set( 'suppress_filters', false ); } Return query return $wp_query; } / * * 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 ) { if ( $this→is_search() ) { return “DISTINCT”; } return $distinct_mode_string; } /** * 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_by_wpquery = is_search(); $is_flatsome_ajax_search = false; /* Die Flatsome Theme Ajax Suche wird nicht als Suche erkannt, darum der Work Around */ if( wp_doing_ajax() ){ $_REQUEST['action'] = “flatsome_ajax_search_products” $_REQUEST['query'] = “Search Term Example” $is_flatsome_ajax_search = ( $_REQUEST['action'] === 'flatsome_ajax_search_products' ) ? true : false;; } $is_search = ( $is_flatsome_ajax_search | $is_flatsome_ajax_search ) ? true : false; return $is_search; } }