mirror of
https://github.com/WPMultisite/wp-multisite-dashboard.git
synced 2025-08-07 14:59:14 +08:00
补充中文语言包
This commit is contained in:
parent
0ecad06f54
commit
836b293850
18 changed files with 5061 additions and 2398 deletions
838
templates/admin-modals.php
Normal file
838
templates/admin-modals.php
Normal file
|
@ -0,0 +1,838 @@
|
|||
<?php
|
||||
if (!defined('ABSPATH')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
$contact_info = get_site_option('msd_contact_info', [
|
||||
'name' => get_network_option(null, 'site_name'),
|
||||
'email' => get_network_option(null, 'admin_email'),
|
||||
'phone' => '',
|
||||
'website' => network_home_url(),
|
||||
'description' => 'Network Administrator Contact Information',
|
||||
'qq' => '',
|
||||
'wechat' => '',
|
||||
'whatsapp' => '',
|
||||
'telegram' => '',
|
||||
'qr_code' => ''
|
||||
]);
|
||||
|
||||
$news_sources = get_site_option('msd_news_sources', [
|
||||
[
|
||||
'name' => 'WordPress News',
|
||||
'url' => 'https://wordpress.org/news/feed/',
|
||||
'enabled' => true
|
||||
]
|
||||
]);
|
||||
|
||||
$quick_links = get_site_option('msd_quick_links', []);
|
||||
?>
|
||||
|
||||
<div id="msd-contact-info-modal" class="msd-modal" style="display: none;">
|
||||
<div class="msd-modal-content">
|
||||
<div class="msd-modal-header">
|
||||
<h3><?php _e('Edit Contact Information', 'wp-multisite-dashboard'); ?></h3>
|
||||
<button type="button" class="msd-modal-close" onclick="MSD.hideContactInfoModal()">×</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div class="msd-contact-form">
|
||||
<div class="msd-form-section">
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Organization Name:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="text" id="msd-contact-name" value="<?php echo esc_attr($contact_info['name']); ?>" placeholder="<?php esc_attr_e('Network Administrator', 'wp-multisite-dashboard'); ?>">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Email:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="email" id="msd-contact-email" value="<?php echo esc_attr($contact_info['email']); ?>" placeholder="admin@example.com">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Phone:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="text" id="msd-contact-phone" value="<?php echo esc_attr($contact_info['phone']); ?>" placeholder="+1 234 567 8900">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Website:', 'wp-multisite-dashboard'); ?></label>
|
||||
<input type="url" id="msd-contact-website" value="<?php echo esc_attr($contact_info['website']); ?>" placeholder="https://example.com">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('Description:', 'wp-multisite-dashboard'); ?></label>
|
||||
<textarea id="msd-contact-description" placeholder="<?php esc_attr_e('Brief description or role', 'wp-multisite-dashboard'); ?>"><?php echo esc_textarea($contact_info['description']); ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-form-section">
|
||||
<div class="msd-form-grid">
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-admin-users"></span>
|
||||
<?php _e('QQ:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-qq" value="<?php echo esc_attr($contact_info['qq']); ?>" placeholder="1234567890">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-format-chat"></span>
|
||||
<?php _e('WeChat:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-wechat" value="<?php echo esc_attr($contact_info['wechat']); ?>" placeholder="WeChat_ID">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-form-grid">
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-smartphone"></span>
|
||||
<?php _e('WhatsApp:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-whatsapp" value="<?php echo esc_attr($contact_info['whatsapp']); ?>" placeholder="+1234567890">
|
||||
</div>
|
||||
|
||||
<div class="msd-form-field">
|
||||
<label>
|
||||
<span class="dashicons dashicons-email-alt"></span>
|
||||
<?php _e('Telegram:', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
<input type="text" id="msd-contact-telegram" value="<?php echo esc_attr($contact_info['telegram']); ?>" placeholder="@username">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-form-section">
|
||||
<div class="msd-form-field">
|
||||
<label><?php _e('QR Code Image URL:', 'wp-multisite-dashboard'); ?></label>
|
||||
<div class="msd-qr-input-group">
|
||||
<input type="url" id="msd-contact-qr-code" value="<?php echo esc_attr($contact_info['qr_code']); ?>" placeholder="https://example.com/qr-code.png">
|
||||
<button type="button" class="button" onclick="MSD.selectQRImage()"><?php _e('Select Image', 'wp-multisite-dashboard'); ?></button>
|
||||
</div>
|
||||
<p class="description"><?php _e('Upload or provide URL for a QR code image (WeChat, contact info, etc.)', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<div id="msd-qr-preview" class="msd-qr-preview" style="<?php echo empty($contact_info['qr_code']) ? 'display: none;' : ''; ?>">
|
||||
<img src="<?php echo esc_url($contact_info['qr_code']); ?>" alt="QR Code Preview" class="msd-qr-preview-img">
|
||||
<button type="button" class="msd-qr-remove" onclick="MSD.removeQRCode()">×</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-footer">
|
||||
<button type="button" class="button button-primary" onclick="MSD.saveContactInfo()">
|
||||
<?php _e('Save Contact Info', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.hideContactInfoModal()">
|
||||
<?php _e('Cancel', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="msd-news-sources-modal" class="msd-modal" style="display: none;">
|
||||
<div class="msd-modal-content">
|
||||
<div class="msd-modal-header">
|
||||
<h3><?php _e('Configure News Sources', 'wp-multisite-dashboard'); ?></h3>
|
||||
<button type="button" class="msd-modal-close" onclick="MSD.hideNewsSourcesModal()">×</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div id="msd-news-sources-editor">
|
||||
<?php if (!empty($news_sources)): ?>
|
||||
<?php foreach ($news_sources as $index => $source): ?>
|
||||
<div class="msd-news-source-item">
|
||||
<div class="msd-source-row">
|
||||
<input type="text"
|
||||
placeholder="<?php esc_attr_e('Source Name', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_attr($source['name']); ?>"
|
||||
class="msd-news-name"
|
||||
required>
|
||||
<input type="url"
|
||||
placeholder="<?php esc_attr_e('RSS Feed URL', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_url($source['url']); ?>"
|
||||
class="msd-news-url"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<div class="msd-source-options">
|
||||
<label class="msd-checkbox-label">
|
||||
<input type="checkbox"
|
||||
class="msd-news-enabled"
|
||||
<?php checked(!empty($source['enabled'])); ?>>
|
||||
<?php _e('Enabled', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
|
||||
<button type="button" class="msd-remove-source">
|
||||
<?php _e('Remove', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="msd-add-source-section">
|
||||
<button type="button" id="msd-add-news-source" class="button button-secondary">
|
||||
<span class="dashicons dashicons-plus-alt"></span>
|
||||
<?php _e('Add News Source', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-news-help">
|
||||
<h4><?php _e('Popular RSS Feeds', 'wp-multisite-dashboard'); ?></h4>
|
||||
<div class="msd-rss-suggestions">
|
||||
<div class="msd-rss-suggestion">
|
||||
<strong>WenPai.org News</strong>
|
||||
<code>https://wenpai.org/news/feed/</code>
|
||||
<span class="msd-rss-desc">Official WenPai.org news and updates</span>
|
||||
</div>
|
||||
<div class="msd-rss-suggestion">
|
||||
<strong>WP TEA</strong>
|
||||
<code>https://wptea.com/feed</code>
|
||||
<span class="msd-rss-desc">WordPress China community news and insights</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-footer">
|
||||
<button type="button" class="button button-primary" onclick="MSD.saveNewsSources()">
|
||||
<?php _e('Save News Sources', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.hideNewsSourcesModal()">
|
||||
<?php _e('Cancel', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="msd-quick-links-modal" class="msd-modal" style="display: none;">
|
||||
<div class="msd-modal-content">
|
||||
<div class="msd-modal-header">
|
||||
<h3><?php _e('Configure Quick Links', 'wp-multisite-dashboard'); ?></h3>
|
||||
<button type="button" class="msd-modal-close" onclick="MSD.hideQuickLinksModal()">×</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div id="msd-quick-links-editor">
|
||||
<?php if (!empty($quick_links)): ?>
|
||||
<?php foreach ($quick_links as $index => $link): ?>
|
||||
<div class="msd-link-item">
|
||||
<div class="msd-link-row">
|
||||
<input type="text"
|
||||
placeholder="<?php esc_attr_e('Link Title', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_attr($link['title']); ?>"
|
||||
class="msd-link-title"
|
||||
required>
|
||||
<input type="url"
|
||||
placeholder="https://example.com"
|
||||
value="<?php echo esc_url($link['url']); ?>"
|
||||
class="msd-link-url"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<div class="msd-link-options">
|
||||
<input type="text"
|
||||
placeholder="<?php esc_attr_e('dashicons-admin-home or 🏠', 'wp-multisite-dashboard'); ?>"
|
||||
value="<?php echo esc_attr($link['icon']); ?>"
|
||||
class="msd-link-icon"
|
||||
title="<?php esc_attr_e('Icon (Dashicon class or emoji)', 'wp-multisite-dashboard'); ?>">
|
||||
|
||||
<label class="msd-checkbox-label">
|
||||
<input type="checkbox"
|
||||
class="msd-link-newtab"
|
||||
<?php checked(!empty($link['new_tab'])); ?>>
|
||||
<?php _e('Open in new tab', 'wp-multisite-dashboard'); ?>
|
||||
</label>
|
||||
|
||||
<button type="button" class="msd-remove-link">
|
||||
<?php _e('Remove', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="msd-add-link-section">
|
||||
<button type="button" id="msd-add-link" class="button button-secondary">
|
||||
<span class="dashicons dashicons-plus-alt"></span>
|
||||
<?php _e('Add Link', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-quick-links-help">
|
||||
<h4><?php _e('Icon Options', 'wp-multisite-dashboard'); ?></h4>
|
||||
|
||||
<div class="msd-icon-types">
|
||||
<div class="msd-icon-type-section">
|
||||
<h5><?php _e('WordPress Dashicons', 'wp-multisite-dashboard'); ?></h5>
|
||||
<div class="msd-icon-examples">
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-home"></span>
|
||||
<code>dashicons-admin-home</code>
|
||||
<span><?php _e('Home', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-chart-bar"></span>
|
||||
<code>dashicons-chart-bar</code>
|
||||
<span><?php _e('Analytics', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-icon-type-section">
|
||||
<h5><?php _e('Emojis', 'wp-multisite-dashboard'); ?></h5>
|
||||
<div class="msd-icon-examples">
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">🏠</span>
|
||||
<code>🏠</code>
|
||||
<span><?php _e('Home', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">⚙️</span>
|
||||
<code>⚙️</code>
|
||||
<span><?php _e('Settings', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="description">
|
||||
<strong><?php _e('Dashicons:', 'wp-multisite-dashboard'); ?></strong> <?php _e('Built into WordPress, always available. Use format:', 'wp-multisite-dashboard'); ?> <code>dashicons-icon-name</code><br>
|
||||
<strong><?php _e('Emojis:', 'wp-multisite-dashboard'); ?></strong> <?php _e('Copy and paste emoji directly. Works on all devices.', 'wp-multisite-dashboard'); ?>
|
||||
</p>
|
||||
|
||||
<p class="description">
|
||||
<?php printf(__('Find more Dashicons at %s', 'wp-multisite-dashboard'), '<a href="https://developer.wordpress.org/resource/dashicons/" target="_blank">developer.wordpress.org/resource/dashicons/</a>'); ?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-modal-footer">
|
||||
<button type="button" class="button button-primary" onclick="MSD.saveQuickLinks()">
|
||||
<?php _e('Save Links', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.hideQuickLinksModal()">
|
||||
<?php _e('Cancel', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.msd-modal-intro {
|
||||
margin-bottom: 24px;
|
||||
padding: 12px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 4px;
|
||||
border-left: 4px solid var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-modal-intro p {
|
||||
margin: 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-contact-form {
|
||||
display: grid;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.msd-form-section {
|
||||
padding: 16px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
background: var(--msd-bg-light);
|
||||
}
|
||||
|
||||
.msd-form-section h4 {
|
||||
margin: 0 0 16px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
border-bottom: 1px solid var(--msd-border);
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.msd-form-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.msd-form-field {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.msd-form-field:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.msd-form-field label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
margin-bottom: 6px;
|
||||
font-weight: 500;
|
||||
color: var(--msd-text);
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.msd-form-field label .dashicons {
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-form-field input,
|
||||
.msd-form-field textarea {
|
||||
width: 100%;
|
||||
padding: 4px 8px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius-small);
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-form-field input:focus,
|
||||
.msd-form-field textarea:focus {
|
||||
outline: none;
|
||||
border-color: var(--msd-primary);
|
||||
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.1);
|
||||
}
|
||||
|
||||
.msd-form-field textarea {
|
||||
min-height: 80px;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.msd-qr-input-group {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.msd-qr-input-group input {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.msd-qr-input-group .button {
|
||||
flex-shrink: 0;
|
||||
padding: 4px 16px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.msd-qr-preview {
|
||||
margin-top: 12px;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
padding: 8px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.msd-qr-preview-img {
|
||||
max-width: 120px;
|
||||
max-height: 120px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.msd-qr-remove {
|
||||
position: absolute;
|
||||
top: -8px;
|
||||
right: -8px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
background: var(--msd-danger);
|
||||
color: white;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-qr-remove:hover {
|
||||
background: #c82333;
|
||||
}
|
||||
|
||||
.msd-form-field .description {
|
||||
margin: 6px 0 0 0;
|
||||
font-size: 12px;
|
||||
color: var(--msd-text-light);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-news-source-item {
|
||||
margin-bottom: 16px;
|
||||
padding: 16px;
|
||||
background: var(--msd-bg);
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-news-source-item:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-source-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 2fr;
|
||||
gap: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-source-options {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.msd-news-name,
|
||||
.msd-news-url {
|
||||
width: 100%;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius-small);
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-news-name:focus,
|
||||
.msd-news-url:focus {
|
||||
outline: none;
|
||||
border-color: var(--msd-primary);
|
||||
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.1);
|
||||
}
|
||||
|
||||
.msd-checkbox-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 13px;
|
||||
color: var(--msd-text);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.msd-checkbox-label input[type="checkbox"] {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.msd-add-source-section {
|
||||
text-align: center;
|
||||
margin: 24px 0;
|
||||
padding: 16px;
|
||||
border: 2px dashed var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-add-source-section:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
#msd-add-news-source {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.msd-news-help {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: var(--msd-radius);
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-news-help h4 {
|
||||
margin: 0 0 12px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.msd-rss-suggestions {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion {
|
||||
display: grid;
|
||||
grid-template-columns: 120px 1fr;
|
||||
gap: 8px;
|
||||
padding: 8px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion strong {
|
||||
color: var(--msd-text);
|
||||
font-size: 11px;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion code {
|
||||
background: #e9ecef;
|
||||
padding: 2px 4px;
|
||||
border-radius: 2px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 10px;
|
||||
word-break: break-all;
|
||||
grid-column: 1 / -1;
|
||||
margin: 2px 0;
|
||||
}
|
||||
|
||||
.msd-rss-desc {
|
||||
color: var(--msd-text-light);
|
||||
font-size: 11px;
|
||||
grid-column: 1 / -1;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.msd-link-item {
|
||||
margin-bottom: var(--msd-spacing);
|
||||
padding: var(--msd-spacing);
|
||||
background: var(--msd-bg);
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
}
|
||||
|
||||
.msd-link-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 12px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-link-options {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto auto;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.msd-link-title,
|
||||
.msd-link-url,
|
||||
.msd-link-icon {
|
||||
width: 100%;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius-small);
|
||||
font-size: 14px;
|
||||
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-link-title:focus,
|
||||
.msd-link-url:focus,
|
||||
.msd-link-icon:focus {
|
||||
outline: none;
|
||||
border-color: var(--msd-primary);
|
||||
box-shadow: 0 0 0 2px rgba(34, 113, 177, 0.1);
|
||||
}
|
||||
|
||||
.msd-add-link-section {
|
||||
text-align: center;
|
||||
margin: 24px 0;
|
||||
padding: 16px;
|
||||
border: 2px dashed var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-add-link-section:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
#msd-add-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.msd-quick-links-help {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: var(--msd-radius);
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-quick-links-help h4 {
|
||||
margin: 0 0 16px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.msd-icon-types {
|
||||
display: grid;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.msd-icon-type-section h5 {
|
||||
margin: 0 0 12px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
padding-bottom: 6px;
|
||||
border-bottom: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-icon-examples {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
||||
gap: 8px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-icon-example {
|
||||
display: grid;
|
||||
grid-template-columns: 24px 1fr auto;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
padding: 8px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-icon-example .dashicons {
|
||||
font-size: 16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-icon-example .msd-emoji {
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.msd-icon-example code {
|
||||
background: #e9ecef;
|
||||
padding: 2px 4px;
|
||||
border-radius: 2px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 10px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.msd-icon-example span:last-child {
|
||||
color: var(--msd-text-light);
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.msd-quick-links-help .description {
|
||||
margin: 12px 0 0 0;
|
||||
font-size: 12px;
|
||||
color: var(--msd-text-light);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-quick-links-help .description:last-child {
|
||||
margin-top: 8px;
|
||||
padding-top: 8px;
|
||||
border-top: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-quick-links-help a {
|
||||
color: var(--msd-primary);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.msd-quick-links-help a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.msd-remove-source,
|
||||
.msd-remove-link {
|
||||
font-size: 12px;
|
||||
padding: 4px 8px;
|
||||
color: var(--msd-danger);
|
||||
border: 1px solid var(--msd-danger);
|
||||
background: none;
|
||||
border-radius: var(--msd-radius-small);
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-remove-source:hover,
|
||||
.msd-remove-link:hover {
|
||||
background: var(--msd-danger);
|
||||
color: white;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
.msd-source-row {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-source-options {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.msd-link-row {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-link-options {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.msd-form-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-icon-examples {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.msd-modal-content {
|
||||
margin: 20px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.msd-rss-suggestion {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.msd-news-source-item.error {
|
||||
border-color: var(--msd-danger);
|
||||
background: #fff5f5;
|
||||
}
|
||||
|
||||
.msd-news-url.error {
|
||||
border-color: var(--msd-danger);
|
||||
}
|
||||
|
||||
.msd-link-item.error {
|
||||
border-color: var(--msd-danger);
|
||||
background: #fff5f5;
|
||||
}
|
||||
|
||||
.msd-link-url.error {
|
||||
border-color: var(--msd-danger);
|
||||
}
|
||||
</style>
|
|
@ -14,10 +14,6 @@ $quick_links = get_site_option('msd_quick_links', []);
|
|||
</div>
|
||||
|
||||
<div class="msd-modal-body">
|
||||
<div class="msd-modal-intro">
|
||||
<p><?php _e('Add custom links to frequently used pages or external tools. These will appear as clickable tiles in your Quick Links widget. You can use WordPress Dashicons or emojis for icons. Links can be reordered by dragging and dropping.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
|
||||
<div id="msd-quick-links-editor">
|
||||
<?php if (!empty($quick_links)): ?>
|
||||
<?php foreach ($quick_links as $index => $link): ?>
|
||||
|
@ -75,33 +71,13 @@ $quick_links = get_site_option('msd_quick_links', []);
|
|||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-home"></span>
|
||||
<code>dashicons-admin-home</code>
|
||||
<span><?php _e('Home/Dashboard', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-settings"></span>
|
||||
<code>dashicons-admin-settings</code>
|
||||
<span><?php _e('Settings', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-admin-users"></span>
|
||||
<code>dashicons-admin-users</code>
|
||||
<span><?php _e('Users', 'wp-multisite-dashboard'); ?></span>
|
||||
<span><?php _e('Home', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-chart-bar"></span>
|
||||
<code>dashicons-chart-bar</code>
|
||||
<span><?php _e('Analytics', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-email"></span>
|
||||
<code>dashicons-email</code>
|
||||
<span><?php _e('Email', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="dashicons dashicons-external"></span>
|
||||
<code>dashicons-external</code>
|
||||
<span><?php _e('External Link', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -118,35 +94,10 @@ $quick_links = get_site_option('msd_quick_links', []);
|
|||
<code>⚙️</code>
|
||||
<span><?php _e('Settings', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">👥</span>
|
||||
<code>👥</code>
|
||||
<span><?php _e('Users', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">📊</span>
|
||||
<code>📊</code>
|
||||
<span><?php _e('Analytics', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">📧</span>
|
||||
<code>📧</code>
|
||||
<span><?php _e('Email', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
<div class="msd-icon-example">
|
||||
<span class="msd-emoji">🔗</span>
|
||||
<code>🔗</code>
|
||||
<span><?php _e('Link', 'wp-multisite-dashboard'); ?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-reorder-tip">
|
||||
<h5><?php _e('Drag & Drop Reordering', 'wp-multisite-dashboard'); ?></h5>
|
||||
<p class="description"><?php _e('After saving your links, you can reorder them by dragging and dropping the tiles in the Quick Links widget.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
|
||||
<p class="description">
|
||||
<strong><?php _e('Dashicons:', 'wp-multisite-dashboard'); ?></strong> <?php _e('Built into WordPress, always available. Use format:', 'wp-multisite-dashboard'); ?> <code>dashicons-icon-name</code><br>
|
||||
<strong><?php _e('Emojis:', 'wp-multisite-dashboard'); ?></strong> <?php _e('Copy and paste emoji directly. Works on all devices.', 'wp-multisite-dashboard'); ?>
|
||||
|
|
|
@ -6,6 +6,10 @@ if (!defined('ABSPATH')) {
|
|||
if (isset($_GET['updated']) && $_GET['updated'] === 'true') {
|
||||
echo '<div class="notice notice-success is-dismissible"><p>' . __('Settings saved successfully!', 'wp-multisite-dashboard') . '</p></div>';
|
||||
}
|
||||
|
||||
$plugin_core = WP_MSD_Plugin_Core::get_instance();
|
||||
$enabled_widgets = $plugin_core->get_enabled_widgets();
|
||||
$settings_manager = new WP_MSD_Settings_Manager();
|
||||
?>
|
||||
|
||||
<div class="wrap">
|
||||
|
@ -22,8 +26,8 @@ if (isset($_GET['updated']) && $_GET['updated'] === 'true') {
|
|||
</h1>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('Widget Configuration', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Enable or disable dashboard widgets according to your needs.', 'wp-multisite-dashboard'); ?></p>
|
||||
<h2><?php _e('Plugin Widget Configuration', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Enable or disable custom dashboard widgets provided by this plugin.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<form method="post" action="">
|
||||
<?php wp_nonce_field('msd_settings', 'msd_settings_nonce'); ?>
|
||||
|
@ -36,108 +40,100 @@ if (isset($_GET['updated']) && $_GET['updated'] === 'true') {
|
|||
type="checkbox"
|
||||
name="widgets[<?php echo esc_attr($widget_id); ?>]"
|
||||
value="1"
|
||||
<?php checked(!empty($this->enabled_widgets[$widget_id])); ?>
|
||||
<?php checked(!empty($enabled_widgets[$widget_id])); ?>
|
||||
/>
|
||||
<?php echo esc_html($widget_name); ?>
|
||||
</label>
|
||||
<p class="description">
|
||||
<?php echo $this->get_widget_description($widget_id); ?>
|
||||
<?php echo $settings_manager->get_widget_description($widget_id); ?>
|
||||
</p>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<h3><?php _e('System & Third-Party Widgets', 'wp-multisite-dashboard'); ?></h3>
|
||||
<p><?php _e('Control the display of WordPress system widgets and widgets from other plugins.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<?php
|
||||
$available_widgets = $settings_manager->get_available_system_widgets();
|
||||
$disabled_widgets = get_site_option('msd_disabled_system_widgets', []);
|
||||
|
||||
if (!empty($available_widgets)):
|
||||
?>
|
||||
<div class="msd-system-widgets-grid">
|
||||
<?php
|
||||
$system_widgets = array_filter($available_widgets, function($widget) {
|
||||
return $widget['is_system'];
|
||||
});
|
||||
|
||||
$third_party_widgets = array_filter($available_widgets, function($widget) {
|
||||
return !$widget['is_system'] && !$widget['is_custom'];
|
||||
});
|
||||
?>
|
||||
|
||||
<?php if (!empty($system_widgets)): ?>
|
||||
<div class="msd-widget-section">
|
||||
<h4><?php _e('WordPress System Widgets', 'wp-multisite-dashboard'); ?></h4>
|
||||
<?php foreach ($system_widgets as $widget_id => $widget_data): ?>
|
||||
<div class="msd-widget-toggle">
|
||||
<label>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="system_widgets[<?php echo esc_attr($widget_id); ?>]"
|
||||
value="1"
|
||||
<?php checked(!in_array($widget_id, $disabled_widgets)); ?>
|
||||
/>
|
||||
<?php echo esc_html($widget_data['title']); ?>
|
||||
<span class="msd-widget-meta">(<?php echo esc_html($widget_data['context']); ?>)</span>
|
||||
</label>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (!empty($third_party_widgets)): ?>
|
||||
<div class="msd-widget-section">
|
||||
<h4><?php _e('Third-Party Plugin Widgets', 'wp-multisite-dashboard'); ?></h4>
|
||||
<?php foreach ($third_party_widgets as $widget_id => $widget_data): ?>
|
||||
<div class="msd-widget-toggle">
|
||||
<label>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="system_widgets[<?php echo esc_attr($widget_id); ?>]"
|
||||
value="1"
|
||||
<?php checked(!in_array($widget_id, $disabled_widgets)); ?>
|
||||
/>
|
||||
<?php echo esc_html($widget_data['title']); ?>
|
||||
<span class="msd-widget-meta">(<?php echo esc_html($widget_data['context']); ?>)</span>
|
||||
</label>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="msd-widget-section">
|
||||
<h4><?php _e('Third-Party Plugin Widgets', 'wp-multisite-dashboard'); ?></h4>
|
||||
<div class="msd-no-third-party">
|
||||
<p><?php _e('No third-party widgets detected yet.', 'wp-multisite-dashboard'); ?></p>
|
||||
<p class="description"><?php _e('Third-party widgets are automatically detected when you visit the network dashboard. If you have plugins that add dashboard widgets, visit the dashboard first, then return here to see them.', 'wp-multisite-dashboard'); ?></p>
|
||||
<a href="<?php echo network_admin_url(); ?>" class="button button-secondary">
|
||||
<?php _e('Visit Network Dashboard', 'wp-multisite-dashboard'); ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="msd-no-widgets">
|
||||
<p><?php _e('No system widgets found.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<p class="submit">
|
||||
<?php submit_button(__('Save Widget Settings', 'wp-multisite-dashboard'), 'primary', 'submit', false); ?>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('News Sources Configuration', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Configure custom RSS news sources for the Network News widget.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<div class="msd-news-sources-config">
|
||||
<?php
|
||||
$news_sources = get_site_option('msd_news_sources', [
|
||||
[
|
||||
'name' => 'WordPress News',
|
||||
'url' => 'https://wordpress.org/news/feed/',
|
||||
'enabled' => true
|
||||
]
|
||||
]);
|
||||
?>
|
||||
|
||||
<div class="msd-current-sources">
|
||||
<h3><?php _e('Current News Sources', 'wp-multisite-dashboard'); ?></h3>
|
||||
|
||||
<?php if (!empty($news_sources)): ?>
|
||||
<table class="wp-list-table widefat striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?php _e('Source Name', 'wp-multisite-dashboard'); ?></th>
|
||||
<th><?php _e('RSS URL', 'wp-multisite-dashboard'); ?></th>
|
||||
<th><?php _e('Status', 'wp-multisite-dashboard'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($news_sources as $source): ?>
|
||||
<tr>
|
||||
<td><strong><?php echo esc_html($source['name']); ?></strong></td>
|
||||
<td>
|
||||
<a href="<?php echo esc_url($source['url']); ?>" target="_blank" class="msd-url-link">
|
||||
<?php echo esc_html($source['url']); ?>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($source['enabled']): ?>
|
||||
<span class="msd-status-badge msd-status-active"><?php _e('Enabled', 'wp-multisite-dashboard'); ?></span>
|
||||
<?php else: ?>
|
||||
<span class="msd-status-badge msd-status-inactive"><?php _e('Disabled', 'wp-multisite-dashboard'); ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<div class="msd-empty-state">
|
||||
<p><?php _e('No news sources configured.', 'wp-multisite-dashboard'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="msd-news-actions">
|
||||
<button type="button" class="button button-primary" onclick="MSD.showNewsSourcesModal()">
|
||||
<span class="dashicons dashicons-rss"></span>
|
||||
<?php _e('Manage News Sources', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
|
||||
<button type="button" class="button button-secondary" onclick="MSD.clearNewsCache()">
|
||||
↻
|
||||
<?php _e('Clear News Cache', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="msd-news-help">
|
||||
<h4><?php _e('Popular RSS Sources', 'wp-multisite-dashboard'); ?></h4>
|
||||
<div class="msd-rss-examples">
|
||||
<div class="msd-rss-example">
|
||||
<strong>WordPress News:</strong>
|
||||
<code>https://wordpress.org/news/feed/</code>
|
||||
</div>
|
||||
<div class="msd-rss-example">
|
||||
<strong>WP Tavern:</strong>
|
||||
<code>https://wptavern.com/feed</code>
|
||||
</div>
|
||||
</div>
|
||||
<p class="description">
|
||||
<?php _e('You can add any valid RSS or Atom feed URL. The news widget will fetch and display the latest articles from your configured sources.', 'wp-multisite-dashboard'); ?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('Cache Management', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Clear cached data to refresh dashboard widgets.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
@ -151,217 +147,317 @@ if (isset($_GET['updated']) && $_GET['updated'] === 'true') {
|
|||
<span class="dashicons dashicons-admin-multisite"></span>
|
||||
<?php _e('Clear Network Data', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
<button type="button" class="button" onclick="MSD.clearWidgetCache()">
|
||||
<span class="dashicons dashicons-dashboard"></span>
|
||||
<?php _e('Clear Widget Cache', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p class="description">
|
||||
<?php _e('Clearing caches will force the dashboard widgets to reload fresh data on the next page visit.', 'wp-multisite-dashboard'); ?>
|
||||
<?php _e('Clearing caches will force the dashboard widgets to reload fresh data on the next page visit. Widget cache contains the list of detected third-party widgets.', 'wp-multisite-dashboard'); ?>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="msd-card">
|
||||
<h2><?php _e('Plugin Information', 'wp-multisite-dashboard'); ?></h2>
|
||||
<p><?php _e('Current plugin status and update information.', 'wp-multisite-dashboard'); ?></p>
|
||||
|
||||
<div class="msd-plugin-info">
|
||||
<div class="msd-info-row">
|
||||
<span class="msd-info-label"><?php _e('Current Version:', 'wp-multisite-dashboard'); ?></span>
|
||||
<span class="msd-info-value"><?php echo esc_html(WP_MSD_VERSION); ?></span>
|
||||
</div>
|
||||
|
||||
<div class="msd-info-row">
|
||||
<span class="msd-info-label"><?php _e('Update Status:', 'wp-multisite-dashboard'); ?></span>
|
||||
<span class="msd-info-value" id="msd-update-status">
|
||||
<button type="button" class="button button-small" onclick="MSD.checkForUpdates()">
|
||||
<?php _e('Check for Updates', 'wp-multisite-dashboard'); ?>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.msd-status-badge {
|
||||
display: inline-block;
|
||||
padding: 2px 8px;
|
||||
border-radius: 3px;
|
||||
font-size: 11px;
|
||||
font-weight: 400;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.msd-status-active {
|
||||
background: #d1eddb;
|
||||
color: #155724;
|
||||
}
|
||||
|
||||
.msd-status-inactive {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.msd-cache-actions,
|
||||
.msd-news-actions {
|
||||
.msd-cache-actions {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
margin: 16px 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.msd-cache-actions .button,
|
||||
.msd-news-actions .button {
|
||||
.msd-cache-actions .button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.msd-news-sources-config {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.msd-current-sources h3 {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-url-link {
|
||||
word-break: break-all;
|
||||
color: var(--msd-primary);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.msd-url-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.msd-news-help {
|
||||
margin-top: 24px;
|
||||
padding: 16px;
|
||||
.msd-plugin-info {
|
||||
background: #f8f9fa;
|
||||
padding: 16px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-news-help h4 {
|
||||
margin: 0 0 12px 0;
|
||||
color: var(--msd-text);
|
||||
}
|
||||
|
||||
.msd-rss-examples {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.msd-rss-example {
|
||||
.msd-info-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 8px;
|
||||
background: white;
|
||||
border-radius: 3px;
|
||||
font-size: 13px;
|
||||
padding: 8px 0;
|
||||
border-bottom: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-rss-example strong {
|
||||
.msd-info-row:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.msd-info-label {
|
||||
font-weight: 600;
|
||||
color: var(--msd-text);
|
||||
}
|
||||
|
||||
.msd-rss-example code {
|
||||
background: #e9ecef;
|
||||
padding: 2px 6px;
|
||||
border-radius: 2px;
|
||||
font-family: 'Courier New', monospace;
|
||||
.msd-info-value {
|
||||
color: var(--msd-text-light);
|
||||
}
|
||||
|
||||
.msd-update-available {
|
||||
color: #d63638;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.msd-update-current {
|
||||
color: #00a32a;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.msd-settings-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
gap: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.msd-widget-toggle {
|
||||
background: var(--msd-bg-light);
|
||||
border: 1px solid var(--msd-border);
|
||||
border-radius: var(--msd-radius);
|
||||
padding: 20px;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-widget-toggle:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-widget-toggle label {
|
||||
font-weight: 400;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 8px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.msd-widget-toggle input[type="checkbox"] {
|
||||
margin: 0;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
|
||||
.msd-widget-toggle .description {
|
||||
margin: 0;
|
||||
font-size: 11px;
|
||||
color: #8c8c8c;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.msd-card {
|
||||
background: #fff;
|
||||
border: 1px solid #ccd0d4;
|
||||
border-radius: 4px;
|
||||
max-width: unset;
|
||||
margin-top: 20px;
|
||||
padding: 20px;
|
||||
box-shadow: 0 1px 1px rgba(0, 0, 0, .04);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.msd-system-widgets-grid {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.msd-widget-section {
|
||||
margin-bottom: 30px;
|
||||
padding: 20px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #e9ecef;
|
||||
}
|
||||
|
||||
.msd-widget-section h4 {
|
||||
margin: 0 0 15px 0;
|
||||
color: var(--msd-text);
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
padding-bottom: 8px;
|
||||
border-bottom: 2px solid #007cba;
|
||||
}
|
||||
|
||||
.msd-widget-section .msd-widget-toggle {
|
||||
margin-bottom: 12px;
|
||||
padding: 10px;
|
||||
background: white;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ddd;
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.msd-widget-section .msd-widget-toggle:hover {
|
||||
border-color: var(--msd-primary);
|
||||
}
|
||||
|
||||
.msd-widget-section .msd-widget-toggle label {
|
||||
margin: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.msd-widget-meta {
|
||||
font-size: 12px;
|
||||
color: var(--msd-text-light);
|
||||
font-style: italic;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.msd-no-widgets,
|
||||
.msd-no-third-party {
|
||||
text-align: center;
|
||||
padding: 40px 20px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 6px;
|
||||
border: 2px dashed #ddd;
|
||||
color: var(--msd-text-light);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 768px) {
|
||||
.msd-cache-actions,
|
||||
.msd-news-actions {
|
||||
.msd-cache-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.msd-rss-example {
|
||||
.msd-info-row {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.msd-widget-section {
|
||||
margin-bottom: 20px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.msd-widget-section .msd-widget-toggle label {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.msd-widget-meta {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.msd-settings-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
window.MSD = window.MSD || {};
|
||||
jQuery(document).ready(function($) {
|
||||
'use strict';
|
||||
|
||||
MSD.clearCache = function(type) {
|
||||
if (!confirm('<?php echo esc_js(__('Are you sure you want to clear the cache?', 'wp-multisite-dashboard')); ?>')) {
|
||||
return;
|
||||
}
|
||||
// 确保全局 MSD 对象存在
|
||||
window.MSD = window.MSD || {};
|
||||
|
||||
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
|
||||
jQuery.post(ajaxurl, {
|
||||
action: 'msd_clear_cache',
|
||||
cache_type: type,
|
||||
nonce: '<?php echo wp_create_nonce('msd_clear_cache'); ?>'
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('<?php echo esc_js(__('Cache cleared successfully!', 'wp-multisite-dashboard')); ?>');
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Failed to clear cache.', 'wp-multisite-dashboard')); ?>');
|
||||
// 清除缓存功能
|
||||
window.MSD.clearCache = function(type) {
|
||||
if (!confirm('Are you sure you want to clear the cache?')) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
MSD.clearNewsCache = function() {
|
||||
if (!confirm('<?php echo esc_js(__('Are you sure you want to clear the news cache?', 'wp-multisite-dashboard')); ?>')) {
|
||||
return;
|
||||
}
|
||||
$.post(msdAjax.ajaxurl, {
|
||||
action: 'msd_clear_cache',
|
||||
cache_type: type,
|
||||
nonce: msdAjax.nonce
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('Cache cleared successfully!');
|
||||
} else {
|
||||
alert('Failed to clear cache: ' + (response.data || 'Unknown error'));
|
||||
}
|
||||
}).fail(function() {
|
||||
alert('Failed to clear cache due to network error.');
|
||||
});
|
||||
};
|
||||
|
||||
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
// 检查更新功能
|
||||
window.MSD.checkForUpdates = function() {
|
||||
var $status = $('#msd-update-status');
|
||||
var $button = $status.find('button');
|
||||
|
||||
jQuery.post(ajaxurl, {
|
||||
action: 'msd_refresh_widget_data',
|
||||
widget: 'custom_news',
|
||||
nonce: '<?php echo wp_create_nonce('msd_ajax_nonce'); ?>'
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('<?php echo esc_js(__('News cache cleared successfully!', 'wp-multisite-dashboard')); ?>');
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Failed to clear news cache.', 'wp-multisite-dashboard')); ?>');
|
||||
$button.prop('disabled', true).text('Checking...');
|
||||
|
||||
$.post(msdAjax.ajaxurl, {
|
||||
action: 'msd_check_plugin_update',
|
||||
nonce: msdAjax.nonce
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
if (response.data.version) {
|
||||
$status.html('<span class="msd-update-available">Version ' + response.data.version + ' available!</span>');
|
||||
if (response.data.details_url) {
|
||||
$status.append(' <a href="' + response.data.details_url + '" target="_blank">View Details</a>');
|
||||
}
|
||||
} else {
|
||||
$status.html('<span class="msd-update-current">Up to date</span>');
|
||||
}
|
||||
} else {
|
||||
$button.prop('disabled', false).text('Check for Updates');
|
||||
alert('Failed to check for updates: ' + (response.data || 'Unknown error'));
|
||||
}
|
||||
}).fail(function() {
|
||||
$button.prop('disabled', false).text('Check for Updates');
|
||||
alert('Failed to check for updates due to network error.');
|
||||
});
|
||||
};
|
||||
|
||||
// 清除小部件缓存功能
|
||||
window.MSD.clearWidgetCache = function() {
|
||||
if (!confirm('Are you sure you want to clear the widget cache? This will refresh the list of detected widgets.')) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
MSD.showNewsSourcesModal = function() {
|
||||
if (typeof jQuery !== 'undefined' && jQuery('#msd-news-sources-modal').length) {
|
||||
jQuery('#msd-news-sources-modal').fadeIn(200);
|
||||
jQuery('body').addClass('modal-open');
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Please go to the dashboard to configure news sources.', 'wp-multisite-dashboard')); ?>');
|
||||
}
|
||||
};
|
||||
$.post(msdAjax.ajaxurl, {
|
||||
action: 'msd_clear_widget_cache',
|
||||
nonce: msdAjax.nonce
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('Widget cache cleared successfully! Please reload the page to see updated widgets.');
|
||||
location.reload();
|
||||
} else {
|
||||
alert('Failed to clear widget cache: ' + (response.data || 'Unknown error'));
|
||||
}
|
||||
}).fail(function() {
|
||||
alert('Failed to clear widget cache due to network error.');
|
||||
});
|
||||
};
|
||||
|
||||
MSD.hideNewsSourcesModal = function() {
|
||||
if (typeof jQuery !== 'undefined') {
|
||||
jQuery('#msd-news-sources-modal').fadeOut(200);
|
||||
jQuery('body').removeClass('modal-open');
|
||||
}
|
||||
};
|
||||
// 调试信息
|
||||
console.log('MSD Settings loaded with functions:', Object.keys(window.MSD));
|
||||
console.log('msdAjax object:', msdAjax);
|
||||
});
|
||||
|
||||
MSD.saveNewsSources = function() {
|
||||
if (typeof jQuery === 'undefined') {
|
||||
alert('jQuery is required for this functionality');
|
||||
return;
|
||||
}
|
||||
|
||||
var sources = [];
|
||||
jQuery('.msd-news-source-item').each(function() {
|
||||
var $item = jQuery(this);
|
||||
var name = $item.find('.msd-news-name').val().trim();
|
||||
var url = $item.find('.msd-news-url').val().trim();
|
||||
var enabled = $item.find('.msd-news-enabled').is(':checked');
|
||||
|
||||
if (name && url) {
|
||||
sources.push({
|
||||
name: name,
|
||||
url: url,
|
||||
enabled: enabled
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
||||
|
||||
jQuery.post(ajaxurl, {
|
||||
action: 'msd_save_news_sources',
|
||||
sources: sources,
|
||||
nonce: '<?php echo wp_create_nonce('msd_ajax_nonce'); ?>'
|
||||
}, function(response) {
|
||||
if (response.success) {
|
||||
alert('<?php echo esc_js(__('News sources saved successfully!', 'wp-multisite-dashboard')); ?>');
|
||||
MSD.hideNewsSourcesModal();
|
||||
location.reload();
|
||||
} else {
|
||||
alert('<?php echo esc_js(__('Failed to save news sources.', 'wp-multisite-dashboard')); ?>');
|
||||
}
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue