prefix . 'reported_posts'; $charset_collate = $wpdb->get_charset_collate(); // SQL für die Tabelle $sql = "CREATE TABLE IF NOT EXISTS $table_name ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, post_id BIGINT(20) NOT NULL, report_date DATETIME DEFAULT CURRENT_TIMESTAMP, reason TEXT NOT NULL, name VARCHAR(255) NOT NULL, status VARCHAR(20) DEFAULT 'reported', user_id BIGINT(20) UNSIGNED DEFAULT NULL, PRIMARY KEY (id), KEY post_id (post_id), KEY user_id (user_id) ) $charset_collate;"; // Tabelle zuerst erstellen bzw. aktualisieren - erst danach kann die // Spaltenprüfung laufen (vorher schlug SHOW COLUMNS bei der Erstaktivierung fehl). require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); // Migration für Alt-Installationen: Spalte `name` ergänzen, falls sie fehlt $columns = $wpdb->get_results("SHOW COLUMNS FROM $table_name"); $column_names = array_map(function($column) { return $column->Field; }, $columns); if (!in_array('name', $column_names, true)) { $wpdb->query("ALTER TABLE $table_name ADD COLUMN `name` VARCHAR(255) NOT NULL"); } } register_activation_hook(WP_MULTI_FILE, 'wp_stat_notice_create_reported_posts_table'); // Shortcode für den "Beitrag melden"-Button function wp_stat_notice_report_button($atts) { global $post; if (!is_user_logged_in()) return ''; $atts = shortcode_atts(array('post_id' => $post->ID), $atts, 'report_button'); $nonce = wp_create_nonce('report_post_nonce'); // Report-Button & Eingabefelder für Name und Grund ob_start(); ?> prefix . 'reported_posts'; // Abfrage, um die letzten 10 gemeldeten Beiträge zu holen $reports = $wpdb->get_results( "SELECT * FROM $table_name ORDER BY report_date DESC LIMIT 10" ); if (empty($reports)) { echo '

Es gibt keine gemeldeten Beiträge.

'; return; } // Tabelle mit den letzten 10 gemeldeten Beiträgen anzeigen echo ''; echo ''; foreach ($reports as $report) { $post = get_post($report->post_id); echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
BeitragDatumGrund
' . esc_html($post->post_title) . '' . esc_html($report->report_date) . '' . esc_html($report->reason) . '
'; } // AJAX-Handler zum Senden eines Reports function wp_stat_notice_handle_report() { check_ajax_referer('report_post_nonce', 'nonce'); if (!isset($_POST['post_id'], $_POST['reason'], $_POST['name']) || !is_user_logged_in()) { wp_send_json_error(array('message' => 'Ungültige Anfrage.')); return; } global $wpdb; $table_name = $wpdb->prefix . 'reported_posts'; $post_id = intval($_POST['post_id']); $reason = sanitize_textarea_field($_POST['reason']); $name = sanitize_text_field($_POST['name']); $user_id = get_current_user_id(); // Versuche den Eintrag in die Datenbank zu schreiben $result = $wpdb->insert( $table_name, array( 'post_id' => $post_id, 'reason' => $reason, 'name' => $name, 'status' => 'reported', 'user_id' => $user_id ), array('%d', '%s', '%s', '%s', '%d') ); if ($result === false) { error_log("Datenbankfehler: " . $wpdb->last_error); // WP Debug Log wp_send_json_error(array('message' => 'Datenbankfehler: ' . $wpdb->last_error)); } else { wp_send_json_success(array('message' => 'Bericht erfolgreich gesendet.')); } } add_action('wp_ajax_report_post', 'wp_stat_notice_handle_report'); // JavaScript in den Footer einfügen function wp_stat_notice_inline_js() { ?> prefix . 'reported_posts'; $reports = $wpdb->get_results("SELECT * FROM $table_name ORDER BY report_date DESC"); wpmt_admin_page_open( __('Gemeldete Beiträge', 'wp-stat-notice'), __('Von Besuchern gemeldete Inhalte prüfen und bearbeiten', 'wp-stat-notice') ); wpmt_admin_card_open(); if (empty($reports)) { wpmt_admin_notice('info', __('Es liegen keine Meldungen vor.', 'wp-stat-notice')); } else { ?>
post_id); ?>
post_title) : '—'; ?> report_date); ?> name); ?> reason); ?> status); ?>
delete($wpdb->prefix . 'reported_posts', array('id' => intval($_GET['delete_report'])), array('%d')); } elseif (isset($_GET['unpublish_report'])) { check_admin_referer('wp_stat_notice_unpublish_report_' . intval($_GET['unpublish_report'])); $wpdb->update($wpdb->prefix . 'reported_posts', array('status' => 'unpublished'), array('id' => intval($_GET['unpublish_report'])), array('%s'), array('%d')); } elseif (isset($_GET['delete_post'])) { check_admin_referer('wp_stat_notice_delete_post_' . intval($_GET['delete_post'])); wp_delete_post(intval($_GET['delete_post']), true); } } add_action('admin_init', 'wp_stat_notice_handle_report_actions'); // Der Menüpunkt "Gemeldete Beiträge" wird zentral in wp_multi_register_admin_menus() registriert.