Compare commits

..

7 Commits
1.2 ... main

View File

@ -1,325 +1,305 @@
<?php <?php
/** /**
* Plugin Name: WP-Multi Search * Plugin Name: WP Multi Search
* Plugin URI: https://git.viper.ipv64.net/M_Viper/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]) * Description: Fügt eine Suchfunktion als Shortcode, Widget und Menüeintrag hinzu. (Shortcode: [custom_search])
* Version: 1.2 * Version: 1.6
* Author: M_Viper * Author: M_Viper
* Author URI: https://m-viper.de * Author URI: https://m-viper.de
* Requires at least: 6.7.2 * Requires at least: 6.7.2
* Tested up to: 6.7.2 * Tested up to: 6.7.2
* License: GPL2 * License: GPL2
* License URI: https://www.gnu.org/licenses/gpl-2.0.html * License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: wp-multi-search * Text Domain: wp-multi-search
* Tags: search Autor-search * Tags: search, author-search
*/ */
if (!defined('ABSPATH')) { if (!defined('ABSPATH')) {
exit; // Sicherheitsmaßnahme exit;
} }
// 1⃣ **Suchformular-Funktion mit integriertem CSS** /*
function csp_search_form() { * WP Multi Toolkit Prüfung
ob_start(); */
$search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all';
?> // Funktion zur Überprüfung des WP Multi Toolkit Plugins
<style> function wp_multi_search_check_dependency() {
.csp-search-form { if (!function_exists('is_plugin_active')) {
display: flex; include_once(ABSPATH . 'wp-admin/includes/plugin.php');
flex-direction: column; }
gap: 8px;
max-width: auto; // Prüft, ob WP Multi Toolkit installiert und aktiv ist
margin: 10px auto; if (!is_plugin_active('wp-multi-toolkit/wp-multi-toolkit.php')) {
padding: 15px; add_action('admin_notices', 'wp_multi_search_dependency_notice');
background: #f8f9fa; return false;
border-radius: 15px; }
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); return true;
} }
.csp-search-fields { // Fehlermeldung für Admin-Bereich mit Download-Button
display: flex; function wp_multi_search_dependency_notice() {
gap: 8px; ?>
} <div class="notice notice-error">
<p>
.csp-search-form input[type="text"] { <?php _e('Das Plugin "WP Multi Search" benötigt "WP Multi Toolkit", um zu funktionieren. Bitte installieren und aktivieren Sie "WP Multi Toolkit".', 'wp-multi-search'); ?>
flex: 1; <a href="https://git.viper.ipv64.net/M_Viper/wp-multi-toolkit/releases" target="_blank" class="button button-primary" style="margin-left: 10px;">
padding: 10px; <?php _e('WP Multi Toolkit herunterladen', 'wp-multi-search'); ?>
border: 1px solid #ddd; </a>
border-radius: 20px; </p>
font-size: 16px; </div>
} <?php
}
.csp-search-type {
display: flex; // Plugin nur initialisieren, wenn Abhängigkeit erfüllt ist
gap: 10px; if (wp_multi_search_check_dependency()) {
margin-bottom: 10px; // Hier würde der restliche Plugin-Code folgen
}
} else {
.csp-search-type label { // Optional: Plugin komplett deaktivieren, wenn Abhängigkeit fehlt
display: flex; add_action('admin_init', function() {
align-items: center; deactivate_plugins(plugin_basename(__FILE__));
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; * Suchfunktion
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('/')); ?>"> define('CSP_PLUGIN_VERSION', '1.5');
<div class="csp-search-type"> define('CSP_PLUGIN_DIR', plugin_dir_path(__FILE__));
<label>
<input type="radio" name="search_type" value="all" <?php checked($search_type, 'all'); ?>> function csp_load_textdomain() {
<?php _e('Alle Inhalte', 'textdomain'); ?> load_plugin_textdomain('wp-multi-search', false, dirname(plugin_basename(__FILE__)) . '/languages');
</label> }
<label> add_action('plugins_loaded', 'csp_load_textdomain');
<input type="radio" name="search_type" value="title" <?php checked($search_type, 'title'); ?>>
<?php _e('Nur Titel', 'textdomain'); ?> function csp_search_form() {
</label> try {
<label> $valid_types = ['all', 'title', 'guest_author'];
<input type="radio" name="search_type" value="guest_author" <?php checked($search_type, 'guest_author'); ?>> $search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all';
<?php _e('Nur Gastautoren', 'textdomain'); ?> if (!in_array($search_type, $valid_types)) {
</label> $search_type = 'all';
</div> }
<div class="csp-search-fields">
<input type="text" name="s" placeholder="🔍 Suchbegriff eingeben" value="<?php echo esc_attr(get_search_query()); ?>"> ob_start();
<input type="submit" value="Suchen"> ?>
</div> <style>
</form> .csp-search-form { display: flex; flex-direction: column; gap: 8px; max-width: 500px; margin: 10px auto; padding: 15px; background: #f8f9fa; border-radius: 15px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); }
<?php .csp-search-fields { display: flex; gap: 8px; }
return ob_get_clean(); .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; }
// 2⃣ **Shortcode für das Suchformular** .csp-search-type input[type="radio"] { margin: 0; }
add_shortcode('custom_search', 'csp_search_form'); .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; }
// 3⃣ **Suchfeld als Widget** </style>
class CSP_Search_Widget extends WP_Widget { <form class="csp-search-form" role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>">
public function __construct() { <div class="csp-search-type">
parent::__construct( <label><input type="radio" name="search_type" value="all" <?php checked($search_type, 'all'); ?>><?php _e('Alle Inhalte', 'wp-multi-search'); ?></label>
'csp_search_widget', <label><input type="radio" name="search_type" value="title" <?php checked($search_type, 'title'); ?>><?php _e('Titel', 'wp-multi-search'); ?></label>
__('Suche Widget', 'textdomain'), <label><input type="radio" name="search_type" value="guest_author" <?php checked($search_type, 'guest_author'); ?>><?php _e('Autoren', 'wp-multi-search'); ?></label>
array('description' => __('Suchfeld mit Optionen für Titel- und Gastautoren-Suche', 'textdomain')) </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="<?php _e('Suchen', 'wp-multi-search'); ?>">
public function widget($args, $instance) { </div>
echo $args['before_widget']; </form>
echo '<h3 class="widget-title">' . __('Suche', 'textdomain') . '</h3>'; <?php
echo csp_search_form(); return ob_get_clean();
echo $args['after_widget']; } catch (Exception $e) {
} return '<p>' . __('Ein Fehler ist aufgetreten', 'wp-multi-search') . '</p>';
} }
}
function csp_register_widget() {
register_widget('CSP_Search_Widget'); add_shortcode('custom_search', 'csp_search_form');
}
add_action('widgets_init', 'csp_register_widget'); class CSP_Search_Widget extends WP_Widget {
public function __construct() {
// 4⃣ **Einstellungsseite hinzufügen** parent::__construct('csp_search_widget', __('Suche Widget', 'wp-multi-search'), array('description' => __('Suchfeld mit Optionen für Titel- und Gastautoren-Suche', 'wp-multi-search')));
function csp_add_menu_page() { }
add_options_page( public function widget($args, $instance) { echo $args['before_widget'] . '<h3 class="widget-title">' . __('Suche', 'wp-multi-search') . '</h3>' . csp_search_form() . $args['after_widget']; }
'WP-Multi-Search Settings', public function form($instance) { echo '<p>' . __('Keine Einstellungen verfügbar', 'wp-multi-search') . '</p>'; }
'WP-Multi-Search', public function update($new_instance, $old_instance) { return $new_instance; }
'manage_options', }
'custom-search-settings',
'csp_render_settings_page' function csp_register_widget() { register_widget('CSP_Search_Widget'); }
); add_action('widgets_init', 'csp_register_widget');
}
add_action('admin_menu', 'csp_add_menu_page'); function csp_add_menu_page() {
add_options_page('WP-Multi-Search Settings', 'WP-Multi-Search', 'manage_options', 'custom-search-settings', 'csp_render_settings_page');
// 5⃣ **Einstellungsseite rendern** }
function csp_render_settings_page() { add_action('admin_menu', 'csp_add_menu_page');
?>
<div class="wrap"> function csp_render_settings_page() {
<h1>WP-Multi Search Settings</h1> if (isset($_POST['csp_settings_nonce']) && !wp_verify_nonce($_POST['csp_settings_nonce'], 'csp_settings_save')) {
<form method="post" action="options.php"> wp_die('Security check failed');
<?php }
settings_fields('csp_settings_group'); ?>
do_settings_sections('custom-search-settings'); <div class="wrap">
submit_button(); <h1><?php _e('WP-Multi Search Settings', 'wp-multi-search'); ?></h1>
?> <form method="post" action="options.php">
</form> <?php settings_fields('csp_settings_group'); do_settings_sections('custom-search-settings'); wp_nonce_field('csp_settings_save', 'csp_settings_nonce'); submit_button(); ?>
</div> </form>
<?php </div>
} <?php
}
// 6⃣ **Einstellungen registrieren**
function csp_register_settings() { function csp_register_settings() {
register_setting('csp_settings_group', 'csp_shiftnav_position'); register_setting('csp_settings_group', 'csp_shiftnav_position', array('sanitize_callback' => 'sanitize_text_field'));
add_settings_section('csp_main_section', 'ShiftNav Position', 'csp_section_callback', 'custom-search-settings');
add_settings_section( add_settings_field('csp_shiftnav_position_select', 'Select ShiftNav Position', 'csp_shiftnav_position_select_callback', 'custom-search-settings', 'csp_main_section');
'csp_main_section', }
'ShiftNav Position', add_action('admin_init', 'csp_register_settings');
'csp_section_callback',
'custom-search-settings' function csp_section_callback() { echo __('Choose where to display the search form in ShiftNav:', 'wp-multi-search'); }
);
function csp_shiftnav_position_select_callback() {
add_settings_field( $positions = array('top' => __('Top of ShiftNav', 'wp-multi-search'), 'bottom' => __('Bottom of ShiftNav', 'wp-multi-search'), 'none' => __('Do not display in ShiftNav', 'wp-multi-search'));
'csp_shiftnav_position_select', $selected_position = get_option('csp_shiftnav_position', 'none');
'Select ShiftNav Position', echo '<select name="csp_shiftnav_position">';
'csp_shiftnav_position_select_callback', foreach ($positions as $value => $label) {
'custom-search-settings', echo '<option value="' . esc_attr($value) . '" ' . selected($selected_position, $value, false) . '>' . esc_html($label) . '</option>';
'csp_main_section' }
); echo '</select>';
} }
add_action('admin_init', 'csp_register_settings');
function csp_insert_search_form_in_shiftnav($nav_menu, $args) {
// 7⃣ **Callback für die Sektion** if (!isset($args->theme_location) || $args->theme_location !== 'shiftnav') return $nav_menu;
function csp_section_callback() { $position = get_option('csp_shiftnav_position', 'none');
echo 'Choose where to display the search form in ShiftNav:'; if ($position === 'none') return $nav_menu;
} $search_form = '<li class="menu-item">' . csp_search_form() . '</li>';
return $position === 'top' ? $search_form . $nav_menu : $nav_menu . $search_form;
// 8⃣ **Callback für das Auswahlfeld** }
function csp_shiftnav_position_select_callback() { add_filter('wp_nav_menu_items', 'csp_insert_search_form_in_shiftnav', 10, 2);
$positions = array(
'top' => 'Top of ShiftNav', function csp_custom_search_results($query) {
'bottom' => 'Bottom of ShiftNav', if (!is_admin() && $query->is_search() && $query->is_main_query()) {
'none' => 'Do not display in ShiftNav' $query->set('post_status', 'publish');
);
$selected_position = get_option('csp_shiftnav_position', 'none'); $search_type = isset($_GET['search_type']) ? sanitize_text_field($_GET['search_type']) : 'all';
$search_term = $query->get('s');
echo '<select name="csp_shiftnav_position">';
foreach ($positions as $value => $label) { switch($search_type) {
echo '<option value="' . esc_attr($value) . '" ' . selected($selected_position, $value, false) . '>' . esc_html($label) . '</option>'; case 'title':
} $query->set('post_title_like', $search_term);
echo '</select>'; $query->set('s', '');
} add_filter('posts_where', 'csp_title_search_where', 10, 2);
break;
// 9⃣ **Funktion zum Einfügen des Suchformulars in ShiftNav**
function csp_insert_search_form_in_shiftnav($nav_menu, $args) { case 'guest_author':
// Überprüfen, ob es sich um das ShiftNav-Menü handelt $meta_query = array(
if ($args->theme_location !== 'shiftnav') { array(
return $nav_menu; 'key' => '_guest_author',
} 'value' => $search_term,
'compare' => 'LIKE'
$position = get_option('csp_shiftnav_position', 'none'); )
if ($position === 'none') { );
return $nav_menu; $query->set('meta_query', $meta_query);
} $query->set('s', '');
$query->set('post_type', 'post');
$search_form = '<li class="menu-item">' . csp_search_form() . '</li>'; break;
if ($position === 'top') { default:
return $search_form . $nav_menu; $query->set('_meta_or_title', $search_term);
} elseif ($position === 'bottom') { add_filter('posts_search', 'csp_custom_search_where', 10, 2);
return $nav_menu . $search_form; add_filter('posts_join', 'csp_custom_search_join', 10, 2);
} add_filter('posts_groupby', 'csp_custom_search_groupby', 10, 2);
break;
return $nav_menu; }
}
add_filter('wp_nav_menu_items', 'csp_insert_search_form_in_shiftnav', 10, 2); add_filter('posts_request', function($sql) {
error_log('SQL Query: ' . $sql);
// 🔟 **Aktualisierte Suchfunktion mit Suchtyp-Unterscheidung** return $sql;
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'; add_action('wp', function() use ($search_type) {
$search_term = $query->get('s'); switch($search_type) {
case 'title':
switch($search_type) { remove_filter('posts_where', 'csp_title_search_where', 10);
case 'title': break;
$query->set('post_title_like', $search_term); case 'guest_author':
$query->set('s', ''); break;
add_filter('posts_where', 'csp_title_search_where', 10, 2); default:
break; remove_filter('posts_search', 'csp_custom_search_where', 10);
remove_filter('posts_join', 'csp_custom_search_join', 10);
case 'guest_author': remove_filter('posts_groupby', 'csp_custom_search_groupby', 10);
$meta_query = array( break;
array( }
'key' => '_guest_author', });
'value' => $search_term, }
'compare' => '=' }
) add_action('pre_get_posts', 'csp_custom_search_results');
);
$query->set('meta_query', $meta_query); function csp_title_search_where($where, $query) {
$query->set('s', ''); global $wpdb;
$query->set('post_type', 'post'); if ($search_term = $query->get('post_title_like')) {
break; $where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_title LIKE %s",
default: // 'all' '%' . $wpdb->esc_like($search_term) . '%'
$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); return $where;
add_filter('posts_groupby', 'csp_custom_search_groupby', 10, 2); }
break;
} function csp_custom_search_where($where, $query) {
} global $wpdb;
} if ($search_term = $query->get('_meta_or_title')) {
add_action('pre_get_posts', 'csp_custom_search_results'); $search = '%' . $wpdb->esc_like($search_term) . '%';
$where .= $wpdb->prepare(
// 1⃣1⃣ **Hilfsfunktionen für verschiedene Suchtypen** " AND ({$wpdb->posts}.post_title LIKE %s
function csp_title_search_where($where, $query) { OR {$wpdb->posts}.post_content LIKE %s
global $wpdb; OR {$wpdb->posts}.post_excerpt LIKE %s
if ($search_term = $query->get('post_title_like')) { OR guest_author.meta_value LIKE %s
$where .= $wpdb->prepare( OR {$wpdb->users}.display_name LIKE %s)",
" AND {$wpdb->posts}.post_title LIKE %s", $search, $search, $search, $search, $search
'%' . $wpdb->esc_like($search_term) . '%' );
); }
} return $where;
return $where; }
}
function csp_custom_search_join($join, $query) {
function csp_custom_search_where($where, $query) { global $wpdb;
global $wpdb; if ($query->get('_meta_or_title')) {
if ($search_term = $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')";
$search = '%' . $wpdb->esc_like($search_term) . '%'; $join .= " LEFT JOIN {$wpdb->users} ON ({$wpdb->posts}.post_author = {$wpdb->users}.ID)";
$where .= $wpdb->prepare( }
" OR ({$wpdb->posts}.post_title LIKE %s) return $join;
OR ({$wpdb->posts}.post_content LIKE %s) }
OR ({$wpdb->posts}.post_excerpt LIKE %s)
OR (guest_author.meta_value LIKE %s) function csp_custom_search_groupby($groupby, $query) {
OR ({$wpdb->users}.display_name LIKE %s)", global $wpdb;
$search, $search, $search, $search, $search if ($query->get('_meta_or_title')) {
); $groupby = "{$wpdb->posts}.ID";
} }
return $where; return $groupby;
} }
function csp_custom_search_join($join, $query) { function csp_guest_author_search_where($where, $query) {
global $wpdb; global $wpdb;
if ($query->get('_meta_or_title')) { if ($query->get('meta_query')) {
$join .= " LEFT JOIN {$wpdb->postmeta} guest_author ON ({$wpdb->posts}.ID = guest_author.post_id AND guest_author.meta_key = '_guest_author')"; $where .= " AND EXISTS (
$join .= " LEFT JOIN {$wpdb->users} ON ({$wpdb->posts}.post_author = {$wpdb->users}.ID)"; SELECT 1 FROM {$wpdb->postmeta}
} WHERE {$wpdb->postmeta}.post_id = {$wpdb->posts}.ID
return $join; AND {$wpdb->postmeta}.meta_key = '_guest_author'
} AND {$wpdb->postmeta}.meta_value LIKE '%" . $wpdb->esc_like($query->get('s')) . "%'
)";
function csp_custom_search_groupby($groupby, $query) { }
global $wpdb; return $where;
if ($query->get('_meta_or_title')) { }
$groupby = "{$wpdb->posts}.ID"; add_filter('posts_where', 'csp_guest_author_search_where', 10, 2);
}
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);
?>