Dateien nach "includes" hochladen
This commit is contained in:
706
includes/class-mc-gallery-core.php
Normal file
706
includes/class-mc-gallery-core.php
Normal file
@@ -0,0 +1,706 @@
|
||||
<?php
|
||||
if (!defined('ABSPATH')) exit;
|
||||
|
||||
class MC_Gallery_Core {
|
||||
|
||||
const OPTION_THUMB_H = 'mc_gallery_thumb_h';
|
||||
const OPTION_RESIZE_PCT = 'mc_gallery_resize_pct';
|
||||
const OPTION_SHOW_DATE = 'mc_gallery_show_date';
|
||||
const OPTION_MAX_UPLOADS = 'mc_gallery_max_uploads';
|
||||
const SESSION_TTL = 3600; // 1 Stunde Session
|
||||
|
||||
public static function init() {
|
||||
add_action('init', [__CLASS__, 'register_post_types']);
|
||||
add_action('rest_api_init', [__CLASS__, 'register_rest_routes']);
|
||||
|
||||
add_action('wp_ajax_mc_gallery_upload', [__CLASS__, 'handle_upload']);
|
||||
add_action('wp_ajax_nopriv_mc_gallery_upload', [__CLASS__, 'handle_upload']);
|
||||
|
||||
add_action('wp_ajax_mc_gallery_increment_view', [__CLASS__, 'handle_increment_view']);
|
||||
add_action('wp_ajax_nopriv_mc_gallery_increment_view', [__CLASS__, 'handle_increment_view']);
|
||||
|
||||
add_action('wp_ajax_mc_gallery_create_album', [__CLASS__, 'handle_create_album']);
|
||||
add_action('wp_ajax_nopriv_mc_gallery_create_album', [__CLASS__, 'handle_create_album']);
|
||||
|
||||
add_action('wp_enqueue_scripts', [__CLASS__, 'enqueue_assets']);
|
||||
|
||||
// Meta Boxen & UI
|
||||
add_action('add_meta_boxes', [__CLASS__, 'add_meta_boxes']);
|
||||
add_action('admin_head', [__CLASS__, 'admin_head_styles']);
|
||||
|
||||
if (is_admin()) {
|
||||
add_action('admin_menu', [__CLASS__, 'admin_menu']);
|
||||
add_action('admin_init', [__CLASS__, 'register_settings']);
|
||||
add_action('save_post', [__CLASS__, 'save_server_meta'], 10, 2);
|
||||
|
||||
// Gutenberg für mc_server deaktivieren
|
||||
add_filter('use_block_editor_for_post_type_mc_server', '__return_false');
|
||||
add_filter('wp_rest_mc_server', '__return_false');
|
||||
}
|
||||
}
|
||||
|
||||
public static function admin_head_styles() {
|
||||
$screen = get_current_screen();
|
||||
if (!$screen || $screen->post_type !== 'mc_server') return;
|
||||
?>
|
||||
<style type="text/css">
|
||||
/* Unnötige Boxen ausblenden */
|
||||
#slugdiv, #postexcerpt, #postcustom, #commentstatusdiv {
|
||||
display: none !important;
|
||||
}
|
||||
/* Readonly Styling */
|
||||
input[readonly] {
|
||||
background-color: #f0f0f0;
|
||||
cursor: not-allowed;
|
||||
border-color: #ccc;
|
||||
}
|
||||
</style>
|
||||
<?php
|
||||
}
|
||||
|
||||
public static function add_meta_boxes() {
|
||||
add_meta_box(
|
||||
'mc_server_config',
|
||||
'Server Konfiguration',
|
||||
[__CLASS__, 'render_server_meta_box'],
|
||||
'mc_server',
|
||||
'normal',
|
||||
'high'
|
||||
);
|
||||
}
|
||||
|
||||
public static function render_server_meta_box($post) {
|
||||
// Werte laden
|
||||
// $host = get_post_meta($post->ID, 'mc_server_host', true); // REMOVED
|
||||
$secret = get_post_meta($post->ID, 'mc_server_secret', true);
|
||||
$active = get_post_meta($post->ID, 'mc_server_active', true);
|
||||
$id = intval($post->ID);
|
||||
|
||||
$has_secret = !empty($secret);
|
||||
|
||||
wp_nonce_field('mc_server_nonce', 'mc_server_nonce');
|
||||
?>
|
||||
<table class="form-table">
|
||||
<tr>
|
||||
<th><label for="mc_server_active">Status</label></th>
|
||||
<td>
|
||||
<label><input type="checkbox" name="mc_server_active" id="mc_server_active" value="1" <?php checked($active); ?> /> Aktiv</label>
|
||||
<p class="description">Aktivieren, damit Spieler diesen Server sehen und Token anfragen können.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- HOST FELD ENTFERNT -->
|
||||
<tr>
|
||||
<th><label>Shared Secret</label></th>
|
||||
<td>
|
||||
<?php if ($has_secret): ?>
|
||||
<input type="text" readonly name="mc_server_secret_readonly" value="<?php echo esc_attr($secret); ?>" style="width: 100%; color: #333;" />
|
||||
<input type="hidden" name="mc_server_secret" value="<?php echo esc_attr($secret); ?>" />
|
||||
<p class="description">✓ Automatisch generiert. Trage diesen Key in deine Java <code>config.yml</code> ein.</p>
|
||||
<?php else: ?>
|
||||
<div style="padding: 10px; background: #eef; border-left: 4px solid #2c6eaf;">
|
||||
<strong>Wird automatisch generiert...</strong>
|
||||
<p style="margin: 5px 0 0 0;">Bitte klicke auf "Veröffentlichen". Nach dem Speichern erscheint hier dein Secret und die Server ID.</p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Server ID (WP)</th>
|
||||
<td>
|
||||
<strong><?php echo $id > 0 ? $id : '(Wird zugewiesen)'; ?></strong>
|
||||
<p class="description">Diese Nummer ist deine <code>server_id</code>. Trage diese Zahl in deine Java Config ein.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
|
||||
public static function save_server_meta($post_id) {
|
||||
// Prüfen ob es sich um 'mc_server' handelt
|
||||
if (get_post_type($post_id) !== 'mc_server') return;
|
||||
|
||||
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
|
||||
|
||||
// Sicherheit
|
||||
if (!isset($_POST['mc_server_nonce']) || !wp_verify_nonce($_POST['mc_server_nonce'], 'mc_server_nonce')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!current_user_can('edit_post', $post_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// HOST SPEICHERUNG ENTFERNT
|
||||
|
||||
// Active Status speichern
|
||||
$active = isset($_POST['mc_server_active']) ? 1 : 0;
|
||||
update_post_meta($post_id, 'mc_server_active', $active);
|
||||
|
||||
// Secret: Auto-Generieren wenn leer
|
||||
$current_secret = get_post_meta($post_id, 'mc_server_secret', true);
|
||||
|
||||
// Hole neues Secret aus Input (wenn das Meta Box angezeigt wurde)
|
||||
$input_secret = isset($_POST['mc_server_secret']) ? sanitize_text_field($_POST['mc_server_secret']) : '';
|
||||
|
||||
$final_secret = '';
|
||||
|
||||
if (empty($current_secret)) {
|
||||
// NEUER SERVER -> Generieren
|
||||
$final_secret = wp_generate_password(32, false);
|
||||
} else {
|
||||
// BESTEHENDER SERVER
|
||||
if (!empty($input_secret)) {
|
||||
$final_secret = $input_secret;
|
||||
} else {
|
||||
$final_secret = $current_secret;
|
||||
}
|
||||
}
|
||||
|
||||
update_post_meta($post_id, 'mc_server_secret', $final_secret);
|
||||
}
|
||||
|
||||
public static function register_post_types() {
|
||||
register_post_type('mc_server', [
|
||||
'labels' => ['name' => 'MC Server', 'singular_name' => 'MC Server'],
|
||||
'public' => false,
|
||||
'show_ui' => true,
|
||||
'supports' => ['title'],
|
||||
'show_in_menu' => false
|
||||
]);
|
||||
|
||||
register_post_type('mc_gallery', [
|
||||
'labels' => ['name' => 'MC Galleries', 'singular_name' => 'MC Gallery'],
|
||||
'public' => false,
|
||||
'show_ui' => true,
|
||||
'supports' => ['title'],
|
||||
'has_archive' => false,
|
||||
'rewrite' => false,
|
||||
'show_in_menu' => false
|
||||
]);
|
||||
|
||||
register_post_type('mc_album', [
|
||||
'labels' => ['name' => 'MC Albums', 'singular_name' => 'MC Album'],
|
||||
'public' => false,
|
||||
'show_ui' => true,
|
||||
'supports' => ['title'],
|
||||
'has_archive' => false,
|
||||
'rewrite' => false,
|
||||
'show_in_menu' => false
|
||||
]);
|
||||
}
|
||||
|
||||
public static function admin_menu() {
|
||||
add_menu_page('MC Gallery PRO', 'MC Gallery PRO', 'manage_options', 'mc-gallery-pro', [__CLASS__, 'settings_page'], 'dashicons-format-gallery', 30);
|
||||
add_submenu_page('mc-gallery-pro', 'Einstellungen', 'Einstellungen', 'manage_options', 'mc-gallery-pro', [__CLASS__, 'settings_page']);
|
||||
add_submenu_page('mc-gallery-pro', 'MC Server', 'MC Server', 'manage_options', 'edit.php?post_type=mc_server');
|
||||
add_submenu_page('mc-gallery-pro', 'MC Galleries', 'MC Galleries', 'manage_options', 'edit.php?post_type=mc_gallery');
|
||||
add_submenu_page('mc-gallery-pro', 'MC Albums', 'MC Albums', 'manage_options', 'edit.php?post_type=mc_album');
|
||||
}
|
||||
|
||||
public static function register_settings() {
|
||||
register_setting('mc_gallery_pro_group', self::OPTION_THUMB_H, ['type' => 'integer', 'sanitize_callback' => 'absint', 'default' => 200]);
|
||||
register_setting('mc_gallery_pro_group', self::OPTION_RESIZE_PCT, ['type' => 'integer', 'sanitize_callback' => 'absint', 'default' => 100]);
|
||||
register_setting('mc_gallery_pro_group', self::OPTION_SHOW_DATE, [
|
||||
'type' => 'boolean',
|
||||
'sanitize_callback' => function($input) { return $input === '1'; },
|
||||
'default' => true
|
||||
]);
|
||||
register_setting('mc_gallery_pro_group', self::OPTION_MAX_UPLOADS, [
|
||||
'type' => 'integer',
|
||||
'sanitize_callback' => 'absint',
|
||||
'default' => 5
|
||||
]);
|
||||
}
|
||||
|
||||
public static function settings_page() {
|
||||
$thumb_h = get_option(self::OPTION_THUMB_H, 200);
|
||||
$resize_pct = get_option(self::OPTION_RESIZE_PCT, 100);
|
||||
$show_date = get_option(self::OPTION_SHOW_DATE, true);
|
||||
$max_uploads = get_option(self::OPTION_MAX_UPLOADS, 5);
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h1>MC Gallery PRO Settings</h1>
|
||||
<form method="post" action="options.php">
|
||||
<?php settings_fields('mc_gallery_pro_group'); ?>
|
||||
<table class="form-table">
|
||||
<tr>
|
||||
<th scope="row">Thumbnail Height (px)</th>
|
||||
<td><input type="number" name="<?php echo esc_attr(self::OPTION_THUMB_H); ?>" value="<?php echo esc_attr($thumb_h); ?>" min="100" max="600" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Image Resize % (Upload)</th>
|
||||
<td>
|
||||
<input type="number" name="<?php echo esc_attr(self::OPTION_RESIZE_PCT); ?>" value="<?php echo esc_attr($resize_pct); ?>" min="10" max="100" />
|
||||
<p class="description">Default is 100% (Original). Values like 50 or 70 save space. Aspect ratio is kept.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Show Date</th>
|
||||
<td>
|
||||
<label>
|
||||
<input type="checkbox" name="<?php echo esc_attr(self::OPTION_SHOW_DATE); ?>" value="1" <?php checked($show_date, true); ?> />
|
||||
Show upload date in gallery and lightbox
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Max. Images per Upload</th>
|
||||
<td>
|
||||
<input type="number" name="<?php echo esc_attr(self::OPTION_MAX_UPLOADS); ?>" value="<?php echo esc_attr($max_uploads); ?>" min="1" max="50" />
|
||||
<p class="description">How many images can a user upload at once? (Default: 5)</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php submit_button(); ?>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
public static function get_image_url($attach_id, $fallback_size = 'medium') {
|
||||
$resize_pct = intval(get_option(self::OPTION_RESIZE_PCT, 100));
|
||||
if ($resize_pct < 100) {
|
||||
$src = wp_get_attachment_image_src($attach_id, 'mc-optimized');
|
||||
if ($src && isset($src[0])) return $src[0];
|
||||
}
|
||||
$src = wp_get_attachment_image_src($attach_id, $fallback_size);
|
||||
return ($src && isset($src[0])) ? $src[0] : '';
|
||||
}
|
||||
|
||||
public static function enqueue_assets() {
|
||||
wp_register_style('mc-gallery-pro-css', MCGALLERY_PRO_URL . 'assets/css/gallery-pro.css', [], MCGALLERY_PRO_VERSION);
|
||||
wp_register_script('mc-gallery-pro-js', MCGALLERY_PRO_URL . 'assets/js/gallery-pro.js', ['jquery'], MCGALLERY_PRO_VERSION, true);
|
||||
wp_enqueue_style('mc-gallery-pro-css');
|
||||
wp_enqueue_script('mc-gallery-pro-js');
|
||||
wp_localize_script('mc-gallery-pro-js', 'mcGalleryPro', [
|
||||
'restBase' => esc_url_raw(rest_url('mc-gallery/v1')),
|
||||
'uploadUrl' => esc_url_raw(admin_url('admin-ajax.php')),
|
||||
'nonce' => wp_create_nonce('mc_gallery_upload_action'),
|
||||
'maxUploads' => intval(get_option(self::OPTION_MAX_UPLOADS, 5))
|
||||
]);
|
||||
}
|
||||
|
||||
public static function register_rest_routes() {
|
||||
register_rest_route('mc-gallery/v1','/servers',[
|
||||
'methods'=>'GET',
|
||||
'callback'=>[__CLASS__,'rest_servers'],
|
||||
'permission_callback'=>'__return_true'
|
||||
]);
|
||||
register_rest_route('mc-gallery/v1','/request-token',[
|
||||
'methods'=>'POST',
|
||||
'callback'=>[__CLASS__,'rest_request_token'],
|
||||
'permission_callback'=>'__return_true'
|
||||
]);
|
||||
register_rest_route('mc-gallery/v1','/check-token',[
|
||||
'methods'=>'POST',
|
||||
'callback'=>[__CLASS__,'rest_check_token'],
|
||||
'permission_callback'=>'__return_true'
|
||||
]);
|
||||
register_rest_route('mc-gallery/v1','/verify',[
|
||||
'methods'=>'POST',
|
||||
'callback'=>[__CLASS__,'rest_verify_token'],
|
||||
'permission_callback'=>'__return_true'
|
||||
]);
|
||||
register_rest_route('mc-gallery/v1','/albums',[
|
||||
'methods'=>'POST',
|
||||
'callback'=>[__CLASS__,'rest_get_albums'],
|
||||
'permission_callback'=>'__return_true'
|
||||
]);
|
||||
}
|
||||
|
||||
public static function rest_servers($req) {
|
||||
$servers = get_posts([
|
||||
'post_type'=>'mc_server',
|
||||
'meta_key'=>'mc_server_active',
|
||||
'meta_value'=>1,
|
||||
'numberposts'=>-1
|
||||
]);
|
||||
$out = [];
|
||||
foreach ($servers as $s) {
|
||||
$out[] = [
|
||||
'id' => intval($s->ID),
|
||||
'title' => $s->post_title
|
||||
// 'host' key entfernt
|
||||
];
|
||||
}
|
||||
return MC_Gallery_Helpers::rest_response_success($out);
|
||||
}
|
||||
|
||||
public static function rest_request_token($req) {
|
||||
$params = $req->get_json_params();
|
||||
$username = sanitize_text_field($params['username'] ?? '');
|
||||
$server_id = intval($params['server_id'] ?? 0);
|
||||
if (!$username || !$server_id) return new WP_REST_Response(['success'=>false,'message'=>'Missing data'],400);
|
||||
if (!get_post($server_id)) return new WP_REST_Response(['success'=>false,'message'=>'Invalid server'],400);
|
||||
|
||||
$tokens = MC_Gallery_Helpers::get_tokens();
|
||||
$token = MC_Gallery_Helpers::generate_token(40);
|
||||
|
||||
$tokens[$token] = [
|
||||
'server_id' => $server_id,
|
||||
'username' => $username,
|
||||
'created' => time(),
|
||||
'expires' => time() + self::SESSION_TTL,
|
||||
'claimed' => false,
|
||||
'claimed_by' => null,
|
||||
'used' => false,
|
||||
'session' => true
|
||||
];
|
||||
MC_Gallery_Helpers::save_tokens($tokens);
|
||||
MC_Gallery_Helpers::error_log("Session token created for {$username}");
|
||||
return MC_Gallery_Helpers::rest_response_success([
|
||||
'token'=>$token,
|
||||
'expires'=>date('c',$tokens[$token]['expires']),
|
||||
'session_duration' => self::SESSION_TTL
|
||||
]);
|
||||
}
|
||||
|
||||
public static function rest_check_token($req) {
|
||||
$params = $req->get_json_params();
|
||||
$token = sanitize_text_field($params['token'] ?? '');
|
||||
if (!$token) return new WP_REST_Response(['success'=>false,'message'=>'Token missing'],400);
|
||||
$tokens = MC_Gallery_Helpers::get_tokens();
|
||||
if (!isset($tokens[$token])) return new WP_REST_Response(['success'=>false,'message'=>'Token not found'],404);
|
||||
if ($tokens[$token]['expires'] < time()) return new WP_REST_Response(['success'=>false,'message'=>'Session expired'],410);
|
||||
return MC_Gallery_Helpers::rest_response_success([
|
||||
'claimed' => $tokens[$token]['claimed'],
|
||||
'claimed_by' => $tokens[$token]['claimed_by'],
|
||||
'session' => $tokens[$token]['session'] ?? false
|
||||
]);
|
||||
}
|
||||
|
||||
public static function rest_verify_token($req) {
|
||||
$params = $req->get_json_params();
|
||||
$player = sanitize_text_field($params['player'] ?? '');
|
||||
$token = sanitize_text_field($params['token'] ?? '');
|
||||
$server_id = intval($params['server_id'] ?? 0);
|
||||
$signature = sanitize_text_field($params['signature'] ?? '');
|
||||
|
||||
MC_Gallery_Helpers::error_log("VERIFY REQUEST: Player={$player}, ServerID={$server_id}");
|
||||
|
||||
if (!$player || !$token || !$server_id || !$signature) {
|
||||
MC_Gallery_Helpers::error_log("VERIFY FAIL: Incomplete data");
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Data incomplete'],400);
|
||||
}
|
||||
|
||||
$secret = get_post_meta($server_id,'mc_server_secret',true);
|
||||
|
||||
if (is_string($secret)) {
|
||||
$secret = trim($secret);
|
||||
}
|
||||
|
||||
if (empty($secret)) {
|
||||
MC_Gallery_Helpers::error_log("VERIFY FAIL: Shared Secret is empty for Server ID {$server_id}");
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Server configuration error (No Secret)'],500);
|
||||
}
|
||||
MC_Gallery_Helpers::error_log("VERIFY: Secret loaded (first 10 chars): " . substr($secret, 0, 10));
|
||||
|
||||
// Name Check
|
||||
$tokens = MC_Gallery_Helpers::get_tokens();
|
||||
if (!isset($tokens[$token])) {
|
||||
MC_Gallery_Helpers::error_log("VERIFY FAIL: Token not found");
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Token not found'],404);
|
||||
}
|
||||
if ($tokens[$token]['expires'] < time()) {
|
||||
MC_Gallery_Helpers::error_log("VERIFY FAIL: Session expired");
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Session expired'],410);
|
||||
}
|
||||
|
||||
if ($player !== $tokens[$token]['username']) {
|
||||
MC_Gallery_Helpers::error_log("VERIFY FAIL: Name mismatch ({$player} vs {$tokens[$token]['username']})");
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Name does not match. Please verify with same name used in form.'], 403);
|
||||
}
|
||||
|
||||
// Signature Check (An Java Plugin angepasst)
|
||||
$data_to_hash = $player . $token;
|
||||
$expected = hash_hmac('sha256', $data_to_hash, $secret);
|
||||
|
||||
MC_Gallery_Helpers::error_log("VERIFY: Data to hash: " . $data_to_hash);
|
||||
MC_Gallery_Helpers::error_log("VERIFY: Expected Hash (first 10): " . substr($expected, 0, 10));
|
||||
MC_Gallery_Helpers::error_log("VERIFY: Received Signature: " . substr($signature, 0, 10));
|
||||
|
||||
if (!hash_equals($expected, $signature)) {
|
||||
MC_Gallery_Helpers::error_log("VERIFY FAIL: Hash mismatch");
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Invalid signature'],401);
|
||||
}
|
||||
|
||||
// Success
|
||||
$tokens[$token]['claimed'] = true;
|
||||
$tokens[$token]['claimed_by'] = $player;
|
||||
$tokens[$token]['claimed_at'] = time();
|
||||
MC_Gallery_Helpers::save_tokens($tokens);
|
||||
MC_Gallery_Helpers::error_log("VERIFY SUCCESS: Player {$player} verified.");
|
||||
|
||||
return MC_Gallery_Helpers::rest_response_success(['message'=>'Verified', 'session'=>true]);
|
||||
}
|
||||
|
||||
public static function rest_get_albums($req) {
|
||||
$params = $req->get_json_params();
|
||||
$token = sanitize_text_field($params['token'] ?? '');
|
||||
$username = sanitize_text_field($params['username'] ?? '');
|
||||
$server_id = intval($params['server_id'] ?? 0);
|
||||
|
||||
if (!$token || !$username || !$server_id) {
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Missing data'],400);
|
||||
}
|
||||
|
||||
$tokens = MC_Gallery_Helpers::get_tokens();
|
||||
if (!isset($tokens[$token]) || !$tokens[$token]['claimed'] || $tokens[$token]['claimed_by'] !== $username) {
|
||||
return new WP_REST_Response(['success'=>false,'message'=>'Invalid session'],401);
|
||||
}
|
||||
|
||||
$gallery = MC_Gallery_Helpers::find_or_create_gallery_post($username, $server_id);
|
||||
if (!$gallery) {
|
||||
return MC_Gallery_Helpers::rest_response_success(['albums' => []]);
|
||||
}
|
||||
|
||||
$albums = get_posts([
|
||||
'post_type' => 'mc_album',
|
||||
'posts_per_page' => -1,
|
||||
'meta_key' => 'mc_gallery_id',
|
||||
'meta_value' => $gallery->ID,
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
$out = [];
|
||||
foreach ($albums as $album) {
|
||||
$out[] = [
|
||||
'id' => $album->ID,
|
||||
'title' => $album->post_title
|
||||
];
|
||||
}
|
||||
|
||||
return MC_Gallery_Helpers::rest_response_success(['albums' => $out]);
|
||||
}
|
||||
|
||||
// NEU: View Counter Handler
|
||||
public static function handle_increment_view() {
|
||||
if (!isset($_POST['attach_id']) || !is_numeric($_POST['attach_id'])) {
|
||||
wp_send_json_error(['message' => 'Invalid Attachment ID']);
|
||||
}
|
||||
|
||||
$attach_id = intval($_POST['attach_id']);
|
||||
|
||||
if (!wp_attachment_is_image($attach_id)) {
|
||||
wp_send_json_error(['message' => 'Not an image']);
|
||||
}
|
||||
|
||||
$count = get_post_meta($attach_id, 'mc_views', true);
|
||||
if ($count === false || $count === '') $count = 0;
|
||||
|
||||
$count++;
|
||||
update_post_meta($attach_id, 'mc_views', $count);
|
||||
|
||||
wp_send_json_success(['views' => $count]);
|
||||
}
|
||||
|
||||
public static function handle_create_album() {
|
||||
if (!isset($_POST['mc_upload_nonce']) || !wp_verify_nonce($_POST['mc_upload_nonce'], 'mc_gallery_upload_action')) {
|
||||
wp_send_json_error(['message' => 'Security check failed.']);
|
||||
}
|
||||
|
||||
$token = sanitize_text_field($_POST['mc_token'] ?? '');
|
||||
$username = sanitize_text_field($_POST['mc_username'] ?? '');
|
||||
$server_id = intval($_POST['mc_server_id'] ?? 0);
|
||||
$album_name = sanitize_text_field($_POST['album_name'] ?? '');
|
||||
|
||||
if (!$token || !$username || !$server_id || !$album_name) {
|
||||
wp_send_json_error(['message' => 'Missing data']);
|
||||
}
|
||||
|
||||
$tokens = MC_Gallery_Helpers::get_tokens();
|
||||
if (!isset($tokens[$token]) || !$tokens[$token]['claimed'] || $tokens[$token]['claimed_by'] !== $username) {
|
||||
wp_send_json_error(['message' => 'Invalid session']);
|
||||
}
|
||||
|
||||
if ($tokens[$token]['expires'] < time()) {
|
||||
wp_send_json_error(['message' => 'Session expired']);
|
||||
}
|
||||
|
||||
$gallery = MC_Gallery_Helpers::find_or_create_gallery_post($username, $server_id);
|
||||
if (!$gallery) {
|
||||
wp_send_json_error(['message' => 'Gallery not found']);
|
||||
}
|
||||
|
||||
$album_id = wp_insert_post([
|
||||
'post_type' => 'mc_album',
|
||||
'post_title' => $album_name,
|
||||
'post_status' => 'publish',
|
||||
'meta_input' => [
|
||||
'mc_gallery_id' => $gallery->ID,
|
||||
'mc_image_count' => 0
|
||||
]
|
||||
]);
|
||||
|
||||
if (is_wp_error($album_id)) {
|
||||
wp_send_json_error(['message' => 'Could not create album']);
|
||||
}
|
||||
|
||||
wp_send_json_success([
|
||||
'message' => 'Album successfully created',
|
||||
'album' => [
|
||||
'id' => $album_id,
|
||||
'title' => $album_name
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public static function handle_upload() {
|
||||
if (!isset($_POST['mc_upload_nonce']) || !wp_verify_nonce($_POST['mc_upload_nonce'], 'mc_gallery_upload_action')) {
|
||||
wp_send_json_error(['message' => 'Security check failed.']);
|
||||
}
|
||||
|
||||
$token = sanitize_text_field($_POST['mc_token'] ?? '');
|
||||
$username = sanitize_text_field($_POST['mc_username'] ?? '');
|
||||
$server_id = intval($_POST['mc_server_id'] ?? 0);
|
||||
$album_id = intval($_POST['mc_album_id'] ?? 0);
|
||||
|
||||
if (!$token || !$username || !$server_id) {
|
||||
wp_send_json_error(['message' => 'Token or data missing.']);
|
||||
}
|
||||
|
||||
$tokens = MC_Gallery_Helpers::get_tokens();
|
||||
if (!isset($tokens[$token])) {
|
||||
wp_send_json_error(['message' => 'Invalid token.']);
|
||||
}
|
||||
|
||||
$t = $tokens[$token];
|
||||
if ($t['expires'] < time()) {
|
||||
wp_send_json_error(['message' => 'Session expired.']);
|
||||
}
|
||||
|
||||
if (!$t['claimed'] || $t['claimed_by'] !== $username) {
|
||||
wp_send_json_error(['message' => 'Verification failed. Please go back to step 2 and use /verify']);
|
||||
}
|
||||
|
||||
if (empty($_FILES['mc_images']) || !is_array($_FILES['mc_images']['name'])) {
|
||||
wp_send_json_error(['message' => 'No files uploaded.']);
|
||||
}
|
||||
|
||||
require_once(ABSPATH . 'wp-admin/includes/file.php');
|
||||
require_once(ABSPATH . 'wp-admin/includes/image.php');
|
||||
require_once(ABSPATH . 'wp-admin/includes/media.php');
|
||||
|
||||
$current_user_id = get_current_user_id();
|
||||
$temp_user_id = 0;
|
||||
if ($current_user_id === 0) {
|
||||
$admins = get_users(['role' => 'administrator', 'number' => 1]);
|
||||
if ($admins) {
|
||||
$temp_user_id = $admins[0]->ID;
|
||||
wp_set_current_user($temp_user_id);
|
||||
}
|
||||
}
|
||||
|
||||
$uploaded = [];
|
||||
$errors = [];
|
||||
|
||||
try {
|
||||
$gallery_post = MC_Gallery_Helpers::find_or_create_gallery_post($username, $server_id);
|
||||
if (!$gallery_post) throw new Exception('Gallery not found.');
|
||||
|
||||
if (empty($_FILES['mc_images']) || !is_array($_FILES['mc_images']['name'])) {
|
||||
wp_send_json_error(['message' => 'No files uploaded or invalid format.']);
|
||||
}
|
||||
|
||||
$files = $_FILES['mc_images'];
|
||||
|
||||
foreach (array_keys($files['name']) as $i) {
|
||||
if ($files['error'][$i] !== UPLOAD_ERR_OK) {
|
||||
$errors[] = $files['name'][$i] . ': Upload error';
|
||||
continue;
|
||||
}
|
||||
|
||||
$file = [
|
||||
'name' => $files['name'][$i],
|
||||
'type' => $files['type'][$i],
|
||||
'tmp_name' => $files['tmp_name'][$i],
|
||||
'error' => $files['error'][$i],
|
||||
'size' => $files['size'][$i]
|
||||
];
|
||||
|
||||
$allowed = ['image/jpeg','image/png','image/gif','image/webp'];
|
||||
if (!in_array($file['type'], $allowed)) {
|
||||
$errors[] = $file['name'] . ': Only images allowed';
|
||||
continue;
|
||||
}
|
||||
|
||||
$overrides = ['test_form' => false];
|
||||
$movefile = wp_handle_upload($file, $overrides);
|
||||
|
||||
if (isset($movefile['error'])) {
|
||||
$errors[] = $file['name'] . ': ' . $movefile['error'];
|
||||
continue;
|
||||
}
|
||||
|
||||
$wp_filetype = wp_check_filetype(basename($movefile['file']), null);
|
||||
$attachment = [
|
||||
'guid' => $movefile['url'],
|
||||
'post_mime_type' => $wp_filetype['type'],
|
||||
'post_title' => sanitize_text_field($file['name']),
|
||||
'post_content' => '',
|
||||
'post_status' => 'inherit'
|
||||
];
|
||||
|
||||
$attach_id = wp_insert_attachment($attachment, $movefile['file']);
|
||||
if (is_wp_error($attach_id)) {
|
||||
$errors[] = $file['name'] . ': ' . $attach_id->get_error_message();
|
||||
continue;
|
||||
}
|
||||
|
||||
// View Counter initialisieren
|
||||
add_post_meta($attach_id, 'mc_views', 0);
|
||||
|
||||
$attach_data = wp_generate_attachment_metadata($attach_id, $movefile['file']);
|
||||
|
||||
// Bildgröße anpassen
|
||||
$resize_pct = intval(get_option(self::OPTION_RESIZE_PCT, 100));
|
||||
if ($resize_pct < 100 && $resize_pct > 0) {
|
||||
$original_file = $movefile['file'];
|
||||
$editor = wp_get_image_editor($original_file);
|
||||
if (!is_wp_error($editor)) {
|
||||
$size = $editor->get_size();
|
||||
$new_w = $size['width'] * ($resize_pct / 100);
|
||||
$new_h = $size['height'] * ($resize_pct / 100);
|
||||
$resized_path = image_make_intermediate_size($original_file, $new_w, $new_h, false);
|
||||
if (!empty($resized_path)) {
|
||||
$attach_data['sizes']['mc-optimized'] = $resized_path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wp_update_attachment_metadata($attach_id, $attach_data);
|
||||
wp_update_post(['ID' => $attach_id, 'post_parent' => $gallery_post->ID]);
|
||||
|
||||
// Album zuweisen
|
||||
if ($album_id) {
|
||||
update_post_meta($attach_id, 'mc_album_id', $album_id);
|
||||
$count = get_post_meta($album_id, 'mc_image_count', true) ?: 0;
|
||||
update_post_meta($album_id, 'mc_image_count', $count + 1);
|
||||
}
|
||||
|
||||
$uploaded[] = $file['name'];
|
||||
}
|
||||
|
||||
$response = [
|
||||
'message' => count($uploaded) . ' image(s) successfully uploaded!',
|
||||
'uploaded' => $uploaded
|
||||
];
|
||||
|
||||
if (!empty($errors)) {
|
||||
$response['errors'] = $errors;
|
||||
}
|
||||
|
||||
wp_send_json_success($response);
|
||||
|
||||
} catch (Exception $e) {
|
||||
wp_send_json_error(['message' => 'Error: ' . $e->getMessage()]);
|
||||
} finally {
|
||||
if ($temp_user_id) wp_set_current_user(0);
|
||||
}
|
||||
}
|
||||
|
||||
public static function get_default_thumb_h() {
|
||||
return intval(get_option(self::OPTION_THUMB_H, 200));
|
||||
}
|
||||
}
|
||||
51
includes/class-mc-gallery-helpers.php
Normal file
51
includes/class-mc-gallery-helpers.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
if (!defined('ABSPATH')) exit;
|
||||
|
||||
class MC_Gallery_Helpers {
|
||||
|
||||
public static function get_tokens() {
|
||||
$arr = get_option(MCGALLERY_OPTION_KEY, []);
|
||||
return is_array($arr) ? $arr : [];
|
||||
}
|
||||
|
||||
public static function save_tokens($arr) {
|
||||
update_option(MCGALLERY_OPTION_KEY, $arr);
|
||||
}
|
||||
|
||||
public static function generate_token($length = 40) {
|
||||
if ($length % 2 !== 0) $length++;
|
||||
return bin2hex(random_bytes($length/2));
|
||||
}
|
||||
|
||||
public static function find_or_create_gallery_post($player, $server_id) {
|
||||
$args = [
|
||||
'post_type' => 'mc_gallery',
|
||||
'posts_per_page' => 1,
|
||||
'meta_query' => [
|
||||
['key' => 'mc_player', 'value' => $player],
|
||||
['key' => 'mc_server', 'value' => $server_id]
|
||||
]
|
||||
];
|
||||
$q = get_posts($args);
|
||||
if (!empty($q)) return $q[0];
|
||||
|
||||
$id = wp_insert_post([
|
||||
'post_type' => 'mc_gallery',
|
||||
'post_title' => "Galerie $player (Server $server_id)",
|
||||
'post_status' => 'publish',
|
||||
'meta_input' => [
|
||||
'mc_player' => $player,
|
||||
'mc_server' => $server_id
|
||||
]
|
||||
]);
|
||||
return get_post($id);
|
||||
}
|
||||
|
||||
public static function error_log($msg) {
|
||||
if (defined('WP_DEBUG') && WP_DEBUG) error_log("[mc-gallery-pro] " . $msg);
|
||||
}
|
||||
|
||||
public static function rest_response_success($data = []) {
|
||||
return new WP_REST_Response(['success' => true, 'data' => $data], 200);
|
||||
}
|
||||
}
|
||||
892
includes/class-mc-gallery-shortcodes.php
Normal file
892
includes/class-mc-gallery-shortcodes.php
Normal file
@@ -0,0 +1,892 @@
|
||||
<?php
|
||||
if (!defined('ABSPATH')) exit;
|
||||
|
||||
class MC_Gallery_Shortcodes {
|
||||
|
||||
public static function init() {
|
||||
add_shortcode('mc_gallery_overview', [__CLASS__, 'shortcode_overview']);
|
||||
add_shortcode('mc_gallery_player', [__CLASS__, 'shortcode_player']);
|
||||
add_shortcode('mc_gallery_upload', [__CLASS__, 'shortcode_upload']);
|
||||
add_shortcode('mc_gallery_all_albums', [__CLASS__, 'shortcode_all_albums_overview']);
|
||||
|
||||
add_shortcode('mc_gallery', [__CLASS__, 'shortcode_overview']);
|
||||
}
|
||||
|
||||
public static function shortcode_overview($atts) {
|
||||
$atts = shortcode_atts([
|
||||
'server_id' => 0,
|
||||
'server_ids' => '',
|
||||
'thumb_h' => 0
|
||||
], $atts);
|
||||
|
||||
$thumb_h = intval($atts['thumb_h']) ?: MC_Gallery_Core::get_default_thumb_h();
|
||||
$show_date = get_option(MC_Gallery_Core::OPTION_SHOW_DATE, true);
|
||||
|
||||
$server_ids_to_search = [];
|
||||
|
||||
// Server IDs sammeln
|
||||
if (!empty($atts['server_ids'])) {
|
||||
$raw_ids = explode(',', $atts['server_ids']);
|
||||
foreach ($raw_ids as $id) {
|
||||
$int_id = intval(trim($id));
|
||||
if ($int_id > 0) $server_ids_to_search[] = $int_id;
|
||||
}
|
||||
} else if (!empty($atts['server_id'])) {
|
||||
$server_ids_to_search[] = intval($atts['server_id']);
|
||||
} else {
|
||||
// Alle aktiven Server laden
|
||||
$all_server_posts = get_posts([
|
||||
'post_type' => 'mc_server',
|
||||
'meta_key' => 'mc_server_active',
|
||||
'meta_value' => 1,
|
||||
'numberposts' => -1
|
||||
]);
|
||||
foreach ($all_server_posts as $s) {
|
||||
$server_ids_to_search[] = $s->ID;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($server_ids_to_search)) {
|
||||
return '<div class="mc-gallery-container"><div class="mc-empty-state">🚫 Keine aktiven Server gefunden.</div></div>';
|
||||
}
|
||||
|
||||
// Parameter auslesen
|
||||
$q_player = isset($_GET['player']) ? sanitize_text_field($_GET['player']) : '';
|
||||
$q_server = isset($_GET['server']) ? intval($_GET['server']) : 0;
|
||||
$q_album = isset($_GET['album']) ? intval($_GET['album']) : 0;
|
||||
|
||||
$current_url = remove_query_arg(['player', 'server', 'album']);
|
||||
|
||||
// ==============================
|
||||
// 1. FALL: Album-Ansicht (wenn ?album=ID)
|
||||
// ==============================
|
||||
if ($q_album) {
|
||||
return self::shortcode_album_view(['album_id' => $q_album]);
|
||||
}
|
||||
|
||||
// ==============================
|
||||
// 2. FALL: Spieler-Spezifische Ansicht
|
||||
// ==============================
|
||||
if ($q_player) {
|
||||
|
||||
// Header erstellen
|
||||
$out = '<div class="mc-gallery-container">';
|
||||
$out .= '<div class="mc-player-header">';
|
||||
$out .= '<div class="mc-player-title">';
|
||||
$out .= '<div class="mc-player-avatar">👤</div>';
|
||||
$out .= '<h2>Gallery of <span class="mc-highlight">'.esc_html($q_player).'</span></h2>';
|
||||
$out .= '</div>';
|
||||
$out .= '<a href="'.esc_url($current_url).'" class="mc-btn mc-btn-ghost mc-btn-small">';
|
||||
$out .= '<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/></svg>';
|
||||
$out .= ' Zurück zur Übersicht';
|
||||
$out .= '</a>';
|
||||
$out .= '</div>';
|
||||
|
||||
// Alle Galerien für diesen Spieler laden
|
||||
$all_galleries = get_posts([
|
||||
'post_type' => 'mc_gallery',
|
||||
'posts_per_page' => -1,
|
||||
'meta_query' => [
|
||||
[
|
||||
'key' => 'mc_server',
|
||||
'value' => $server_ids_to_search,
|
||||
'compare' => 'IN'
|
||||
]
|
||||
]
|
||||
]);
|
||||
|
||||
// Filter nach Spielername
|
||||
$player_galleries = [];
|
||||
$player_gallery_ids = [];
|
||||
foreach ($all_galleries as $gal) {
|
||||
$p = get_post_meta($gal->ID, 'mc_player', true);
|
||||
if ($p === $q_player) {
|
||||
$player_galleries[] = $gal;
|
||||
$player_gallery_ids[] = $gal->ID;
|
||||
}
|
||||
}
|
||||
|
||||
// ALBEN dieses Spielers laden
|
||||
$albums = [];
|
||||
if (!empty($player_gallery_ids)) {
|
||||
$albums = get_posts([
|
||||
'post_type' => 'mc_album',
|
||||
'posts_per_page' => -1,
|
||||
'meta_key' => 'mc_gallery_id',
|
||||
'value' => $player_gallery_ids,
|
||||
'compare' => 'IN',
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
}
|
||||
|
||||
// --- HTML Alben ---
|
||||
if (!empty($albums)) {
|
||||
$out .= '<div class="mc-albums-section">';
|
||||
$out .= '<h3 class="mc-section-title">📁 Alben ('.count($albums).')</h3>';
|
||||
$out .= '<div class="mc-albums-grid">';
|
||||
|
||||
foreach ($albums as $album) {
|
||||
$album_images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'posts_per_page' => 1,
|
||||
'post_mime_type' => 'image',
|
||||
'post_parent' => get_post_meta($album->ID, 'mc_gallery_id', true),
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
$cover_url = '';
|
||||
if (!empty($album_images)) {
|
||||
$cover_array = wp_get_attachment_image_src($album_images[0]->ID, 'medium');
|
||||
$cover_url = $cover_array ? $cover_array[0] : '';
|
||||
}
|
||||
|
||||
$album_count = get_post_meta($album->ID, 'mc_image_count', true) ?: 0;
|
||||
$album_link = add_query_arg(['album' => $album->ID], $current_url);
|
||||
|
||||
$out .= '<a href="'.esc_url($album_link).'" class="mc-album-card">';
|
||||
if ($cover_url) {
|
||||
$out .= '<div class="mc-album-cover" style="background-image: url('.esc_url($cover_url).')"></div>';
|
||||
} else {
|
||||
$out .= '<div class="mc-album-cover mc-album-empty">📁</div>';
|
||||
}
|
||||
$out .= '<div class="mc-album-info">';
|
||||
$out .= '<h4>'.esc_html($album->post_title).'</h4>';
|
||||
$out .= '<span class="mc-album-count">'.$album_count.' Images</span>';
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
}
|
||||
|
||||
// Alle Bilder des Spielers laden
|
||||
$all_images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'post_parent' => $player_gallery_ids,
|
||||
'posts_per_page' => -1,
|
||||
'post_mime_type' => 'image',
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
// BILDER FILTER: Nur Bilder, die in einem Album sind
|
||||
$images_linked_to_albums = [];
|
||||
foreach ($all_images as $img) {
|
||||
$album_id = get_post_meta($img->ID, 'mc_album_id', true);
|
||||
// Prüfen ob Album ID existiert und nicht 0 ist
|
||||
if (!empty($album_id) && $album_id > 0) {
|
||||
$images_linked_to_albums[] = $img;
|
||||
}
|
||||
}
|
||||
|
||||
// --- HTML Bilder (NUR VERKNÜPFTE) ---
|
||||
if (!empty($images_linked_to_albums)) {
|
||||
$out .= '<div class="mc-images-section">';
|
||||
$out .= '<h3 class="mc-section-title">🖼️ Alle Bilder ('.count($images_linked_to_albums).')</h3>';
|
||||
$out .= '<div class="mc-gallery-grid">';
|
||||
|
||||
foreach ($images_linked_to_albums as $img) {
|
||||
$full = wp_get_attachment_url($img->ID);
|
||||
$upload_date = date_i18n('d.m.Y', strtotime($img->post_date));
|
||||
|
||||
$album_id = get_post_meta($img->ID, 'mc_album_id', true);
|
||||
$album_name = '';
|
||||
if ($album_id) {
|
||||
$album_post = get_post($album_id);
|
||||
if ($album_post) {
|
||||
$album_name = $album_post->post_title;
|
||||
}
|
||||
}
|
||||
|
||||
$metadata = wp_get_attachment_metadata($img->ID);
|
||||
$width = isset($metadata['width']) ? $metadata['width'] : 0;
|
||||
$height = isset($metadata['height']) ? $metadata['height'] : 0;
|
||||
$aspect_ratio = ($width && $height) ? ($width / $height) : 1;
|
||||
|
||||
$resize_pct = intval(get_option(MC_Gallery_Core::OPTION_RESIZE_PCT, 100));
|
||||
if ($resize_pct < 100 && isset($metadata['sizes']['mc-optimized'])) {
|
||||
$upload_dir = wp_upload_dir();
|
||||
$file_path = dirname($metadata['file']) . '/' . $metadata['sizes']['mc-optimized']['file'];
|
||||
$thumb = $upload_dir['baseurl'] . '/' . $file_path;
|
||||
} else {
|
||||
$thumb_array = wp_get_attachment_image_src($img->ID, 'medium');
|
||||
$thumb = $thumb_array ? $thumb_array[0] : $full;
|
||||
}
|
||||
|
||||
$data_date_attr = $show_date ? 'data-date="'.esc_attr($upload_date).'"' : '';
|
||||
$views = get_post_meta($img->ID, 'mc_views', true) ?: 0;
|
||||
|
||||
$out .= '<a href="'.esc_url($full).'" class="mc-gallery-item" '.$data_date_attr.' data-attach-id="'.$img->ID.'">';
|
||||
$out .= '<div class="mc-gallery-item-inner">';
|
||||
$out .= '<div class="mc-views-badge">👁️ <span class="mc-views-count">'.$views.'</span></div>';
|
||||
if ($show_date) {
|
||||
$out .= '<div class="mc-date-badge">'.$upload_date.'</div>';
|
||||
}
|
||||
$out .= '<img src="'.esc_url($thumb).'" alt="'.esc_attr($q_player).'" loading="lazy" style="aspect-ratio: '.$aspect_ratio.';">';
|
||||
$out .= '<div class="mc-gallery-overlay">';
|
||||
$out .= '<div class="mc-gallery-info">';
|
||||
$out .= '<div class="mc-watermark">'.esc_html($q_player).'</div>';
|
||||
if ($album_name) {
|
||||
$out .= '<div class="mc-album-badge">📁 '.esc_html($album_name).'</div>';
|
||||
}
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
return $out;
|
||||
}
|
||||
|
||||
// ==============================
|
||||
// 3. FALL: Haupt-Übersicht (Kein Spieler gewählt)
|
||||
// ==============================
|
||||
|
||||
// Alle mc_gallery Posts laden
|
||||
$galleries = get_posts([
|
||||
'post_type' => 'mc_gallery',
|
||||
'posts_per_page' => -1,
|
||||
'meta_query' => [
|
||||
[
|
||||
'key' => 'mc_server',
|
||||
'value' => $server_ids_to_search,
|
||||
'compare' => 'IN'
|
||||
]
|
||||
],
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
if (empty($galleries)) {
|
||||
return '<div class="mc-gallery-container"><div class="mc-empty-state">🎮 No galleries on selected servers yet.</div></div>';
|
||||
}
|
||||
|
||||
$all_images = [];
|
||||
$players_list = [];
|
||||
$player_counts = [];
|
||||
|
||||
foreach ($galleries as $gallery) {
|
||||
$player = get_post_meta($gallery->ID, 'mc_player', true);
|
||||
|
||||
if (!in_array($player, $players_list)) {
|
||||
$players_list[] = $player;
|
||||
$player_counts[$player] = 0;
|
||||
}
|
||||
|
||||
$images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'post_parent' => $gallery->ID,
|
||||
'posts_per_page' => -1,
|
||||
'post_mime_type' => 'image',
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
foreach ($images as $img) {
|
||||
$img->mc_player_name = $player;
|
||||
$img->mc_upload_date = $img->post_date;
|
||||
$img->mc_gallery_id = $gallery->ID;
|
||||
$all_images[] = $img;
|
||||
$player_counts[$player]++;
|
||||
}
|
||||
}
|
||||
|
||||
usort($all_images, function($a, $b) {
|
||||
return strtotime($b->mc_upload_date) - strtotime($a->mc_upload_date);
|
||||
});
|
||||
|
||||
$out = '<div class="mc-gallery-container">';
|
||||
|
||||
// Filter Bar
|
||||
if (!empty($players_list)) {
|
||||
$active_all = empty($q_player) ? 'mc-tag-active' : '';
|
||||
|
||||
$out .= '<div class="mc-filter-bar">';
|
||||
$out .= '<div class="mc-filter-header">';
|
||||
$out .= '<svg class="mc-filter-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z"/></svg>';
|
||||
$out .= '<h3 class="mc-filter-title">Filter nach Spieler</h3>';
|
||||
$out .= '</div>';
|
||||
$out .= '<div class="mc-filter-tags">';
|
||||
|
||||
$total = count($all_images);
|
||||
$out .= '<a href="'.esc_url($current_url).'" class="mc-tag '.$active_all.'">';
|
||||
$out .= '🌐 Alle Spieler';
|
||||
$out .= '<span class="mc-tag-count">'.$total.'</span>';
|
||||
$out .= '</a>';
|
||||
|
||||
foreach ($players_list as $p) {
|
||||
$link = esc_url(add_query_arg([
|
||||
'player' => rawurlencode($p)
|
||||
], $current_url));
|
||||
$is_active = ($p === $q_player) ? 'mc-tag-active' : '';
|
||||
$count = isset($player_counts[$p]) ? $player_counts[$p] : 0;
|
||||
|
||||
$out .= '<a href="'.$link.'" class="mc-tag '.$is_active.'">';
|
||||
$out .= '👤 '.esc_html($p);
|
||||
$out .= '<span class="mc-tag-count">'.$count.'</span>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div></div>';
|
||||
}
|
||||
|
||||
// Bilder Grid (Gemischt - Alle Bilder, auch unverknüpfte)
|
||||
if (!empty($all_images)) {
|
||||
$out .= '<div class="mc-gallery-grid">';
|
||||
|
||||
foreach ($all_images as $img) {
|
||||
$full = wp_get_attachment_url($img->ID);
|
||||
$player_name = esc_html($img->mc_player_name);
|
||||
$upload_date = date_i18n('d.m.Y', strtotime($img->mc_upload_date));
|
||||
|
||||
$album_id = get_post_meta($img->ID, 'mc_album_id', true);
|
||||
$album_name = '';
|
||||
if ($album_id) {
|
||||
$album_post = get_post($album_id);
|
||||
if ($album_post) {
|
||||
$album_name = $album_post->post_title;
|
||||
}
|
||||
}
|
||||
|
||||
$metadata = wp_get_attachment_metadata($img->ID);
|
||||
$width = isset($metadata['width']) ? $metadata['width'] : 0;
|
||||
$height = isset($metadata['height']) ? $metadata['height'] : 0;
|
||||
$aspect_ratio = ($width && $height) ? ($width / $height) : 1;
|
||||
|
||||
$resize_pct = intval(get_option(MC_Gallery_Core::OPTION_RESIZE_PCT, 100));
|
||||
|
||||
if ($resize_pct < 100 && isset($metadata['sizes']['mc-optimized'])) {
|
||||
$upload_dir = wp_upload_dir();
|
||||
$file_path = dirname($metadata['file']) . '/' . $metadata['sizes']['mc-optimized']['file'];
|
||||
$thumb = $upload_dir['baseurl'] . '/' . $file_path;
|
||||
} else {
|
||||
$thumb_array = wp_get_attachment_image_src($img->ID, 'medium');
|
||||
$thumb = $thumb_array ? $thumb_array[0] : $full;
|
||||
}
|
||||
|
||||
$data_date_attr = $show_date ? 'data-date="'.esc_attr($upload_date).'"' : '';
|
||||
$views = get_post_meta($img->ID, 'mc_views', true) ?: 0;
|
||||
|
||||
$out .= '<a href="'.esc_url($full).'" class="mc-gallery-item" data-player="'.esc_attr($player_name).'" '.$data_date_attr.' data-album="'.esc_attr($album_name).'" data-attach-id="'.$img->ID.'">';
|
||||
$out .= '<div class="mc-gallery-item-inner">';
|
||||
$out .= '<div class="mc-views-badge">👁️ <span class="mc-views-count">'.$views.'</span></div>';
|
||||
if ($show_date) {
|
||||
$out .= '<div class="mc-date-badge">'.$upload_date.'</div>';
|
||||
}
|
||||
$out .= '<img src="'.esc_url($thumb).'" alt="'.esc_attr($player_name).'" loading="lazy" style="aspect-ratio: '.$aspect_ratio.';">';
|
||||
$out .= '<div class="mc-gallery-overlay">';
|
||||
$out .= '<div class="mc-gallery-info">';
|
||||
$out .= '<div class="mc-watermark">'.$player_name.'</div>';
|
||||
if ($album_name) {
|
||||
$out .= '<div class="mc-album-badge">📁 '.esc_html($album_name).'</div>';
|
||||
}
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
} else {
|
||||
$out .= '<div class="mc-empty-state">🔍 Keine Bilder gefunden für den ausgewählten Filter.</div>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
return $out;
|
||||
}
|
||||
|
||||
public static function shortcode_player($atts) {
|
||||
$atts = shortcode_atts([
|
||||
'player' => '',
|
||||
'server_id' => 0,
|
||||
'thumb_h' => 0
|
||||
], $atts);
|
||||
|
||||
$player = sanitize_text_field($atts['player']);
|
||||
$server_id = intval($atts['server_id']);
|
||||
$thumb_h = intval($atts['thumb_h']) ?: MC_Gallery_Core::get_default_thumb_h();
|
||||
$show_date = get_option(MC_Gallery_Core::OPTION_SHOW_DATE, true);
|
||||
|
||||
if (!$player || !$server_id) {
|
||||
return '<div class="mc-notice mc-error">❌ Invalid request.</div>';
|
||||
}
|
||||
|
||||
$gallery = MC_Gallery_Helpers::find_or_create_gallery_post($player, $server_id);
|
||||
if (!$gallery) {
|
||||
return '<div class="mc-empty-state">📁 Gallery not found.</div>';
|
||||
}
|
||||
|
||||
$images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'post_parent' => $gallery->ID,
|
||||
'posts_per_page' => -1,
|
||||
'post_mime_type' => 'image',
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
$albums = get_posts([
|
||||
'post_type' => 'mc_album',
|
||||
'posts_per_page' => -1,
|
||||
'meta_key' => 'mc_gallery_id',
|
||||
'meta_value' => $gallery->ID,
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
if (empty($images) && empty($albums)) {
|
||||
return '<div class="mc-gallery-container">
|
||||
<div class="mc-empty-state">
|
||||
📷 '.esc_html($player).' has not uploaded any images yet.
|
||||
</div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
$current_url = remove_query_arg(['player', 'server', 'album']);
|
||||
|
||||
$out = '<div class="mc-gallery-container">';
|
||||
$out .= '<div class="mc-player-header">';
|
||||
$out .= '<div class="mc-player-title">';
|
||||
$out .= '<div class="mc-player-avatar">👤</div>';
|
||||
$out .= '<h2>Gallery of <span class="mc-highlight">'.esc_html($player).'</span></h2>';
|
||||
$out .= '</div>';
|
||||
$out .= '<a href="'.esc_url($current_url).'" class="mc-btn mc-btn-ghost mc-btn-small">';
|
||||
$out .= '<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/></svg>';
|
||||
$out .= ' Zurück zur Übersicht';
|
||||
$out .= '</a>';
|
||||
$out .= '</div>';
|
||||
|
||||
if (!empty($albums)) {
|
||||
$out .= '<div class="mc-albums-section">';
|
||||
$out .= '<h3 class="mc-section-title">📁 Albums ('.count($albums).')</h3>';
|
||||
$out .= '<div class="mc-albums-grid">';
|
||||
|
||||
foreach ($albums as $album) {
|
||||
$album_images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'posts_per_page' => 1,
|
||||
'post_mime_type' => 'image',
|
||||
'post_parent' => get_post_meta($album->ID, 'mc_gallery_id', true),
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
$cover_url = '';
|
||||
if (!empty($album_images)) {
|
||||
$cover_array = wp_get_attachment_image_src($album_images[0]->ID, 'medium');
|
||||
$cover_url = $cover_array ? $cover_array[0] : '';
|
||||
}
|
||||
|
||||
$album_count = get_post_meta($album->ID, 'mc_image_count', true) ?: 0;
|
||||
$album_link = add_query_arg(['album' => $album->ID], $current_url);
|
||||
|
||||
$out .= '<a href="'.esc_url($album_link).'" class="mc-album-card">';
|
||||
if ($cover_url) {
|
||||
$out .= '<div class="mc-album-cover" style="background-image: url('.esc_url($cover_url).')"></div>';
|
||||
} else {
|
||||
$out .= '<div class="mc-album-cover mc-album-empty">📁</div>';
|
||||
}
|
||||
$out .= '<div class="mc-album-info">';
|
||||
$out .= '<h4>'.esc_html($album->post_title).'</h4>';
|
||||
$out .= '<span class="mc-album-count">'.$album_count.' Images</span>';
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
}
|
||||
|
||||
if (!empty($images)) {
|
||||
$out .= '<div class="mc-images-section">';
|
||||
$out .= '<h3 class="mc-section-title">🖼️ Alle Bilder ('.count($images).')</h3>';
|
||||
$out .= '<div class="mc-gallery-grid">';
|
||||
|
||||
foreach ($images as $img) {
|
||||
$full = wp_get_attachment_url($img->ID);
|
||||
$upload_date = date_i18n('d.m.Y', strtotime($img->post_date));
|
||||
|
||||
$metadata = wp_get_attachment_metadata($img->ID);
|
||||
$width = isset($metadata['width']) ? $metadata['width'] : 0;
|
||||
$height = isset($metadata['height']) ? $metadata['height'] : 0;
|
||||
$aspect_ratio = ($width && $height) ? ($width / $height) : 1;
|
||||
|
||||
$resize_pct = intval(get_option(MC_Gallery_Core::OPTION_RESIZE_PCT, 100));
|
||||
if ($resize_pct < 100 && isset($metadata['sizes']['mc-optimized'])) {
|
||||
$upload_dir = wp_upload_dir();
|
||||
$file_path = dirname($metadata['file']) . '/' . $metadata['sizes']['mc-optimized']['file'];
|
||||
$thumb = $upload_dir['baseurl'] . '/' . $file_path;
|
||||
} else {
|
||||
$thumb_array = wp_get_attachment_image_src($img->ID, 'medium');
|
||||
$thumb = $thumb_array ? $thumb_array[0] : $full;
|
||||
}
|
||||
|
||||
$data_date_attr = $show_date ? 'data-date="'.esc_attr($upload_date).'"' : '';
|
||||
$views = get_post_meta($img->ID, 'mc_views', true) ?: 0;
|
||||
|
||||
$out .= '<a href="'.esc_url($full).'" class="mc-gallery-item" '.$data_date_attr.' data-attach-id="'.$img->ID.'">';
|
||||
$out .= '<div class="mc-gallery-item-inner">';
|
||||
$out .= '<div class="mc-views-badge">👁️ <span class="mc-views-count">'.$views.'</span></div>';
|
||||
if ($show_date) {
|
||||
$out .= '<div class="mc-date-badge">'.$upload_date.'</div>';
|
||||
}
|
||||
$out .= '<img src="'.esc_url($thumb).'" alt="'.esc_attr($player).'" loading="lazy" style="aspect-ratio: '.$aspect_ratio.';">';
|
||||
$out .= '<div class="mc-gallery-overlay">';
|
||||
$out .= '<div class="mc-gallery-info">';
|
||||
$out .= '<div class="mc-watermark">'.esc_html($player).'</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
public static function shortcode_all_albums_overview($atts) {
|
||||
$show_date = get_option(MC_Gallery_Core::OPTION_SHOW_DATE, true);
|
||||
$current_url = remove_query_arg(['player', 'server', 'album']);
|
||||
|
||||
$albums = get_posts([
|
||||
'post_type' => 'mc_album',
|
||||
'posts_per_page' => -1,
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
if (empty($albums)) {
|
||||
return '<div class="mc-gallery-container"><div class="mc-empty-state">📁 Es wurden noch keine Alben erstellt.</div></div>';
|
||||
}
|
||||
|
||||
$out = '<div class="mc-gallery-container">';
|
||||
$out .= '<div class="mc-player-header">';
|
||||
$out .= '<div class="mc-player-title">';
|
||||
$out .= '<div class="mc-player-avatar">📁</div>';
|
||||
$out .= '<h2>📁 Alle Alben (' . count($albums) . ')</h2>';
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
|
||||
$out .= '<div class="mc-albums-grid">';
|
||||
|
||||
foreach ($albums as $album) {
|
||||
$album_count = get_post_meta($album->ID, 'mc_image_count', true) ?: 0;
|
||||
|
||||
$cover_images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'posts_per_page' => 1,
|
||||
'post_mime_type' => 'image',
|
||||
'meta_key' => 'mc_album_id',
|
||||
'meta_value' => $album->ID,
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
$cover_url = '';
|
||||
if (!empty($cover_images)) {
|
||||
$cover_array = wp_get_attachment_image_src($cover_images[0]->ID, 'medium');
|
||||
$cover_url = $cover_array ? $cover_array[0] : '';
|
||||
}
|
||||
|
||||
$album_link = add_query_arg(['album' => $album->ID], $current_url);
|
||||
|
||||
$gallery_id = get_post_meta($album->ID, 'mc_gallery_id', true);
|
||||
$player_name = '';
|
||||
if ($gallery_id) {
|
||||
$player_name = get_post_meta($gallery_id, 'mc_player', true);
|
||||
}
|
||||
|
||||
$out .= '<a href="'.esc_url($album_link).'" class="mc-album-card" title="'.esc_attr($player_name).'">';
|
||||
if ($cover_url) {
|
||||
$out .= '<div class="mc-album-cover" style="background-image: url('.esc_url($cover_url).')"></div>';
|
||||
} else {
|
||||
$out .= '<div class="mc-album-cover mc-album-empty">📁</div>';
|
||||
}
|
||||
$out .= '<div class="mc-album-info">';
|
||||
$out .= '<h4>'.esc_html($album->post_title).'</h4>';
|
||||
$out .= '<span class="mc-album-count">'.$album_count.' Images</span>';
|
||||
if ($player_name) {
|
||||
$out .= '<span class="mc-album-player">by '.esc_html($player_name).'</span>';
|
||||
}
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
$out .= '</div>';
|
||||
return $out;
|
||||
}
|
||||
|
||||
public static function shortcode_album_view($atts) {
|
||||
$atts = shortcode_atts([
|
||||
'album_id' => 0,
|
||||
'server_id' => 0
|
||||
], $atts);
|
||||
|
||||
$album_id = intval($atts['album_id']);
|
||||
$album = get_post($album_id);
|
||||
$show_date = get_option(MC_Gallery_Core::OPTION_SHOW_DATE, true);
|
||||
|
||||
if (!$album || $album->post_type !== 'mc_album') {
|
||||
return '<div class="mc-notice mc-error">❌ Album not found.</div>';
|
||||
}
|
||||
|
||||
$images = get_posts([
|
||||
'post_type' => 'attachment',
|
||||
'posts_per_page' => -1,
|
||||
'post_mime_type' => 'image',
|
||||
'meta_key' => 'mc_album_id',
|
||||
'meta_value' => $album_id,
|
||||
'orderby' => 'date',
|
||||
'order' => 'DESC'
|
||||
]);
|
||||
|
||||
$gallery_id = get_post_meta($album_id, 'mc_gallery_id', true);
|
||||
$gallery = get_post($gallery_id);
|
||||
$player = $gallery ? get_post_meta($gallery_id, 'mc_player', true) : '';
|
||||
|
||||
$current_url = remove_query_arg(['album']);
|
||||
|
||||
$out = '<div class="mc-gallery-container">';
|
||||
$out .= '<div class="mc-player-header">';
|
||||
$out .= '<div class="mc-player-title">';
|
||||
$out .= '<div class="mc-player-avatar">📁</div>';
|
||||
$out .= '<h2><span class="mc-highlight">'.esc_html($album->post_title).'</span></h2>';
|
||||
if ($player) {
|
||||
$out .= '<p class="mc-album-subtitle">by '.esc_html($player).'</p>';
|
||||
}
|
||||
$out .= '</div>';
|
||||
$out .= '<a href="'.esc_url($current_url).'" class="mc-btn mc-btn-ghost mc-btn-small">';
|
||||
$out .= '<svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/></svg>';
|
||||
$out .= ' Zurück';
|
||||
$out .= '</a>';
|
||||
$out .= '</div>';
|
||||
|
||||
if (!empty($images)) {
|
||||
$out .= '<div class="mc-gallery-grid">';
|
||||
|
||||
foreach ($images as $img) {
|
||||
$full = wp_get_attachment_url($img->ID);
|
||||
$upload_date = date_i18n('d.m.Y', strtotime($img->post_date));
|
||||
|
||||
$metadata = wp_get_attachment_metadata($img->ID);
|
||||
$width = isset($metadata['width']) ? $metadata['width'] : 0;
|
||||
$height = isset($metadata['height']) ? $metadata['height'] : 0;
|
||||
$aspect_ratio = ($width && $height) ? ($width / $height) : 1;
|
||||
|
||||
$thumb_array = wp_get_attachment_image_src($img->ID, 'medium');
|
||||
$thumb = $thumb_array ? $thumb_array[0] : $full;
|
||||
|
||||
$data_date_attr = $show_date ? 'data-date="'.esc_attr($upload_date).'"' : '';
|
||||
$views = get_post_meta($img->ID, 'mc_views', true) ?: 0;
|
||||
|
||||
$out .= '<a href="'.esc_url($full).'" class="mc-gallery-item" '.$data_date_attr.' data-attach-id="'.$img->ID.'">';
|
||||
$out .= '<div class="mc-gallery-item-inner">';
|
||||
$out .= '<div class="mc-views-badge">👁️ <span class="mc-views-count">'.$views.'</span></div>';
|
||||
if ($show_date) {
|
||||
$out .= '<div class="mc-date-badge">'.$upload_date.'</div>';
|
||||
}
|
||||
$out .= '<img src="'.esc_url($thumb).'" alt="" loading="lazy" style="aspect-ratio: '.$aspect_ratio.';">';
|
||||
$out .= '</div>';
|
||||
$out .= '</a>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
} else {
|
||||
$out .= '<div class="mc-empty-state">📷 This album contains no images yet.</div>';
|
||||
}
|
||||
|
||||
$out .= '</div>';
|
||||
return $out;
|
||||
}
|
||||
|
||||
public static function shortcode_upload($atts) {
|
||||
$atts = shortcode_atts(['show' => '0'], $atts);
|
||||
$show_default = ($atts['show'] === '1');
|
||||
|
||||
ob_start();
|
||||
?>
|
||||
<div class="mc-upload-wrapper">
|
||||
<button id="mc-open-upload-modal" class="mc-btn mc-btn-primary">
|
||||
<svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"/>
|
||||
</svg>
|
||||
Bilder hochladen
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="mc-upload-modal" class="mc-modal" aria-hidden="true" role="dialog">
|
||||
<div class="mc-modal-backdrop"></div>
|
||||
<div class="mc-modal-content">
|
||||
<button class="mc-modal-close" aria-label="Schließen">×</button>
|
||||
|
||||
<div class="mc-upload-wizard">
|
||||
<div class="mc-step active" data-step="1">
|
||||
<div class="mc-step-header">
|
||||
<span class="mc-step-num">1</span>
|
||||
<h3>Identifikation</h3>
|
||||
</div>
|
||||
<div class="mc-step-body">
|
||||
<label for="mc-upload-username">Dein Minecraft Name</label>
|
||||
<input type="text"
|
||||
id="mc-upload-username"
|
||||
placeholder="z.B. Steve"
|
||||
autocomplete="off">
|
||||
|
||||
<label for="mc-upload-server">Server wählen</label>
|
||||
<select id="mc-upload-server">
|
||||
<option>Lade Server...</option>
|
||||
</select>
|
||||
|
||||
<button id="mc-btn-generate" class="mc-btn mc-btn-primary mc-full-width">
|
||||
<svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"/>
|
||||
</svg>
|
||||
Session starten
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mc-step" data-step="2">
|
||||
<div class="mc-step-header">
|
||||
<span class="mc-step-num">2</span>
|
||||
<h3>Verifizierung</h3>
|
||||
</div>
|
||||
<div class="mc-step-body">
|
||||
<div class="mc-info-box">
|
||||
🎮 Gehe auf den Server und führe den folgenden Befehl aus:
|
||||
</div>
|
||||
|
||||
<div class="mc-token-box">
|
||||
<code id="mc-token-text">Waiting...</code>
|
||||
<button class="mc-copy-btn" title="Kopieren">📋</button>
|
||||
</div>
|
||||
|
||||
<p class="mc-small">
|
||||
💡 Gib im Chat ein: <strong>/verify [dein-token]</strong>
|
||||
</p>
|
||||
|
||||
<button id="mc-btn-check" class="mc-btn mc-btn-primary mc-full-width">
|
||||
<svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
||||
</svg>
|
||||
Verifizierung prüfen
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mc-step" data-step="3">
|
||||
<div class="mc-step-header">
|
||||
<span class="mc-step-num">3</span>
|
||||
<h3>Bilder hochladen</h3>
|
||||
</div>
|
||||
<div class="mc-step-body">
|
||||
<div class="mc-session-info">
|
||||
<span class="mc-session-badge">✓ Session aktiv</span>
|
||||
<span id="mc-session-user"></span>
|
||||
</div>
|
||||
|
||||
<label>Album wählen (optional)</label>
|
||||
<div class="mc-album-selector">
|
||||
<select id="mc-upload-album">
|
||||
<option value="">Kein Album</option>
|
||||
</select>
|
||||
<button id="mc-btn-new-album" class="mc-btn mc-btn-ghost mc-btn-small" type="button">
|
||||
<svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
|
||||
</svg>
|
||||
Neues Album
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="mc-new-album-form" style="display:none;">
|
||||
<label>Album-Name</label>
|
||||
<input type="text" id="mc-new-album-name" placeholder="z.B. Meine Bauten">
|
||||
<button id="mc-btn-create-album" class="mc-btn mc-btn-primary mc-btn-small mc-full-width">
|
||||
Album erstellen
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<label>Bilder auswählen (mehrere möglich)</label>
|
||||
<div class="mc-file-drop">
|
||||
<input type="file" id="mc-upload-file" accept="image/*" multiple>
|
||||
<svg width="48" height="48" fill="none" stroke="currentColor" viewBox="0 0 24 24" style="margin: 0 auto 12px; display: block; color: var(--mc-primary);">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"/>
|
||||
</svg>
|
||||
<span id="mc-file-name">Keine Bilder gewählt</span>
|
||||
</div>
|
||||
|
||||
<div id="mc-file-preview" class="mc-file-preview"></div>
|
||||
|
||||
<form id="mc-upload-form" style="display:none;">
|
||||
<?php wp_nonce_field('mc_gallery_upload_action', 'mc_upload_nonce'); ?>
|
||||
<input type="hidden" name="mc_token" id="mc_form_token">
|
||||
<input type="hidden" name="mc_username" id="mc_form_username">
|
||||
<input type="hidden" name="mc_server_id" id="mc_form_server">
|
||||
<input type="hidden" name="mc_album_id" id="mc_form_album">
|
||||
</form>
|
||||
|
||||
<div id="mc-upload-progress" style="display:none;">
|
||||
<div class="mc-progress-bar">
|
||||
<div class="mc-progress-fill" id="mc-progress-fill"></div>
|
||||
</div>
|
||||
<p id="mc-progress-text">Uploading...</p>
|
||||
</div>
|
||||
|
||||
<button id="mc-btn-final-upload" class="mc-btn mc-btn-success mc-full-width">
|
||||
<svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"/>
|
||||
</svg>
|
||||
<span id="mc-upload-btn-text">Bilder hochladen</span>
|
||||
</button>
|
||||
|
||||
<button id="mc-btn-upload-more" class="mc-btn mc-btn-ghost mc-full-width" style="display:none; margin-top: 12px;">
|
||||
<svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
|
||||
</svg>
|
||||
Weitere Bilder hochladen
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mc-feedback-msg"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($show_default): ?>
|
||||
<script>
|
||||
(function(){
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', function(){
|
||||
setTimeout(function(){
|
||||
var btn = document.getElementById('mc-open-upload-modal');
|
||||
if (btn) btn.click();
|
||||
}, 500);
|
||||
});
|
||||
} else {
|
||||
setTimeout(function(){
|
||||
var btn = document.getElementById('mc-open-upload-modal');
|
||||
if (btn) btn.click();
|
||||
}, 500);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
<?php
|
||||
return ob_get_clean();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user