[ 'name' => __('Lesezeichen', 'statistik-manager'), 'singular_name' => __('Lesezeichen', 'statistik-manager'), ], 'public' => false, 'show_ui' => false, 'show_in_menu' => false, 'supports' => ['title', 'custom-fields'], ]); } add_action('init', 'statistik_manager_create_bookmark_post_type'); /** * Generiert oder holt den Gast-Token. * * @return string Der Gast-Token. */ function statistik_manager_get_guest_token() { $guest_token = isset($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME]) ? sanitize_text_field($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME]) : null; if (!$guest_token) { $guest_token = wp_generate_uuid4(); setcookie( STATISTIK_MANAGER_COOKIE_NAME, $guest_token, time() + STATISTIK_MANAGER_COOKIE_DURATION, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), // Secure true // HttpOnly ); } return $guest_token; } /** * Speichert ein Lesezeichen für einen Gast. * * @param int $post_id Post-ID des Lesezeichens. */ function statistik_manager_save_bookmark($post_id) { $guest_token = statistik_manager_get_guest_token(); update_post_meta($post_id, '_guest_token', $guest_token); } /** * Ruft die Lesezeichen eines Gastes ab. * * @return array Liste der Lesezeichen. */ function statistik_manager_get_guest_bookmarks() { $guest_token = statistik_manager_get_guest_token(); $cache_key = STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY . md5($guest_token); $bookmarks = get_transient($cache_key); if ($bookmarks !== false) { return $bookmarks; } $args = [ 'post_type' => STATISTIK_MANAGER_BOOKMARK_POST_TYPE, 'meta_query' => [ [ 'key' => '_guest_token', 'value' => $guest_token, ], ], 'posts_per_page' => -1, 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC', ]; $bookmarks_query = new WP_Query($args); $bookmarks = $bookmarks_query->posts; set_transient($cache_key, $bookmarks, HOUR_IN_SECONDS); return $bookmarks; } /** * Löscht ein Lesezeichen via AJAX. */ function statistik_manager_delete_bookmark() { check_ajax_referer('statistik_manager_bookmark_nonce', 'nonce'); if (!isset($_POST['bookmark_id']) || !isset($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME])) { wp_send_json_error(['message' => __('Ungültige Anfrage.', 'statistik-manager')]); } $bookmark_id = absint($_POST['bookmark_id']); $guest_token = sanitize_text_field($_COOKIE[STATISTIK_MANAGER_COOKIE_NAME]); $stored_token = get_post_meta($bookmark_id, '_guest_token', true); if ($stored_token !== $guest_token) { wp_send_json_error(['message' => __('Du kannst nur deine eigenen Lesezeichen löschen.', 'statistik-manager')]); } wp_delete_post($bookmark_id, true); delete_transient(STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY . md5($guest_token)); wp_send_json_success(['message' => __('Lesezeichen erfolgreich gelöscht.', 'statistik-manager')]); } add_action('wp_ajax_delete_bookmark', 'statistik_manager_delete_bookmark'); add_action('wp_ajax_nopriv_delete_bookmark', 'statistik_manager_delete_bookmark'); /** * Fügt ein Lesezeichen via AJAX hinzu. */ function statistik_manager_add_bookmark_ajax() { check_ajax_referer('statistik_manager_bookmark_nonce', 'nonce'); if (!isset($_POST['bookmark_url']) || !isset($_POST['bookmark_name'])) { wp_send_json_error(['message' => __('Bitte alle Felder ausfüllen.', 'statistik-manager')]); } $bookmark_url = esc_url_raw($_POST['bookmark_url']); $bookmark_name = sanitize_text_field($_POST['bookmark_name']); if (empty($bookmark_url) || empty($bookmark_name)) { wp_send_json_error(['message' => __('Ungültige URL oder Name.', 'statistik-manager')]); } // Prüfen, ob die URL bereits existiert $guest_token = statistik_manager_get_guest_token(); $args = [ 'post_type' => STATISTIK_MANAGER_BOOKMARK_POST_TYPE, 'meta_query' => [ 'relation' => 'AND', [ 'key' => '_guest_token', 'value' => $guest_token, ], [ 'key' => '_bookmark_url', 'value' => $bookmark_url, ], ], 'posts_per_page' => 1, ]; $existing = new WP_Query($args); if ($existing->have_posts()) { wp_send_json_error(['message' => __('Diese URL ist bereits ein Lesezeichen.', 'statistik-manager')]); } // Neues Lesezeichen erstellen $post_id = wp_insert_post([ 'post_type' => STATISTIK_MANAGER_BOOKMARK_POST_TYPE, 'post_title' => $bookmark_name, 'post_status' => 'publish', 'meta_input' => [ '_bookmark_url' => $bookmark_url, '_guest_token' => $guest_token, ], ]); if (is_wp_error($post_id)) { wp_send_json_error(['message' => __('Fehler beim Hinzufügen des Lesezeichens.', 'statistik-manager')]); } delete_transient(STATISTIK_MANAGER_BOOKMARKS_CACHE_KEY . md5($guest_token)); wp_send_json_success([ 'message' => __('Lesezeichen erfolgreich hinzugefügt.', 'statistik-manager'), 'html' => '
  • ' . esc_html($bookmark_name) . '
  • ', ]); } add_action('wp_ajax_add_bookmark', 'statistik_manager_add_bookmark_ajax'); add_action('wp_ajax_nopriv_add_bookmark', 'statistik_manager_add_bookmark_ajax'); /** * Zeigt die Lesezeichen eines Gastes an. * * @return string HTML-Ausgabe der Lesezeichen. */ function statistik_manager_display_bookmarks() { $bookmarks = statistik_manager_get_guest_bookmarks(); ob_start(); ?>