Files
wp-multi/includes/custom-admin-links.php
T
2026-08-14 07:59:43 +00:00

228 lines
13 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
/**
* WP Multi Modul: Custom Admin-Links
*
* 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; }
/*
* Custom Link im Admin Sidebar hinzufügen
*/
// Die benutzerdefinierten Admin-Link-Seiten werden zentral in wp_multi_register_admin_menus() registriert.
// Callback-Funktion für das Anzeigen der benutzerdefinierten Seiten
function wp_stat_notice_custom_page() {
$current_slug = isset($_GET['page']) ? sanitize_key($_GET['page']) : '';
$custom_pages = get_option('wp_stat_notice_custom_pages', []);
if (empty($custom_pages) || !is_array($custom_pages)) {
wpmt_admin_page_open(__('Benutzerdefinierte Seite', 'wp-stat-notice'));
wpmt_admin_notice('error', __('Keine benutzerdefinierten Seiten gefunden.', 'wp-stat-notice'));
wpmt_admin_page_close();
return;
}
foreach ($custom_pages as $page) {
if ($page['slug'] === $current_slug) {
wpmt_admin_page_open($page['title']);
wpmt_admin_card_open();
if (isset($page['url']) && filter_var($page['url'], FILTER_VALIDATE_URL)) {
echo '<script>window.open("' . esc_url($page['url']) . '", "_blank");</script>';
echo '<p>' . __('Die externe Seite wird in einem neuen Fenster geöffnet.', 'wp-stat-notice') . '</p>';
echo '<p><a href="' . esc_url($page['url']) . '" target="_blank" class="wpm-btn wpm-btn--primary">' . esc_html__('Seite manuell öffnen', 'wp-stat-notice') . '</a></p>';
} else {
echo '<p>' . __('Dies ist eine benutzerdefinierte Seite im Admin-Bereich.', 'wp-stat-notice') . '</p>';
}
wpmt_admin_card_close();
wpmt_admin_page_close();
return;
}
}
wpmt_admin_page_open(__('Benutzerdefinierte Seite', 'wp-stat-notice'));
wpmt_admin_notice('error', __('Seite nicht gefunden.', 'wp-stat-notice'));
wpmt_admin_page_close();
}
// Funktion zum Hinzufügen und Verwalten benutzerdefinierter Seiten
function wp_stat_notice_add_custom_page_form() {
$dashicons = [
'dashicons-admin-links', 'dashicons-admin-site', 'dashicons-admin-home',
'dashicons-admin-plugins', 'dashicons-admin-users', 'dashicons-analytics',
'dashicons-archive', 'dashicons-book', 'dashicons-calendar',
'dashicons-camera', 'dashicons-cart', 'dashicons-cloud',
'dashicons-clipboard', 'dashicons-clock', 'dashicons-cloud-upload',
'dashicons-email', 'dashicons-heart', 'dashicons-laptop',
'dashicons-lock', 'dashicons-phone', 'dashicons-rss',
'dashicons-search', 'dashicons-settings', 'dashicons-share',
'dashicons-tag', 'dashicons-thumbs-up', 'dashicons-welcome-learn-more',
'dashicons-welcome-write-blog'
];
?>
<div class="wrap">
<h1><?php _e('Benutzerdefinierten Adminlink hinzufügen', 'wp-stat-notice'); ?></h1>
<!-- Formular zum Hinzufügen -->
<form method="post" action="">
<?php wp_nonce_field('wp_stat_notice_add_page', 'wp_stat_notice_nonce'); ?>
<table class="form-table">
<tr>
<th scope="row"><label for="page_title"><?php _e('Titel der Seite', 'wp-stat-notice'); ?></label></th>
<td><input type="text" name="page_title" id="page_title" required class="regular-text"></td>
</tr>
<tr>
<th scope="row"><label for="page_url"><?php _e('URL der Seite (optional)', 'wp-stat-notice'); ?></label></th>
<td><input type="url" name="page_url" id="page_url" class="regular-text" placeholder="https://example.com"></td>
</tr>
<tr>
<th scope="row"><label for="page_slug"><?php _e('Slug der Seite', 'wp-stat-notice'); ?></label></th>
<td><input type="text" name="page_slug" id="page_slug" required class="regular-text"></td>
</tr>
<tr>
<th scope="row"><label for="page_icon"><?php _e('Dashicon auswählen', 'wp-stat-notice'); ?></label></th>
<td>
<select name="page_icon" id="page_icon" onchange="updateIconPreview(this)">
<?php foreach ($dashicons as $dashicon): ?>
<option value="<?php echo esc_attr($dashicon); ?>"><?php echo esc_html($dashicon); ?></option>
<?php endforeach; ?>
</select>
<div id="icon-preview" class="dashicons" style="font-size: 24px; margin-top: 10px;"></div>
</td>
</tr>
</table>
<p><input type="submit" name="add_custom_page" class="button button-primary" value="<?php _e('Seite hinzufügen', 'wp-stat-notice'); ?>"></p>
</form>
<?php
// Formularverarbeitung für Hinzufügen
if (isset($_POST['add_custom_page']) && check_admin_referer('wp_stat_notice_add_page', 'wp_stat_notice_nonce')) {
$title = sanitize_text_field($_POST['page_title']);
$url = !empty($_POST['page_url']) ? esc_url_raw($_POST['page_url']) : '';
$slug = sanitize_key($_POST['page_slug']);
$icon = in_array($_POST['page_icon'], $dashicons, true) ? $_POST['page_icon'] : 'dashicons-admin-links';
if (empty($title) || empty($slug)) {
echo '<div class="notice notice-error"><p>' . __('Titel und Slug sind erforderlich.', 'wp-stat-notice') . '</p></div>';
} else {
$custom_pages = get_option('wp_stat_notice_custom_pages', []);
$slugs = array_column($custom_pages, 'slug');
if (in_array($slug, $slugs)) {
echo '<div class="notice notice-error"><p>' . __('Dieser Slug wird bereits verwendet.', 'wp-stat-notice') . '</p></div>';
} else {
$custom_pages[] = ['title' => $title, 'url' => $url, 'slug' => $slug, 'icon' => $icon];
update_option('wp_stat_notice_custom_pages', $custom_pages);
echo '<div class="updated"><p>' . __('Benutzerdefinierte Seite wurde hinzugefügt!', 'wp-stat-notice') . '</p></div>';
}
}
}
// Verwaltung der Seiten
$custom_pages = get_option('wp_stat_notice_custom_pages', []);
if (!empty($custom_pages)) {
echo '<h2>' . __('Verwaltung der benutzerdefinierten Seiten', 'wp-stat-notice') . '</h2>';
echo '<table class="widefat fixed" cellspacing="0">';
echo '<thead><tr><th>' . __('Titel', 'wp-stat-notice') . '</th><th>' . __('URL', 'wp-stat-notice') . '</th><th>' . __('Slug', 'wp-stat-notice') . '</th><th>' . __('Aktionen', 'wp-stat-notice') . '</th></tr></thead>';
echo '<tbody>';
foreach ($custom_pages as $index => $page) {
echo '<tr>';
echo '<td>' . esc_html($page['title']) . '</td>';
echo '<td>' . esc_html($page['url'] ?: '-') . '</td>';
echo '<td>' . esc_html($page['slug']) . '</td>';
$delete_url = wp_nonce_url(admin_url('admin.php?page=wp-stat-notice-custom-page&delete=' . $index), 'wp_stat_notice_delete_page_' . $index);
echo '<td><a href="' . esc_url(admin_url('admin.php?page=wp-stat-notice-custom-page&edit=' . $index)) . '">' . __('Bearbeiten', 'wp-stat-notice') . '</a> | ';
echo '<a href="' . esc_url($delete_url) . '" onclick="return confirm(\'' . esc_js(__('Möchtest du diese Seite wirklich löschen?', 'wp-stat-notice')) . '\')">' . __('Löschen', 'wp-stat-notice') . '</a></td>';
echo '</tr>';
}
echo '</tbody></table>';
}
// Bearbeiten
if (isset($_GET['edit']) && isset($custom_pages[(int) $_GET['edit']])) {
$edit_index = (int) $_GET['edit'];
$edit_page = $custom_pages[$edit_index];
echo '<h2>' . __('Seite bearbeiten', 'wp-stat-notice') . '</h2>';
?>
<form method="post" action="">
<?php wp_nonce_field('wp_stat_notice_edit_page', 'wp_stat_notice_nonce'); ?>
<table class="form-table">
<tr>
<th scope="row"><label for="edit_page_title"><?php _e('Titel der Seite', 'wp-stat-notice'); ?></label></th>
<td><input type="text" name="edit_page_title" id="edit_page_title" value="<?php echo esc_attr($edit_page['title']); ?>" required class="regular-text"></td>
</tr>
<tr>
<th scope="row"><label for="edit_page_url"><?php _e('URL der Seite (optional)', 'wp-stat-notice'); ?></label></th>
<td><input type="url" name="edit_page_url" id="edit_page_url" value="<?php echo esc_attr($edit_page['url']); ?>" class="regular-text"></td>
</tr>
<tr>
<th scope="row"><label for="edit_page_slug"><?php _e('Slug der Seite', 'wp-stat-notice'); ?></label></th>
<td><input type="text" name="edit_page_slug" id="edit_page_slug" value="<?php echo esc_attr($edit_page['slug']); ?>" required class="regular-text"></td>
</tr>
<tr>
<th scope="row"><label for="edit_page_icon"><?php _e('Dashicon', 'wp-stat-notice'); ?></label></th>
<td>
<select name="edit_page_icon" id="edit_page_icon" onchange="updateIconPreview(this)">
<?php foreach ($dashicons as $dashicon): ?>
<option value="<?php echo esc_attr($dashicon); ?>" <?php selected($edit_page['icon'], $dashicon); ?>><?php echo esc_html($dashicon); ?></option>
<?php endforeach; ?>
</select>
<div id="icon-preview" class="dashicons <?php echo esc_attr($edit_page['icon']); ?>" style="font-size: 24px; margin-top: 10px;"></div>
</td>
</tr>
</table>
<p><input type="submit" name="save_custom_page" class="button button-primary" value="<?php _e('Änderungen speichern', 'wp-stat-notice'); ?>"></p>
</form>
<?php
if (isset($_POST['save_custom_page']) && check_admin_referer('wp_stat_notice_edit_page', 'wp_stat_notice_nonce')) {
$title = sanitize_text_field($_POST['edit_page_title']);
$url = !empty($_POST['edit_page_url']) ? esc_url_raw($_POST['edit_page_url']) : '';
$slug = sanitize_key($_POST['edit_page_slug']);
$icon = in_array($_POST['edit_page_icon'], $dashicons, true) ? $_POST['edit_page_icon'] : 'dashicons-admin-links';
if (empty($title) || empty($slug)) {
echo '<div class="notice notice-error"><p>' . __('Titel und Slug sind erforderlich.', 'wp-stat-notice') . '</p></div>';
} else {
$custom_pages[$edit_index] = ['title' => $title, 'url' => $url, 'slug' => $slug, 'icon' => $icon];
update_option('wp_stat_notice_custom_pages', $custom_pages);
echo '<div class="updated"><p>' . __('Seite erfolgreich bearbeitet!', 'wp-stat-notice') . '</p></div>';
}
}
}
// Löschen
if (isset($_GET['delete']) && isset($custom_pages[(int) $_GET['delete']])) {
check_admin_referer('wp_stat_notice_delete_page_' . (int) $_GET['delete']);
$delete_index = (int) $_GET['delete'];
unset($custom_pages[$delete_index]);
$custom_pages = array_values($custom_pages);
update_option('wp_stat_notice_custom_pages', $custom_pages);
echo '<div class="updated"><p>' . __('Seite wurde gelöscht.', 'wp-stat-notice') . '</p></div>';
}
?>
</div>
<script>
function updateIconPreview(select) {
const preview = select.nextElementSibling;
preview.className = 'dashicons ' + select.value;
}
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('#page_icon, #edit_page_icon').forEach(select => {
updateIconPreview(select);
});
});
</script>
<?php
}
// Der Menüpunkt "Admin-Link hinzufügen" wird zentral in wp_multi_register_admin_menus() registriert.