'mm_bot_sanitize_settings', ] ); } ); function mm_bot_sanitize_settings( $input ) { $clean = []; $text_fields = [ 'server_ip', 'server_ver', 'server_specs', 'bot_name', 'welcome' ]; $url_fields = [ 'url_wiki', 'url_rules', 'url_tickets', 'url_faq', 'url_team', 'url_shop', 'url_gallery', 'url_player_history', 'url_forum', 'link_discord', 'litebans_dashboard_url', ]; foreach ( $text_fields as $f ) { $clean[ $f ] = isset( $input[ $f ] ) ? sanitize_text_field( $input[ $f ] ) : ''; } foreach ( $url_fields as $f ) { $clean[ $f ] = isset( $input[ $f ] ) ? esc_url_raw( $input[ $f ] ) : ''; } $clean['qa'] = []; if ( ! empty( $input['qa'] ) && is_array( $input['qa'] ) ) { foreach ( $input['qa'] as $item ) { if ( empty( $item['keys'] ) ) continue; $clean['qa'][] = [ 'keys' => sanitize_text_field( $item['keys'] ), 'val' => wp_kses_post( $item['val'] ), ]; } } return $clean; } // ========================================================================= // 2. ADMIN-SEITE // ========================================================================= // BUG-FIX: Funktion außerhalb von mm_render_bot_admin() definieren. // Innerhalb einer Funktion definierte benannte Funktionen erzeugen einen // Fatal Error "Cannot redeclare", wenn die äußere Funktion jemals ein // zweites Mal ausgeführt wird (z.B. durch AJAX, REST, bestimmte Plugins). if ( ! function_exists( 'mm_find_page_by_shortcode' ) ) : function mm_find_page_by_shortcode( $shortcodes ) { global $wpdb; $conditions = []; foreach ( (array) $shortcodes as $sc ) { $conditions[] = $wpdb->prepare( 'post_content LIKE %s', '%[' . $wpdb->esc_like( $sc ) . '%' ); } if ( empty( $conditions ) ) return ''; $where = implode( ' OR ', $conditions ); $page = $wpdb->get_row( "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'publish' AND post_type IN ('page','post') AND ({$where}) LIMIT 1" ); return $page ? get_permalink( $page->ID ) : ''; } endif; function mm_render_bot_admin() { $data = get_option( 'mm_bot_data', [] ); ?>

Bot-Zentrale

1. Server-Infos

Wird bei Fragen nach der Server-IP angezeigt.

Wird bei Fragen nach der Server-Hardware angezeigt.

2. Bot-Einstellungen

UUID / Name wird im Theme-Customizer unter "Assistent" gesetzt.

Erster Text der beim Öffnen des Assistenten angezeigt wird.

3. Wichtige Links

💡 Wenn eine Seite mit dem passenden Shortcode gefunden wird, erscheint ein „Vorschlag übernehmen"-Button.

mm_find_page_by_shortcode( ['wmw_wiki', 'wmw_search', 'wmw_article'] ), 'url_rules' => mm_find_page_by_shortcode( ['mrp_rules', 'mc_rules', 'multi_rules'] ), 'url_tickets' => mm_find_page_by_shortcode( ['wmtp_tickets', 'wm_tickets', 'multi_ticket'] ), 'url_shop' => mm_find_page_by_shortcode( ['wis_shop', 'ingame_shop', 'wis_items'] ), 'url_gallery' => mm_find_page_by_shortcode( ['mc_gallery', 'mc_gallery_overview', 'mc_gallery_upload', 'mc_gallery_all_albums'] ), 'url_faq' => mm_find_page_by_shortcode( ['faq_list', 'faq', 'faq_page'] ), 'url_player_history' => mm_find_page_by_shortcode( ['mc_player_history', 'mc_players', 'player_history'] ), 'url_forum' => mm_find_page_by_shortcode( ['business_forum'] ), 'litebans_dashboard_url' => mm_find_page_by_shortcode( ['litebans_dashboard', 'litebans', 'wp_litebans'] ), ]; $links = [ 'url_wiki' => [ 'label' => '📖 Wiki-URL', 'plugin' => 'WP Multi Wiki', 'active' => post_type_exists( 'wmw_article' ) ], 'url_rules' => [ 'label' => '📜 Regelwerk-URL', 'plugin' => 'Multi Rules', 'active' => function_exists( 'mrp_get_plugin_version' ) ], 'url_tickets' => [ 'label' => '🎫 Ticket/Support-URL', 'plugin' => 'WP Multi Ticket Pro', 'active' => class_exists( 'WP_Multi_Ticket_Pro' ) ], 'url_shop' => [ 'label' => '🛒 Shop-URL', 'plugin' => 'WP Ingame Shop Pro', 'active' => class_exists( 'WIS_Activator' ) ], 'url_gallery' => [ 'label' => '📷 Galerie-URL', 'plugin' => 'MC MultiServer Gallery PRO', 'active' => post_type_exists( 'mc_gallery' ) ], 'url_faq' => [ 'label' => '❓ FAQ-URL', 'plugin' => 'FAQ Post Type', 'active' => post_type_exists( 'faq' ) ], 'url_player_history' => [ 'label' => '👤 Spieler-History-URL', 'plugin' => 'MC Player History', 'active' => function_exists( 'mcph_get_plugin_version' ) ], 'url_forum' => [ 'label' => '💬 Forum-URL', 'plugin' => 'WP Business Forum', 'active' => class_exists( 'WBF_DB' ) ], 'url_team' => [ 'label' => '👥 Team-URL', 'plugin' => '', 'active' => true ], 'link_discord' => [ 'label' => '💬 Discord-Einladung', 'plugin' => '', 'active' => true ], 'litebans_dashboard_url' => [ 'label' => '🔨 LiteBans Dashboard-URL', 'plugin' => 'LiteBans Manager', 'active' => class_exists( 'WP_LiteBans_Pro' ) ], ]; ?> $cfg ) : $badge = ''; if ( $cfg['plugin'] ) { $cls = $cfg['active'] ? 'badge' : 'badge inactive'; $txt = $cfg['active'] ? 'aktiv' : 'inaktiv'; $badge = '' . esc_html( $cfg['plugin'] ) . ' ' . $txt . ''; } $saved = $data[ $key ] ?? ''; $suggested = $autodetect[ $key ] ?? ''; $show_suggest = $suggested && $suggested !== $saved; ?>
✔ Erkannt & gesetzt

4. Individuelle Q&A

Schlüsselwörter (kommagetrennt) → Antwort. Hat höchste Priorität vor allen Plugin-Abfragen.

Schlüsselwörter Antwort (HTML erlaubt)
$item ) : if ( empty( $item['keys'] ) ) continue; ?>
'🖥️ Server-Status', 'q' => 'server status' ]; } // Regeln – nur wenn URL im Backend gesetzt if ( ! empty( $data['url_rules'] ) ) { $quick[] = [ 'label' => '📜 Regelwerk', 'q' => 'regeln' ]; } // Wiki – nur wenn URL im Backend gesetzt if ( ! empty( $data['url_wiki'] ) ) { $quick[] = [ 'label' => '📖 Wiki', 'q' => 'wiki' ]; } // Shop – nur wenn URL im Backend gesetzt global $wpdb; if ( ! empty( $data['url_shop'] ) ) { $quick[] = [ 'label' => '🛒 Shop', 'q' => 'shop' ]; } // Ticket / Support – nur wenn URL im Backend gesetzt if ( ! empty( $data['url_tickets'] ) ) { $quick[] = [ 'label' => '🎫 Support-Ticket', 'q' => 'ticket erstellen' ]; } // Forum if ( class_exists( 'WBF_DB' ) && ! empty( $data['url_forum'] ) ) { $quick[] = [ 'label' => '💬 Forum', 'q' => 'forum' ]; } // Galerie – nur wenn URL im Backend gesetzt if ( ! empty( $data['url_gallery'] ) ) { $quick[] = [ 'label' => '📷 Galerie', 'q' => 'galerie' ]; } // Ban-Status $lb = get_option( 'wp_litebans_pro_settings', [] ); if ( ! empty( $lb['db_name'] ) ) { $quick[] = [ 'label' => '🔨 Strafen prüfen', 'q' => 'meine strafen' ]; } // Spieler-History – nur wenn URL im Backend gesetzt if ( ! empty( $data['url_player_history'] ) ) { $quick[] = [ 'label' => '⏱️ Spielzeit', 'q' => 'spielzeit' ]; } // Discord if ( ! empty( $data['link_discord'] ) ) { $quick[] = [ 'label' => '💬 Discord', 'q' => 'discord' ]; } ?>