Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
programmieren:wordpress:nach_cutom_fields_suchen [2022/08/17 15:37] – old revision restored (2022/08/17 11:48) jgehrkeprogrammieren: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  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 [[https://outsourcify.net/how-to-search-in-acfs-custom-fields-in-wordpress/|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. +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 [[https://outsourcify.net/how-to-search-in-acfs-custom-fields-in-wordpress/|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.  
 + 
 +Zusätzlich ist noch ein Fix eingebaut, damit das Script auch Funktionen läuft, die WP Filter supressen. Lösung kam aus einem [[https://alex.blog/2010/02/02/wordpress-using-filters-with-get_posts/|Blog Beitrag (alex.blog)]] von 2010. 
 + 
 +__**Hinweise zur Nutzung:**__ 
 + 
 +  * **Manche AJAX-Aufrufe werden nicht als Suche interpretiert**. Dann bitte in der Methode ''is_search()'' innerhalb der Klasse eine weitere Abfrage hinzufügen. In diesem Beispiel ist eine Abfrage drin für das Flatsome Theme 
 +  * **get_posts() unterdrückt Filter**. darum ist in der Methode ''manipulate_wp_query()'' ein ''$wp_query->set( 'suppress_filters', false );'' eingebaut - das kann aber bedeuten, dass eventuell Suchergebnisse anders ausgegeben werden als reguläre ungefilterte Ausgaben
  
 <code php> <code php>
 <?php <?php
 +
 /* /*
  HOOK FILTER IN SEARCH  HOOK FILTER IN SEARCH
Line 28: Line 38:
  
  private $wp_filter_priority         = 100;  private $wp_filter_priority         = 100;
 + //private $acf_post_types             = [ 'acf-field-group', 'acf-field' ]; // ungenuzt
  private $limit_search_to_post_types = []; // wp_query » post_types  private $limit_search_to_post_types = []; // wp_query » post_types
  private $results_per_page           = -1; // wp_query » posts_per_page  private $results_per_page           = -1; // wp_query » posts_per_page
Line 40: Line 51:
  add_filter( 'posts_where',    [ $this, 'sql_query_where_replace' ],                $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_distinct', [ $this, 'search_for_distinctive_results' ],         $this->wp_filter_priority );
- //add_filter( 'posts_results',  [ $this, '' ], $this->wp_filter_priority );+ add_filter( 'posts_results',  [ $this, 'filter_results' ], $this->wp_filter_priority );
  }  }
  
Line 118: Line 129:
      }      }
      return $distinct_mode_string;      return $distinct_mode_string;
 + }
 +
 +
 +
 + /**
 + *
 + *
 + * @link https://developer.wordpress.org/reference/hooks/posts_results/
 + */
 + public function filter_results( $post_objects_array ) {
 +
 +     return $post_objects_array ;
  }  }
  
Line 133: Line 156:
  {  {
  $is_search_by_wpquery    = is_search();  $is_search_by_wpquery    = is_search();
 + $is_admin                = is_admin();
 + $is_acf_call             = $this->is_acf_call();
  $is_flatsome_ajax_search = false;  $is_flatsome_ajax_search = false;
  
Line 142: Line 167:
  }  }
  
- $is_search = ( $is_flatsome_ajax_search | $is_flatsome_ajax_search ) ? true : false;+ $is_search = ( $is_search_by_wpquery & !$is_admin & !$is_acf_call ) | $is_flatsome_ajax_search ) ? true : false;
  
  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   = debug_backtrace();
 + $is_acf_call = false;
 + foreach ($backtrace as $key => $stack) {
 + $is_acf_file     = (strpos( $stack["file"], 'advanced-custom-fields-pro' ) !== 0 ) ? true : false;
 + $is_acf_function = (strpos( $stack["function"], 'get_field' ) !== 0 ) ? true : false;
 +
 + if( $is_acf_file | $is_acf_function ){
 + $is_acf_call = true;
 + break;
 + }
 + }
 +
 + return $is_acf_call;
  }  }
 } }
 +
 </code> </code>

Page Tools