wp-multi-search.php aktualisiert
This commit is contained in:
		| @@ -1,325 +1,326 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Plugin Name: WP-Multi Search | ||||
|  * Plugin URI: https://git.viper.ipv64.net/M_Viper/WP-Multi-Search | ||||
|  * Description: Fügt eine Suchfunktion als Shortcode, Widget und Menüeintrag hinzu.(Shortcode: [display_search_form]) | ||||
|  * Version: 1.2 | ||||
|  * Author: M_Viper | ||||
|  * Author URI: https://m-viper.de | ||||
|  * Requires at least: 6.7.2 | ||||
|  * Tested up to: 6.7.2 | ||||
|  * License: GPL2 | ||||
|  * License URI: https://www.gnu.org/licenses/gpl-2.0.html | ||||
|  * Text Domain: wp-multi-search | ||||
|  * Tags: search Autor-search | ||||
|  */ | ||||
|  | ||||
|  if (!defined('ABSPATH')) { | ||||
|     exit; // Sicherheitsmaßnahme | ||||
| } | ||||
|  | ||||
| // 1️⃣ **Suchformular-Funktion mit integriertem CSS** | ||||
| function csp_search_form() { | ||||
|     ob_start(); | ||||
|     $search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all'; | ||||
|     ?> | ||||
|     <style> | ||||
|         .csp-search-form { | ||||
|             display: flex; | ||||
|             flex-direction: column; | ||||
|             gap: 8px; | ||||
|             max-width: auto; | ||||
|             margin: 10px auto; | ||||
|             padding: 15px; | ||||
|             background: #f8f9fa; | ||||
|             border-radius: 15px; | ||||
|             box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); | ||||
|         } | ||||
|  | ||||
|         .csp-search-fields { | ||||
|             display: flex; | ||||
|             gap: 8px; | ||||
|         } | ||||
|  | ||||
|         .csp-search-form input[type="text"] { | ||||
|             flex: 1; | ||||
|             padding: 10px; | ||||
|             border: 1px solid #ddd; | ||||
|             border-radius: 20px; | ||||
|             font-size: 16px; | ||||
|         } | ||||
|  | ||||
|         .csp-search-type { | ||||
|             display: flex; | ||||
|             gap: 10px; | ||||
|             margin-bottom: 10px; | ||||
|         } | ||||
|  | ||||
|         .csp-search-type label { | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             gap: 5px; | ||||
|             cursor: pointer; | ||||
|         } | ||||
|  | ||||
|         .csp-search-type input[type="radio"] { | ||||
|             margin: 0; | ||||
|         } | ||||
|  | ||||
|         .csp-search-form input[type="submit"] { | ||||
|             background: #0073aa; | ||||
|             color: white; | ||||
|             border: none; | ||||
|             padding: 10px 15px; | ||||
|             border-radius: 20px; | ||||
|             cursor: pointer; | ||||
|             font-size: 16px; | ||||
|             transition: background 0.3s; | ||||
|         } | ||||
|  | ||||
|         .csp-search-form input[type="submit"]:hover { | ||||
|             background: #005f8d; | ||||
|         } | ||||
|     </style> | ||||
|     <form class="csp-search-form" role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>"> | ||||
|         <div class="csp-search-type"> | ||||
|             <label> | ||||
|                 <input type="radio" name="search_type" value="all" <?php checked($search_type, 'all'); ?>> | ||||
|                 <?php _e('Alle Inhalte', 'textdomain'); ?> | ||||
|             </label> | ||||
|             <label> | ||||
|                 <input type="radio" name="search_type" value="title" <?php checked($search_type, 'title'); ?>> | ||||
|                 <?php _e('Nur Titel', 'textdomain'); ?> | ||||
|             </label> | ||||
|             <label> | ||||
|                 <input type="radio" name="search_type" value="guest_author" <?php checked($search_type, 'guest_author'); ?>> | ||||
|                 <?php _e('Nur Gastautoren', 'textdomain'); ?> | ||||
|             </label> | ||||
|         </div> | ||||
|         <div class="csp-search-fields"> | ||||
|             <input type="text" name="s" placeholder="🔍 Suchbegriff eingeben" value="<?php echo esc_attr(get_search_query()); ?>"> | ||||
|             <input type="submit" value="Suchen"> | ||||
|         </div> | ||||
|     </form> | ||||
|     <?php | ||||
|     return ob_get_clean(); | ||||
| } | ||||
|  | ||||
| // 2️⃣ **Shortcode für das Suchformular** | ||||
| add_shortcode('custom_search', 'csp_search_form'); | ||||
|  | ||||
| // 3️⃣ **Suchfeld als Widget** | ||||
| class CSP_Search_Widget extends WP_Widget { | ||||
|     public function __construct() { | ||||
|         parent::__construct( | ||||
|             'csp_search_widget', | ||||
|             __('Suche Widget', 'textdomain'), | ||||
|             array('description' => __('Suchfeld mit Optionen für Titel- und Gastautoren-Suche', 'textdomain')) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     public function widget($args, $instance) { | ||||
|         echo $args['before_widget']; | ||||
|         echo '<h3 class="widget-title">' . __('Suche', 'textdomain') . '</h3>'; | ||||
|         echo csp_search_form(); | ||||
|         echo $args['after_widget']; | ||||
|     } | ||||
| } | ||||
|  | ||||
| function csp_register_widget() { | ||||
|     register_widget('CSP_Search_Widget'); | ||||
| } | ||||
| add_action('widgets_init', 'csp_register_widget'); | ||||
|  | ||||
| // 4️⃣ **Einstellungsseite hinzufügen** | ||||
| function csp_add_menu_page() { | ||||
|     add_options_page( | ||||
|         'WP-Multi-Search Settings', | ||||
|         'WP-Multi-Search', | ||||
|         'manage_options', | ||||
|         'custom-search-settings', | ||||
|         'csp_render_settings_page' | ||||
|     ); | ||||
| } | ||||
| add_action('admin_menu', 'csp_add_menu_page'); | ||||
|  | ||||
| // 5️⃣ **Einstellungsseite rendern** | ||||
| function csp_render_settings_page() { | ||||
|     ?> | ||||
|     <div class="wrap"> | ||||
|         <h1>WP-Multi Search Settings</h1> | ||||
|         <form method="post" action="options.php"> | ||||
|             <?php | ||||
|             settings_fields('csp_settings_group'); | ||||
|             do_settings_sections('custom-search-settings'); | ||||
|             submit_button(); | ||||
|             ?> | ||||
|         </form> | ||||
|     </div> | ||||
|     <?php | ||||
| } | ||||
|  | ||||
| // 6️⃣ **Einstellungen registrieren** | ||||
| function csp_register_settings() { | ||||
|     register_setting('csp_settings_group', 'csp_shiftnav_position'); | ||||
|      | ||||
|     add_settings_section( | ||||
|         'csp_main_section', | ||||
|         'ShiftNav Position', | ||||
|         'csp_section_callback', | ||||
|         'custom-search-settings' | ||||
|     ); | ||||
|  | ||||
|     add_settings_field( | ||||
|         'csp_shiftnav_position_select', | ||||
|         'Select ShiftNav Position', | ||||
|         'csp_shiftnav_position_select_callback', | ||||
|         'custom-search-settings', | ||||
|         'csp_main_section' | ||||
|     ); | ||||
| } | ||||
| add_action('admin_init', 'csp_register_settings'); | ||||
|  | ||||
| // 7️⃣ **Callback für die Sektion** | ||||
| function csp_section_callback() { | ||||
|     echo 'Choose where to display the search form in ShiftNav:'; | ||||
| } | ||||
|  | ||||
| // 8️⃣ **Callback für das Auswahlfeld** | ||||
| function csp_shiftnav_position_select_callback() { | ||||
|     $positions = array( | ||||
|         'top' => 'Top of ShiftNav', | ||||
|         'bottom' => 'Bottom of ShiftNav', | ||||
|         'none' => 'Do not display in ShiftNav' | ||||
|     ); | ||||
|     $selected_position = get_option('csp_shiftnav_position', 'none'); | ||||
|      | ||||
|     echo '<select name="csp_shiftnav_position">'; | ||||
|     foreach ($positions as $value => $label) { | ||||
|         echo '<option value="' . esc_attr($value) . '" ' . selected($selected_position, $value, false) . '>' . esc_html($label) . '</option>'; | ||||
|     } | ||||
|     echo '</select>'; | ||||
| } | ||||
|  | ||||
| // 9️⃣ **Funktion zum Einfügen des Suchformulars in ShiftNav** | ||||
| function csp_insert_search_form_in_shiftnav($nav_menu, $args) { | ||||
|     // Überprüfen, ob es sich um das ShiftNav-Menü handelt | ||||
|     if ($args->theme_location !== 'shiftnav') { | ||||
|         return $nav_menu; | ||||
|     } | ||||
|  | ||||
|     $position = get_option('csp_shiftnav_position', 'none'); | ||||
|     if ($position === 'none') { | ||||
|         return $nav_menu; | ||||
|     } | ||||
|  | ||||
|     $search_form = '<li class="menu-item">' . csp_search_form() . '</li>'; | ||||
|  | ||||
|     if ($position === 'top') { | ||||
|         return $search_form . $nav_menu; | ||||
|     } elseif ($position === 'bottom') { | ||||
|         return $nav_menu . $search_form; | ||||
|     } | ||||
|  | ||||
|     return $nav_menu; | ||||
| } | ||||
| add_filter('wp_nav_menu_items', 'csp_insert_search_form_in_shiftnav', 10, 2); | ||||
|  | ||||
| // 🔟 **Aktualisierte Suchfunktion mit Suchtyp-Unterscheidung** | ||||
| function csp_custom_search_results($query) { | ||||
|     if (!is_admin() && $query->is_search() && $query->is_main_query()) { | ||||
|         $search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all'; | ||||
|         $search_term = $query->get('s'); | ||||
|  | ||||
|         switch($search_type) { | ||||
|             case 'title': | ||||
|                 $query->set('post_title_like', $search_term); | ||||
|                 $query->set('s', ''); | ||||
|                 add_filter('posts_where', 'csp_title_search_where', 10, 2); | ||||
|                 break; | ||||
|  | ||||
|             case 'guest_author': | ||||
|                 $meta_query = array( | ||||
|                     array( | ||||
|                         'key' => '_guest_author', | ||||
|                         'value' => $search_term, | ||||
|                         'compare' => '=' | ||||
|                     ) | ||||
|                 ); | ||||
|                 $query->set('meta_query', $meta_query); | ||||
|                 $query->set('s', ''); | ||||
|                 $query->set('post_type', 'post'); | ||||
|                 break; | ||||
|  | ||||
|             default: // 'all' | ||||
|                 $query->set('_meta_or_title', $search_term); | ||||
|                 add_filter('posts_search', 'csp_custom_search_where', 10, 2); | ||||
|                 add_filter('posts_join', 'csp_custom_search_join', 10, 2); | ||||
|                 add_filter('posts_groupby', 'csp_custom_search_groupby', 10, 2); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| add_action('pre_get_posts', 'csp_custom_search_results'); | ||||
|  | ||||
| // 1️⃣1️⃣ **Hilfsfunktionen für verschiedene Suchtypen** | ||||
| function csp_title_search_where($where, $query) { | ||||
|     global $wpdb; | ||||
|     if ($search_term = $query->get('post_title_like')) { | ||||
|         $where .= $wpdb->prepare( | ||||
|             " AND {$wpdb->posts}.post_title LIKE %s", | ||||
|             '%' . $wpdb->esc_like($search_term) . '%' | ||||
|         ); | ||||
|     } | ||||
|     return $where; | ||||
| } | ||||
|  | ||||
| function csp_custom_search_where($where, $query) { | ||||
|     global $wpdb; | ||||
|     if ($search_term = $query->get('_meta_or_title')) { | ||||
|         $search = '%' . $wpdb->esc_like($search_term) . '%'; | ||||
|         $where .= $wpdb->prepare( | ||||
|             " OR ({$wpdb->posts}.post_title LIKE %s) | ||||
|               OR ({$wpdb->posts}.post_content LIKE %s) | ||||
|               OR ({$wpdb->posts}.post_excerpt LIKE %s) | ||||
|               OR (guest_author.meta_value LIKE %s) | ||||
|               OR ({$wpdb->users}.display_name LIKE %s)", | ||||
|             $search, $search, $search, $search, $search | ||||
|         ); | ||||
|     } | ||||
|     return $where; | ||||
| } | ||||
|  | ||||
| function csp_custom_search_join($join, $query) { | ||||
|     global $wpdb; | ||||
|     if ($query->get('_meta_or_title')) { | ||||
|         $join .= " LEFT JOIN {$wpdb->postmeta} guest_author ON ({$wpdb->posts}.ID = guest_author.post_id AND guest_author.meta_key = '_guest_author')"; | ||||
|         $join .= " LEFT JOIN {$wpdb->users} ON ({$wpdb->posts}.post_author = {$wpdb->users}.ID)"; | ||||
|     } | ||||
|     return $join; | ||||
| } | ||||
|  | ||||
| function csp_custom_search_groupby($groupby, $query) { | ||||
|     global $wpdb; | ||||
|     if ($query->get('_meta_or_title')) { | ||||
|         $groupby = "{$wpdb->posts}.ID"; | ||||
|     } | ||||
|     return $groupby; | ||||
| } | ||||
|  | ||||
| // 1️⃣2️⃣ **Hilfsfunktion für Gastautoren-Suche** | ||||
| function csp_guest_author_search_where($where, $query) { | ||||
|     global $wpdb; | ||||
|     if ($query->get('meta_query')) { | ||||
|         $where .= " AND EXISTS ( | ||||
|             SELECT 1 FROM {$wpdb->postmeta} | ||||
|             WHERE {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID | ||||
|             AND {$wpdb->postmeta}.meta_key = '_guest_author' | ||||
|             AND {$wpdb->postmeta}.meta_value != '' | ||||
|         )"; | ||||
|     } | ||||
|     return $where; | ||||
| } | ||||
| add_filter('posts_where', 'csp_guest_author_search_where', 10, 2); | ||||
|  | ||||
| ?> | ||||
| <?php | ||||
| /** | ||||
|  * Plugin Name: WP-Multi Search | ||||
|  * Plugin URI: https://git.viper.ipv64.net/M_Viper/WP-Multi-Search | ||||
|  * Description: Fügt eine Suchfunktion als Shortcode, Widget und Menüeintrag hinzu.(Shortcode: [custom_search]) | ||||
|  * Version: 1.3 | ||||
|  * Author: M_Viper | ||||
|  * Author URI: https://m-viper.de | ||||
|  * Requires at least: 6.7.2 | ||||
|  * Tested up to: 6.7.2 | ||||
|  * License: GPL2 | ||||
|  * License URI: https://www.gnu.org/licenses/gpl-2.0.html | ||||
|  * Text Domain: wp-multi-search | ||||
|  * Tags: search Autor-search | ||||
|  */ | ||||
|  | ||||
| if (!defined('ABSPATH')) { | ||||
|     exit; // Sicherheitsmaßnahme | ||||
| } | ||||
|  | ||||
| // 1️⃣ **Suchformular-Funktion mit integriertem CSS** | ||||
| function csp_search_form() { | ||||
|     ob_start(); | ||||
|     $search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all'; | ||||
|     ?> | ||||
|     <style> | ||||
|         .csp-search-form { | ||||
|             display: flex; | ||||
|             flex-direction: column; | ||||
|             gap: 8px; | ||||
|             max-width: auto; | ||||
|             margin: 10px auto; | ||||
|             padding: 15px; | ||||
|             background: #f8f9fa; | ||||
|             border-radius: 15px; | ||||
|             box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); | ||||
|         } | ||||
|  | ||||
|         .csp-search-fields { | ||||
|             display: flex; | ||||
|             gap: 8px; | ||||
|         } | ||||
|  | ||||
|         .csp-search-form input[type="text"] { | ||||
|             flex: 1; | ||||
|             padding: 10px; | ||||
|             border: 1px solid #ddd; | ||||
|             border-radius: 20px; | ||||
|             font-size: 16px; | ||||
|         } | ||||
|  | ||||
|         .csp-search-type { | ||||
|             display: flex; | ||||
|             gap: 10px; | ||||
|             margin-bottom: 10px; | ||||
|         } | ||||
|  | ||||
|         .csp-search-type label { | ||||
|             display: flex; | ||||
|             align-items: center; | ||||
|             gap: 5px; | ||||
|             cursor: pointer; | ||||
|         } | ||||
|  | ||||
|         .csp-search-type input[type="radio"] { | ||||
|             margin: 0; | ||||
|         } | ||||
|  | ||||
|         .csp-search-form input[type="submit"] { | ||||
|             background: #0073aa; | ||||
|             color: white; | ||||
|             border: none; | ||||
|             padding: 10px 15px; | ||||
|             border-radius: 20px; | ||||
|             cursor: pointer; | ||||
|             font-size: 16px; | ||||
|             transition: background 0.3s; | ||||
|         } | ||||
|  | ||||
|         .csp-search-form input[type="submit"]:hover { | ||||
|             background: #005f8d; | ||||
|         } | ||||
|     </style> | ||||
|     <form class="csp-search-form" role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>"> | ||||
|         <div class="csp-search-type"> | ||||
|             <label> | ||||
|                 <input type="radio" name="search_type" value="all" <?php checked($search_type, 'all'); ?>> | ||||
|                 <?php _e('Alle Inhalte', 'textdomain'); ?> | ||||
|             </label> | ||||
|             <label> | ||||
|                 <input type="radio" name="search_type" value="title" <?php checked($search_type, 'title'); ?>> | ||||
|                 <?php _e('Titel', 'textdomain'); ?> | ||||
|             </label> | ||||
|             <label> | ||||
|                 <input type="radio" name="search_type" value="guest_author" <?php checked($search_type, 'guest_author'); ?>> | ||||
|                 <?php _e('Autoren', 'textdomain'); ?> | ||||
|             </label> | ||||
|         </div> | ||||
|         <div class="csp-search-fields"> | ||||
|             <input type="text" name="s" placeholder="🔍 Suchbegriff eingeben" value="<?php echo esc_attr(get_search_query()); ?>"> | ||||
|              | ||||
|         </div> | ||||
|         <input type="submit" value="Suchen"> | ||||
|     </form> | ||||
|     <?php | ||||
|     return ob_get_clean(); | ||||
| } | ||||
|  | ||||
| // 2️⃣ **Shortcode für das Suchformular** | ||||
| add_shortcode('custom_search', 'csp_search_form'); | ||||
|  | ||||
| // 3️⃣ **Suchfeld als Widget** | ||||
| class CSP_Search_Widget extends WP_Widget { | ||||
|     public function __construct() { | ||||
|         parent::__construct( | ||||
|             'csp_search_widget', | ||||
|             __('Suche Widget', 'textdomain'), | ||||
|             array('description' => __('Suchfeld mit Optionen für Titel- und Gastautoren-Suche', 'textdomain')) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     public function widget($args, $instance) { | ||||
|         echo $args['before_widget']; | ||||
|         echo '<h3 class="widget-title">' . __('Suche', 'textdomain') . '</h3>'; | ||||
|         echo csp_search_form(); | ||||
|         echo $args['after_widget']; | ||||
|     } | ||||
| } | ||||
|  | ||||
| function csp_register_widget() { | ||||
|     register_widget('CSP_Search_Widget'); | ||||
| } | ||||
| add_action('widgets_init', 'csp_register_widget'); | ||||
|  | ||||
| // 4️⃣ **Einstellungsseite hinzufügen** | ||||
| function csp_add_menu_page() { | ||||
|     add_options_page( | ||||
|         'WP-Multi-Search Settings', | ||||
|         'WP-Multi-Search', | ||||
|         'manage_options', | ||||
|         'custom-search-settings', | ||||
|         'csp_render_settings_page' | ||||
|     ); | ||||
| } | ||||
| add_action('admin_menu', 'csp_add_menu_page'); | ||||
|  | ||||
| // 5️⃣ **Einstellungsseite rendern** | ||||
| function csp_render_settings_page() { | ||||
|     ?> | ||||
|     <div class="wrap"> | ||||
|         <h1>WP-Multi Search Settings</h1> | ||||
|         <form method="post" action="options.php"> | ||||
|             <?php | ||||
|             settings_fields('csp_settings_group'); | ||||
|             do_settings_sections('custom-search-settings'); | ||||
|             submit_button(); | ||||
|             ?> | ||||
|         </form> | ||||
|     </div> | ||||
|     <?php | ||||
| } | ||||
|  | ||||
| // 6️⃣ **Einstellungen registrieren** | ||||
| function csp_register_settings() { | ||||
|     register_setting('csp_settings_group', 'csp_shiftnav_position'); | ||||
|      | ||||
|     add_settings_section( | ||||
|         'csp_main_section', | ||||
|         'ShiftNav Position', | ||||
|         'csp_section_callback', | ||||
|         'custom-search-settings' | ||||
|     ); | ||||
|  | ||||
|     add_settings_field( | ||||
|         'csp_shiftnav_position_select', | ||||
|         'Select ShiftNav Position', | ||||
|         'csp_shiftnav_position_select_callback', | ||||
|         'custom-search-settings', | ||||
|         'csp_main_section' | ||||
|     ); | ||||
| } | ||||
| add_action('admin_init', 'csp_register_settings'); | ||||
|  | ||||
| // 7️⃣ **Callback für die Sektion** | ||||
| function csp_section_callback() { | ||||
|     echo 'Choose where to display the search form in ShiftNav:'; | ||||
| } | ||||
|  | ||||
| // 8️⃣ **Callback für das Auswahlfeld** | ||||
| function csp_shiftnav_position_select_callback() { | ||||
|     $positions = array( | ||||
|         'top' => 'Top of ShiftNav', | ||||
|         'bottom' => 'Bottom of ShiftNav', | ||||
|         'none' => 'Do not display in ShiftNav' | ||||
|     ); | ||||
|     $selected_position = get_option('csp_shiftnav_position', 'none'); | ||||
|      | ||||
|     echo '<select name="csp_shiftnav_position">'; | ||||
|     foreach ($positions as $value => $label) { | ||||
|         echo '<option value="' . esc_attr($value) . '" ' . selected($selected_position, $value, false) . '>' . esc_html($label) . '</option>'; | ||||
|     } | ||||
|     echo '</select>'; | ||||
| } | ||||
|  | ||||
| // 9️⃣ **Funktion zum Einfügen des Suchformulars in ShiftNav** | ||||
| function csp_insert_search_form_in_shiftnav($nav_menu, $args) { | ||||
|     // Überprüfen, ob es sich um das ShiftNav-Menü handelt | ||||
|     if ($args->theme_location !== 'shiftnav') { | ||||
|         return $nav_menu; | ||||
|     } | ||||
|  | ||||
|     $position = get_option('csp_shiftnav_position', 'none'); | ||||
|     if ($position === 'none') { | ||||
|         return $nav_menu; | ||||
|     } | ||||
|  | ||||
|     $search_form = '<li class="menu-item">' . csp_search_form() . '</li>'; | ||||
|  | ||||
|     if ($position === 'top') { | ||||
|         return $search_form . $nav_menu; | ||||
|     } elseif ($position === 'bottom') { | ||||
|         return $nav_menu . $search_form; | ||||
|     } | ||||
|  | ||||
|     return $nav_menu; | ||||
| } | ||||
| add_filter('wp_nav_menu_items', 'csp_insert_search_form_in_shiftnav', 10, 2); | ||||
|  | ||||
| // 🔟 **Aktualisierte Suchfunktion mit Suchtyp-Unterscheidung** | ||||
| function csp_custom_search_results($query) { | ||||
|     if (!is_admin() && $query->is_search() && $query->is_main_query()) { | ||||
|         $search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all'; | ||||
|         $search_term = $query->get('s'); | ||||
|  | ||||
|         switch($search_type) { | ||||
|             case 'title': | ||||
|                 $query->set('post_title_like', $search_term); | ||||
|                 $query->set('s', ''); | ||||
|                 add_filter('posts_where', 'csp_title_search_where', 10, 2); | ||||
|                 break; | ||||
|  | ||||
|             case 'guest_author': | ||||
|                 $meta_query = array( | ||||
|                     array( | ||||
|                         'key' => '_guest_author', | ||||
|                         'value' => $search_term, | ||||
|                         'compare' => '=' | ||||
|                     ) | ||||
|                 ); | ||||
|                 $query->set('meta_query', $meta_query); | ||||
|                 $query->set('s', ''); | ||||
|                 $query->set('post_type', 'post'); | ||||
|                 break; | ||||
|  | ||||
|             default: // 'all' | ||||
|                 $query->set('_meta_or_title', $search_term); | ||||
|                 add_filter('posts_search', 'csp_custom_search_where', 10, 2); | ||||
|                 add_filter('posts_join', 'csp_custom_search_join', 10, 2); | ||||
|                 add_filter('posts_groupby', 'csp_custom_search_groupby', 10, 2); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| add_action('pre_get_posts', 'csp_custom_search_results'); | ||||
|  | ||||
| // 1️⃣1️⃣ **Hilfsfunktionen für verschiedene Suchtypen** | ||||
| function csp_title_search_where($where, $query) { | ||||
|     global $wpdb; | ||||
|     if ($search_term = $query->get('post_title_like')) { | ||||
|         $where .= $wpdb->prepare( | ||||
|             " AND {$wpdb->posts}.post_title LIKE %s", | ||||
|             '%' . $wpdb->esc_like($search_term) . '%' | ||||
|         ); | ||||
|     } | ||||
|     return $where; | ||||
| } | ||||
|  | ||||
| function csp_custom_search_where($where, $query) { | ||||
|     global $wpdb; | ||||
|     if ($search_term = $query->get('_meta_or_title')) { | ||||
|         $search = '%' . $wpdb->esc_like($search_term) . '%'; | ||||
|         $where .= $wpdb->prepare( | ||||
|             " OR ({$wpdb->posts}.post_title LIKE %s) | ||||
|               OR ({$wpdb->posts}.post_content LIKE %s) | ||||
|               OR ({$wpdb->posts}.post_excerpt LIKE %s) | ||||
|               OR (guest_author.meta_value LIKE %s) | ||||
|               OR ({$wpdb->users}.display_name LIKE %s)", | ||||
|             $search, $search, $search, $search, $search | ||||
|         ); | ||||
|     } | ||||
|     return $where; | ||||
| } | ||||
|  | ||||
| function csp_custom_search_join($join, $query) { | ||||
|     global $wpdb; | ||||
|     if ($query->get('_meta_or_title')) { | ||||
|         $join .= " LEFT JOIN {$wpdb->postmeta} guest_author ON ({$wpdb->posts}.ID = guest_author.post_id AND guest_author.meta_key = '_guest_author')"; | ||||
|         $join .= " LEFT JOIN {$wpdb->users} ON ({$wpdb->posts}.post_author = {$wpdb->users}.ID)"; | ||||
|     } | ||||
|     return $join; | ||||
| } | ||||
|  | ||||
| function csp_custom_search_groupby($groupby, $query) { | ||||
|     global $wpdb; | ||||
|     if ($query->get('_meta_or_title')) { | ||||
|         $groupby = "{$wpdb->posts}.ID"; | ||||
|     } | ||||
|     return $groupby; | ||||
| } | ||||
|  | ||||
| // 1️⃣2️⃣ **Hilfsfunktion für Gastautoren-Suche** | ||||
| function csp_guest_author_search_where($where, $query) { | ||||
|     global $wpdb; | ||||
|     if ($query->get('meta_query')) { | ||||
|         $where .= " AND EXISTS ( | ||||
|             SELECT 1 FROM {$wpdb->postmeta} | ||||
|             WHERE {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID | ||||
|             AND {$wpdb->postmeta}.meta_key = '_guest_author' | ||||
|             AND {$wpdb->postmeta}.meta_value != '' | ||||
|         )"; | ||||
|     } | ||||
|     return $where; | ||||
| } | ||||
| add_filter('posts_where', 'csp_guest_author_search_where', 10, 2); | ||||
|  | ||||
| ?> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user