From e7ff1ee33e3b65832551a8424e83c81c5c222d99 Mon Sep 17 00:00:00 2001 From: M_Viper <admin@m-viper.de> Date: Sun, 16 Mar 2025 19:10:23 +0000 Subject: [PATCH] custom-search-plugin.php aktualisiert --- custom-search-plugin.php | 616 +++++++++++++++++++-------------------- 1 file changed, 308 insertions(+), 308 deletions(-) diff --git a/custom-search-plugin.php b/custom-search-plugin.php index b7d779e..b7142b1 100644 --- a/custom-search-plugin.php +++ b/custom-search-plugin.php @@ -1,308 +1,308 @@ -<?php -/** - * Plugin Name: Custom Search Plugin - * Plugin URI: - * Description: Fügt eine Suchfunktion als Shortcode, Widget und Menüeintrag hinzu.(Shortcode: [display_search_form]) - * Version: 1.1 - * 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-search - * Tags: search Autorsearch - */ - -if (!defined('ABSPATH')) { - exit; // Sicherheitsmaßnahme -} - -// 1️⃣ **Aktualisiertes Suchformular mit Umschaltoption** -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: 400px; - 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️⃣ **Aktualisiertes 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( - 'Custom Search Settings', - 'Custom 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>Custom 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_selected_menu'); - - add_settings_section( - 'csp_main_section', - 'Menu Selection', - 'csp_section_callback', - 'custom-search-settings' - ); - - add_settings_field( - 'csp_menu_select', - 'Select Menu', - 'csp_menu_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 which menu to display the search form in:'; -} - -// 8️⃣ **Callback für das Auswahlfeld** -function csp_menu_select_callback() { - $menus = wp_get_nav_menus(); - $selected_menu = get_option('csp_selected_menu'); - - echo '<select name="csp_selected_menu">'; - echo '<option value="">Select a menu</option>'; - foreach ($menus as $menu) { - echo '<option value="' . $menu->term_id . '" ' . selected($selected_menu, $menu->term_id, false) . '>' . esc_html($menu->name) . '</option>'; - } - echo '</select>'; -} - -// 9️⃣ **Suchfeld zum ausgewählten Menü hinzufügen** -function csp_add_search_to_menus($items, $args) { - $selected_menu = get_option('csp_selected_menu'); - if ($selected_menu && $args->menu->term_id == $selected_menu) { - $items .= '<li class="menu-item search-menu-item">' . csp_search_form() . '</li>'; - } - return $items; -} -add_filter('wp_nav_menu_items', 'csp_add_search_to_menus', 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: Custom Search Plugin + * Plugin URI: https://git.viper.ipv64.net/M_Viper/WP-Suche + * Description: Fügt eine Suchfunktion als Shortcode, Widget und Menüeintrag hinzu.(Shortcode: [display_search_form]) + * Version: 1.1 + * 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-search + * Tags: search Autor-search + */ + +if (!defined('ABSPATH')) { + exit; // Sicherheitsmaßnahme +} + +// 1️⃣ **Aktualisiertes Suchformular mit Umschaltoption** +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: 400px; + 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️⃣ **Aktualisiertes 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( + 'Custom Search Settings', + 'Custom 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>Custom 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_selected_menu'); + + add_settings_section( + 'csp_main_section', + 'Menu Selection', + 'csp_section_callback', + 'custom-search-settings' + ); + + add_settings_field( + 'csp_menu_select', + 'Select Menu', + 'csp_menu_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 which menu to display the search form in:'; +} + +// 8️⃣ **Callback für das Auswahlfeld** +function csp_menu_select_callback() { + $menus = wp_get_nav_menus(); + $selected_menu = get_option('csp_selected_menu'); + + echo '<select name="csp_selected_menu">'; + echo '<option value="">Select a menu</option>'; + foreach ($menus as $menu) { + echo '<option value="' . $menu->term_id . '" ' . selected($selected_menu, $menu->term_id, false) . '>' . esc_html($menu->name) . '</option>'; + } + echo '</select>'; +} + +// 9️⃣ **Suchfeld zum ausgewählten Menü hinzufügen** +function csp_add_search_to_menus($items, $args) { + $selected_menu = get_option('csp_selected_menu'); + if ($selected_menu && $args->menu->term_id == $selected_menu) { + $items .= '<li class="menu-item search-menu-item">' . csp_search_form() . '</li>'; + } + return $items; +} +add_filter('wp_nav_menu_items', 'csp_add_search_to_menus', 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); + +?>