wp-multi-comment-notifications/wp-multi-comment-notifications.php

421 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* Plugin Name: WP Multi Comment Notifications
* Plugin URI: https://git.viper.ipv64.net/M_Viper/wp-multi-comment-notifications
* Description: Benachrichtigt bei neuen Kommentaren per E-Mail und optional über Telegram & Discord. Ideal für Teams, die schnell informiert werden wollen.
* 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-multi-comment-notifications
* Domain Path: /languages
* Tags: kommentare, benachrichtigung, e-mail, telegram, discord, kommentarüberwachung, teamkommunikation
*
* Support:
* - Microsoft Teams: https://teams.live.com/l/community/FEAzokphpZTJ2u6OgI
* - Telegram: https://t.me/M_Viper04
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Dashboard Widget Update Info für dieses Plugin
*/
function wp_multi_cmn_dashboard_widget() {
wp_add_dashboard_widget(
'wp_multi_cmn_update_widget',
__('WP Multi Comment Notifications Update Info', 'wp-multi-comment-notifications'),
'wp_multi_cmn_update_dashboard_widget_content'
);
}
add_action('wp_dashboard_setup', 'wp_multi_cmn_dashboard_widget');
// Cron-Intervall „stündlich“ definieren
add_filter('cron_schedules', function ($schedules) {
$schedules['hourly'] = array(
'interval' => 3600,
'display' => __('Stündlich', 'wp-multi-comment-notifications'),
);
return $schedules;
});
// Cron-Event planen
function wp_multi_cmn_schedule_update_check() {
if (!wp_next_scheduled('wp_multi_cmn_update_check_event')) {
wp_schedule_event(time(), 'hourly', 'wp_multi_cmn_update_check_event');
}
}
add_action('wp', 'wp_multi_cmn_schedule_update_check');
// Gitea API aufrufen
function wp_multi_cmn_fetch_latest_release($show_prereleases = false) {
$api_url = 'https://git.viper.ipv64.net/api/v1/repos/M_Viper/wp-multi-comment-notifications/releases';
$response = wp_remote_get($api_url, array('timeout' => 10));
if (is_wp_error($response)) {
error_log('WP Multi Comment Notifications Update Fehler: ' . $response->get_error_message());
return false;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
if (!is_array($data)) {
error_log('WP Multi Comment Notifications Ungültige API-Antwort');
return false;
}
foreach ($data as $release) {
if (!$show_prereleases && isset($release['prerelease']) && $release['prerelease']) {
continue;
}
if (!empty($release['tag_name'])) {
return $release;
}
}
return null;
}
// Cron Callback
function wp_multi_cmn_update_check() {
if (!function_exists('get_plugin_data')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$plugin_data = get_plugin_data(__FILE__);
$installed_version = $plugin_data['Version'];
$show_prereleases = get_option('wp_multi_cmn_show_prereleases', false);
$release = wp_multi_cmn_fetch_latest_release($show_prereleases);
if ($release) {
update_option('wp_multi_cmn_latest_version', $release['tag_name']);
update_option('wp_multi_cmn_release_notes', $release['body']);
update_option('wp_multi_cmn_is_prerelease', $release['prerelease']);
}
}
add_action('wp_multi_cmn_update_check_event', 'wp_multi_cmn_update_check');
// Widget Callback
function wp_multi_cmn_update_dashboard_widget_content() {
if (!function_exists('get_plugin_data')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
$plugin_data = get_plugin_data(__FILE__);
$installed_version = $plugin_data['Version'];
$show_prereleases = get_option('wp_multi_cmn_show_prereleases', false);
$release = wp_multi_cmn_fetch_latest_release($show_prereleases);
if ($release === false) {
echo '<p style="color:red;">Fehler beim Abrufen der Update-Informationen.</p>';
return;
}
$latest_version = $release['tag_name'];
$release_notes = isset($release['body']) ? $release['body'] : '';
$is_prerelease = isset($release['prerelease']) && $release['prerelease'];
if (version_compare($installed_version, $latest_version, '>=')) {
echo '<p style="color:green;">Du verwendest die aktuelle Version: <strong>' . esc_html($installed_version) . '</strong></p>';
} else {
echo '<p style="color:red;"><strong>Neue Version verfügbar: ' . esc_html($latest_version) . '</strong></p>';
echo '<p>Installiert: <strong>' . esc_html($installed_version) . '</strong></p>';
if ($is_prerelease && $show_prereleases) {
echo '<p style="color:blue;">Hinweis: Dies ist ein PreRelease.</p>';
}
if (!empty($release_notes)) {
echo '<p><strong>Release Notes:</strong><br>' . nl2br(esc_html($release_notes)) . '</p>';
}
$download_url = isset($release['assets'][0]['browser_download_url']) ? $release['assets'][0]['browser_download_url'] : '#';
echo '<p><a href="' . esc_url($download_url) . '" class="button button-primary">Update herunterladen</a></p>';
}
}
// 1. Plugin-Optionen im Admin-Bereich unter dem Menü "Kommentare" hinzufügen
function wp_multi_comment_notifications_menu() {
add_submenu_page(
'edit-comments.php',
'WP Multi Comment Notifications',
'Kommentar Benachrichtigungen',
'manage_options',
'wp-multi-comment-notifications',
'wp_multi_comment_notifications_settings_page'
);
}
add_action('admin_menu', 'wp_multi_comment_notifications_menu');
function wp_multi_comment_notifications_settings_page() {
?>
<div class="wrap">
<h1>WP Multi Comment Notifications Einstellungen</h1>
<form method="post" action="options.php">
<?php
settings_fields( 'wp_multi_comment_notifications_settings_group' );
do_settings_sections( 'wp-multi-comment-notifications' );
?>
<h3>Telegram Bot Token</h3>
<label for="wp_telegram_token">Telegram Bot Token</label>
<input type="text" name="wp_telegram_token" value="<?php echo esc_attr(get_option('wp_telegram_token')); ?>" class="regular-text" />
<h3>Discord Webhook URL</h3>
<label for="wp_discord_webhook_url">Webhook URL</label>
<input type="text" name="wp_discord_webhook_url" value="<?php echo esc_attr(get_option('wp_discord_webhook_url')); ?>" class="regular-text" />
<h3>Nachricht für Discord</h3>
<textarea name="wp_discord_message" rows="5" class="large-text"><?php echo esc_textarea(get_option('wp_discord_message')); ?></textarea>
<p>Verwende Platzhalter wie <code>{{COMMENT_AUTHOR}}</code>, <code>{{COMMENT_TEXT}}</code>, <code>{{USER_NAME}}</code> für dynamische Daten.</p>
<h3>Nachricht für E-Mail</h3>
<textarea name="wp_email_message" rows="5" class="large-text"><?php echo esc_textarea(get_option('wp_email_message')); ?></textarea>
<p>Verwende Platzhalter wie <code>{{COMMENT_AUTHOR}}</code>, <code>{{COMMENT_TEXT}}</code>, <code>{{USER_NAME}}</code> für dynamische Daten.</p>
<h3>Nachricht für Telegram</h3>
<textarea name="wp_telegram_message" rows="5" class="large-text"><?php echo esc_textarea(get_option('wp_telegram_message')); ?></textarea>
<p>Verwende Platzhalter wie <code>{{COMMENT_AUTHOR}}</code>, <code>{{COMMENT_TEXT}}</code>, <code>{{USER_NAME}}</code> für dynamische Daten.</p>
<h3>Backend-Button URL</h3>
<label for="wp_backend_button_url">URL für Backend Button</label>
<input type="text" name="wp_backend_button_url" value="<?php echo esc_attr(get_option('wp_backend_button_url')); ?>" class="regular-text" />
<h3>Logo/Banner für E-Mail</h3>
<label for="wp_email_logo_url">Logo/Banner URL</label>
<input type="text" name="wp_email_logo_url" value="<?php echo esc_attr(get_option('wp_email_logo_url')); ?>" class="regular-text" />
<p>Füge hier die vollständige URL zum Logo/Banner ein, das in der E-Mail angezeigt werden soll.</p>
<div class="user-boxes">
<?php for ($i = 1; $i <= 6; $i++) : ?>
<div class="user-box">
<h3>User <?php echo $i; ?></h3>
<label for="wp_user_<?php echo $i; ?>_name">Name</label>
<input type="text" name="wp_user_<?php echo $i; ?>_name" value="<?php echo esc_attr(get_option("wp_user_{$i}_name")); ?>" />
<label for="wp_user_<?php echo $i; ?>_email">E-Mail Adresse</label>
<input type="email" name="wp_user_<?php echo $i; ?>_email" value="<?php echo esc_attr(get_option("wp_user_{$i}_email")); ?>" />
<label for="wp_user_<?php echo $i; ?>_telegram_chat_id">Telegram Chat ID</label>
<input type="text" name="wp_user_<?php echo $i; ?>_telegram_chat_id" value="<?php echo esc_attr(get_option("wp_user_{$i}_telegram_chat_id")); ?>" />
<!-- Button für individuelle Testnachricht -->
<input type="submit" name="send_test_message_user_<?php echo $i; ?>" class="button button-secondary" value="Testnachricht an <?php echo esc_attr(get_option("wp_user_{$i}_name")); ?>" />
</div>
<?php endfor; ?>
</div>
<?php submit_button(); ?>
</form>
</div>
<style>
.user-boxes {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.user-box {
width: 30%;
padding: 15px;
border: 1px solid #ddd;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}
.user-box h3 {
margin-top: 0;
}
.user-box label {
display: block;
margin-bottom: 5px;
}
.user-box input,
.user-box textarea {
width: 100%;
padding: 8px;
margin-bottom: 10px;
border: 1px solid #ddd;
border-radius: 5px;
}
.regular-text {
width: 100%;
}
.large-text {
width: 100%;
height: 150px;
}
</style>
<?php
}
function wp_multi_comment_notifications_register_settings() {
for ($i = 1; $i <= 6; $i++) {
register_setting('wp_multi_comment_notifications_settings_group', "wp_user_{$i}_name");
register_setting('wp_multi_comment_notifications_settings_group', "wp_user_{$i}_email");
register_setting('wp_multi_comment_notifications_settings_group', "wp_user_{$i}_telegram_chat_id");
}
register_setting('wp_multi_comment_notifications_settings_group', 'wp_telegram_token');
register_setting('wp_multi_comment_notifications_settings_group', 'wp_email_message');
register_setting('wp_multi_comment_notifications_settings_group', 'wp_telegram_message');
register_setting('wp_multi_comment_notifications_settings_group', 'wp_backend_button_url');
register_setting('wp_multi_comment_notifications_settings_group', 'wp_email_logo_url');
register_setting('wp_multi_comment_notifications_settings_group', 'wp_discord_webhook_url');
register_setting('wp_multi_comment_notifications_settings_group', 'wp_discord_message');
}
add_action('admin_init', 'wp_multi_comment_notifications_register_settings');
/** -------------------------
* Kommentar-Benachrichtigung
* ------------------------- */
function wp_multi_comment_notifications_on_comment($comment_ID) {
$comment = get_comment($comment_ID);
$author = $comment->comment_author;
$text = $comment->comment_content;
$site = get_bloginfo('name');
$url = get_option('wp_backend_button_url');
$logo = esc_url(get_option('wp_email_logo_url'));
$discord_webhook = get_option('wp_discord_webhook_url');
$discord_template = get_option('wp_discord_message');
// Nachricht für Discord nur einmal senden
if ($discord_webhook && $discord_template) {
$discord_msg = strtr($discord_template, [
'{{COMMENT_AUTHOR}}' => $author,
'{{COMMENT_TEXT}}' => $text,
]);
wp_multi_comment_notifications_send_discord($discord_webhook, $discord_msg);
}
// E-Mail & Telegram Benachrichtigungen pro Benutzer
for ($i = 1; $i <= 6; $i++) {
$name = get_option("wp_user_{$i}_name");
$email = get_option("wp_user_{$i}_email");
$chat_id = get_option("wp_user_{$i}_telegram_chat_id");
// Nachricht für E-Mail & Telegram
$replacements = [
'{{COMMENT_AUTHOR}}' => $author,
'{{COMMENT_TEXT}}' => $text,
'{{USER_NAME}}' => $name,
];
$email_msg = strtr(get_option('wp_email_message'), $replacements);
if ($url) $email_msg .= "\n\nWeitere Details hier: $url";
if ($email) {
$html = $logo ? "<img src='$logo' style='max-width:100%;margin-bottom:20px;'><br>" : '';
$html .= nl2br(esc_html($email_msg));
$headers = [
'Content-Type: text/html; charset=UTF-8',
"From: $site <no-reply@" . $_SERVER['SERVER_NAME'] . '>',
];
wp_mail($email, 'Neuer Kommentar', $html, $headers);
}
$tg_msg = strtr(get_option('wp_telegram_message'), $replacements);
if ($chat_id) {
wp_multi_comment_notifications_send_telegram(
get_option('wp_telegram_token'),
$chat_id,
$comment_ID,
$tg_msg
);
}
}
}
add_action('wp_insert_comment', 'wp_multi_comment_notifications_on_comment', 10, 1);
/** -------------------------
* Testnachrichten senden
* ------------------------- */
add_action('admin_init', function () {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
for ($i = 1; $i <= 6; $i++) {
if (isset($_POST["send_test_message_user_$i"])) {
wp_multi_comment_notifications_send_test_message($i);
}
}
}
});
function wp_multi_comment_notifications_send_test_message($user_number) {
$name = get_option("wp_user_{$user_number}_name");
$email = get_option("wp_user_{$user_number}_email");
$chat_id = get_option("wp_user_{$user_number}_telegram_chat_id");
$discord_webhook = get_option('wp_discord_webhook_url');
$token = get_option('wp_telegram_token');
$button_url = get_option('wp_backend_button_url');
$message = "Dies ist eine Testnachricht für $name.";
if ($email) {
wp_mail($email, 'Testnachricht', $message);
}
if ($chat_id) {
wp_multi_comment_notifications_send_telegram($token, $chat_id, 0, $message);
}
if ($discord_webhook) {
wp_multi_comment_notifications_send_discord($discord_webhook, $message);
}
}
/** -------------------------
* Telegram-Nachricht mit Button
* ------------------------- */
function wp_multi_comment_notifications_send_telegram($token, $chat_id, $comment_ID, $message) {
$url = "https://api.telegram.org/bot$token/sendMessage";
$button_url = get_option('wp_backend_button_url');
$data = [
'chat_id' => $chat_id,
'text' => $message,
'parse_mode' => 'HTML'
];
if ($button_url) {
$data['reply_markup'] = json_encode([
'inline_keyboard' => [[['text' => 'Zum Backend', 'url' => $button_url]]]
]);
}
wp_remote_post($url, [
'body' => $data,
'timeout' => 10,
'headers' => ['Content-Type' => 'application/x-www-form-urlencoded'],
]);
}
/** -------------------------
* Discord-Nachricht senden
* ------------------------- */
function wp_multi_comment_notifications_send_discord($webhook_url, $message) {
$payload = json_encode(['content' => $message]);
wp_remote_post($webhook_url, [
'headers' => ['Content-Type' => 'application/json'],
'body' => $payload,
'timeout' => 10,
]);
}