Upload via GUI (39 Dateien)

This commit is contained in:
2026-08-14 07:59:43 +00:00
parent 05a2e1c7b6
commit 90f388f49c
31 changed files with 16919 additions and 5554 deletions
+338
View File
@@ -0,0 +1,338 @@
<?php
/**
* WP Multi Modul: Beitrags-Report
*
* Automatisch aus wp-multi.php ausgelagert. Wird über den Loader in
* wp-multi.php eingebunden (nur wenn das WP Multi Toolkit aktiv ist).
*/
if (!defined('ABSPATH')) { exit; }
/*
* Beitrags Report
*/
// Funktion zum Erstellen und Aktualisieren der Datenbanktabelle für gemeldete Beiträge
function wp_stat_notice_create_reported_posts_table() {
global $wpdb;
$table_name = $wpdb->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();
?>
<button class="report-post" data-post-id="<?php echo esc_attr($atts['post_id']); ?>" data-nonce="<?php echo esc_attr($nonce); ?>">
Beitrag melden
</button>
<div class="report-reason" style="display:none;">
<input type="text" class="report-name" placeholder="Geben Sie Ihren Namen an" required />
<textarea class="report-reason-text" placeholder="Geben Sie den Grund an" required></textarea>
<button class="submit-report">Bericht absenden</button>
</div>
<?php
return ob_get_clean();
}
add_shortcode('report_button', 'wp_stat_notice_report_button');
// Stil für das Meldeformular
function wp_stat_notice_report_button_styles() {
?>
<style>
.report-reason {
display: none;
margin-top: 10px;
background-color: #f9f9f9;
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
width: 300px;
margin-top: 10px;
}
.report-reason input, .report-reason textarea {
width: 100%;
padding: 10px;
margin: 5px 0;
border: 1px solid #ccc;
border-radius: 4px;
}
.report-reason button {
background-color: #0073aa;
color: white;
padding: 8px 16px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.report-reason button:hover {
background-color: #005177;
}
.report-post {
background-color: #ff7f00;
color: white;
padding: 10px;
border-radius: 5px;
cursor: pointer;
}
.report-post:hover {
background-color: #e07b00;
}
</style>
<?php
}
add_action('wp_head', 'wp_stat_notice_report_button_styles');
// Dashboard-Widget hinzufügen
function wp_stat_notice_add_dashboard_widget() {
wp_add_dashboard_widget(
'wp_stat_notice_dashboard_widget',
'Letzte 10 gemeldete Beiträge',
'wp_stat_notice_dashboard_widget_display'
);
}
add_action('wp_dashboard_setup', 'wp_stat_notice_add_dashboard_widget');
// Funktion, die das Dashboard-Widget anzeigt
function wp_stat_notice_dashboard_widget_display() {
global $wpdb;
$table_name = $wpdb->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 '<p>Es gibt keine gemeldeten Beiträge.</p>';
return;
}
// Tabelle mit den letzten 10 gemeldeten Beiträgen anzeigen
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead><tr><th>Beitrag</th><th>Datum</th><th>Grund</th></tr></thead><tbody>';
foreach ($reports as $report) {
$post = get_post($report->post_id);
echo '<tr>';
echo '<td>' . esc_html($post->post_title) . '</td>';
echo '<td>' . esc_html($report->report_date) . '</td>';
echo '<td>' . esc_html($report->reason) . '</td>';
echo '</tr>';
}
echo '</tbody></table>';
}
// 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() {
?>
<script>
jQuery(document).ready(function ($) {
$(document).on("click", ".report-post", function () {
let reasonBox = $(this).next(".report-reason");
reasonBox.toggle();
});
$(document).on("click", ".submit-report", function () {
let button = $(this);
let container = button.closest(".report-reason");
let reason = container.find(".report-reason-text").val();
let name = container.find(".report-name").val();
let postId = button.closest(".report-reason").prev(".report-post").data("post-id");
let nonce = button.closest(".report-reason").prev(".report-post").data("nonce");
if (!reason || !name) {
alert("Bitte geben Sie sowohl Ihren Namen als auch einen Grund an.");
return;
}
$.ajax({
url: "<?php echo admin_url('admin-ajax.php'); ?>",
type: "POST",
data: {
action: "report_post",
post_id: postId,
reason: reason,
name: name,
nonce: nonce
},
success: function (response) {
if (response.success) {
alert("Der Bericht wurde erfolgreich gesendet.");
container.hide();
} else {
alert("Fehler: " + response.data.message);
}
}
});
});
});
</script>
<?php
}
add_action('wp_footer', 'wp_stat_notice_inline_js');
// Admin-Seite für gemeldete Beiträge
function wp_stat_notice_reported_posts_page() {
global $wpdb;
$table_name = $wpdb->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 {
?>
<div class="wpm-table-wrap">
<table class="wpm-table">
<thead>
<tr>
<th><?php _e('Beitrag', 'wp-stat-notice'); ?></th>
<th><?php _e('Datum', 'wp-stat-notice'); ?></th>
<th><?php _e('Name', 'wp-stat-notice'); ?></th>
<th><?php _e('Grund', 'wp-stat-notice'); ?></th>
<th><?php _e('Status', 'wp-stat-notice'); ?></th>
<th><?php _e('Aktionen', 'wp-stat-notice'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($reports as $report):
$post = get_post($report->post_id); ?>
<tr>
<td><?php echo $post ? esc_html($post->post_title) : '—'; ?></td>
<td><?php echo esc_html($report->report_date); ?></td>
<td><?php echo esc_html($report->name); ?></td>
<td><?php echo esc_html($report->reason); ?></td>
<td><span class="wpm-badge <?php echo $report->status === 'reported' ? 'wpm-badge--warning' : ''; ?>"><?php echo esc_html($report->status); ?></span></td>
<td>
<a href="<?php echo esc_url(wp_nonce_url('?page=reported-posts&delete_report=' . $report->id, 'wp_stat_notice_delete_report_' . $report->id)); ?>" class="wpm-btn" onclick="return confirm('<?php esc_attr_e('Report wirklich löschen?', 'wp-stat-notice'); ?>');"><?php _e('Report löschen', 'wp-stat-notice'); ?></a>
<a href="<?php echo esc_url(wp_nonce_url('?page=reported-posts&unpublish_report=' . $report->id, 'wp_stat_notice_unpublish_report_' . $report->id)); ?>" class="wpm-btn"><?php _e('Unpublish', 'wp-stat-notice'); ?></a>
<a href="<?php echo esc_url(wp_nonce_url('?page=reported-posts&delete_post=' . $report->post_id, 'wp_stat_notice_delete_post_' . $report->post_id)); ?>" class="wpm-btn wpm-btn--danger" onclick="return confirm('<?php esc_attr_e('Beitrag wirklich unwiderruflich löschen?', 'wp-stat-notice'); ?>');"><?php _e('Beitrag löschen', 'wp-stat-notice'); ?></a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php
}
wpmt_admin_card_close();
wpmt_admin_page_close();
}
// Aktionen für Report-Handling
function wp_stat_notice_handle_report_actions() {
if (!isset($_GET['page']) || $_GET['page'] !== 'reported-posts') {
return;
}
if (!current_user_can('manage_options')) {
return;
}
global $wpdb;
if (isset($_GET['delete_report'])) {
check_admin_referer('wp_stat_notice_delete_report_' . intval($_GET['delete_report']));
$wpdb->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.