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; | ||
} | } | ||
} | } | ||
+ | |||
</ | </ |