This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| programmieren:wordpress:nach_cutom_fields_suchen [2022/08/17 11:48] – jgehrke | programmieren:wordpress:nach_cutom_fields_suchen [2022/12/17 12:28] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Wordpress: Suche mit Custom Fields oder ACF Feldern ====== | ====== Wordpress: Suche mit Custom Fields oder ACF Feldern ====== | ||
| - | Dies ist ein Beispiel wie man in der Wordpress | + | Dies ist ein Beispiel wie man in der Wordpress |
| + | |||
| + | Der Code Ursprung basiert auf diesem [[https:// | ||
| + | |||
| + | Zusätzlich ist noch ein Fix eingebaut, damit das Script auch Funktionen läuft, die WP Filter supressen. Lösung kam aus einem [[https:// | ||
| + | |||
| + | __**Hinweise zur Nutzung: | ||
| + | |||
| + | * **Manche AJAX-Aufrufe werden nicht als Suche interpretiert**. Dann bitte in der Methode '' | ||
| + | * **get_posts() unterdrückt Filter**. darum ist in der Methode '' | ||
| <code php> | <code php> | ||
| <?php | <?php | ||
| - | |||
| - | namespace optionaler_namespace\deines_plugins; | ||
| /* | /* | ||
| - | HOOK FILTER | + | HOOK FILTER |
| */ | */ | ||
| - | $post_types = [ ' | + | $post_types = [ ' |
| new SearchWithCustomFields( $post_types ); | new SearchWithCustomFields( $post_types ); | ||
| Line 31: | Line 38: | ||
| private $wp_filter_priority | private $wp_filter_priority | ||
| + | //private $acf_post_types | ||
| private $limit_search_to_post_types = []; // wp_query » post_types | private $limit_search_to_post_types = []; // wp_query » post_types | ||
| private $results_per_page | private $results_per_page | ||
| Line 39: | Line 47: | ||
| $this-> | $this-> | ||
| + | add_filter( ' | ||
| add_filter( ' | add_filter( ' | ||
| add_filter( ' | add_filter( ' | ||
| add_filter( ' | add_filter( ' | ||
| - | add_filter( ' | + | add_filter( ' |
| - | //add_filter( ' | + | |
| } | } | ||
| - | public function set_post_types( $post_types = [] ) | + | public function set_post_types( $post_types = [] ) { $this-> |
| - | { | + | |
| - | $this-> | + | |
| + | |||
| + | /** | ||
| + | * [manipulate_query_var description] | ||
| + | * | ||
| + | * @link https:// | ||
| + | * | ||
| + | * @param | ||
| + | * @return object|wp_query | ||
| + | */ | ||
| + | public function manipulate_wp_query( & | ||
| + | |||
| + | if ( $this-> | ||
| + | $wp_query-> | ||
| + | $wp_query-> | ||
| + | |||
| + | // wichtig, weil get_posts( | ||
| + | $wp_query-> | ||
| + | } | ||
| + | |||
| + | // Return query | ||
| + | return $wp_query; | ||
| } | } | ||
| + | |||
| + | |||
| /** | /** | ||
| Line 93: | Line 124: | ||
| */ | */ | ||
| public function search_for_distinctive_results( $distinct_mode_string ) { | public function search_for_distinctive_results( $distinct_mode_string ) { | ||
| - | global $wpdb; | + | |
| if ( $this-> | if ( $this-> | ||
| return " | return " | ||
| Line 103: | Line 134: | ||
| /** | /** | ||
| - | * [manipulate_query_var description] | ||
| * | * | ||
| - | * @link https:// | ||
| * | * | ||
| - | * @param object|wp_query | + | * @link https:// |
| - | * @return object|wp_query | + | |
| */ | */ | ||
| - | public function | + | public function |
| - | if ( $this-> | + | |
| - | $wp_query-> | + | |
| - | $wp_query-> | + | |
| - | } | + | |
| - | + | ||
| - | // Return query | + | |
| - | return $wp_query; | + | |
| } | } | ||
| + | |||
| + | |||
| /** | /** | ||
| Line 131: | Line 155: | ||
| private function is_search() | private function is_search() | ||
| { | { | ||
| - | $is_search = is_search(); | + | $is_search_by_wpquery |
| + | $is_admin | ||
| + | $is_acf_call | ||
| + | $is_flatsome_ajax_search = false; | ||
| + | |||
| + | /* Die Flatsome Theme Ajax Suche wird nicht als Suche erkannt, darum der Work Around */ | ||
| + | if( wp_doing_ajax() ){ | ||
| + | // $_REQUEST[' | ||
| + | // $_REQUEST[' | ||
| + | $is_flatsome_ajax_search = ( $_REQUEST[' | ||
| + | } | ||
| + | |||
| + | $is_search | ||
| return $is_search; | return $is_search; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * | ||
| + | * | ||
| + | * Prüft ob die Suche durch ein ACF Query ausgelöst wurde | ||
| + | * | ||
| + | * ACF & die Beschränkung nach Post_Types vertägt sich nicht, weil | ||
| + | * ACF mit eigenen Posttypes kommt. Darum muss geprüft werden, dass | ||
| + | * keine Beschränkung in der Suche vorgenommen wird, wenn der call | ||
| + | * über ACF kommt. | ||
| + | * | ||
| + | * Bisher noch keine bessere Lösung gefunden, als den Callstack | ||
| + | * abzufragen. | ||
| + | * | ||
| + | * @return boolean [description] | ||
| + | */ | ||
| + | private function is_acf_call() | ||
| + | { | ||
| + | $backtrace | ||
| + | $is_acf_call = false; | ||
| + | foreach ($backtrace as $key => $stack) { | ||
| + | $is_acf_file | ||
| + | $is_acf_function = (strpos( $stack[" | ||
| + | |||
| + | if( $is_acf_file | $is_acf_function ){ | ||
| + | $is_acf_call = true; | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | return $is_acf_call; | ||
| } | } | ||
| } | } | ||
| + | |||
| </ | </ | ||