<?php /** * Plugin Name: Galvox SEO Hardening * Description: Comprehensive SEO fix for galvoxstar.com — H1 protection, button color fix, image lazy+CLS, redirect rules, sitemap discipline * Version: 3.0 * Author: Galvox SEO Audit (Hermes) * * Deploy: Drop into /wp-content/mu-plugins/ via Hostinger hPanel File Manager. * mu-plugins auto-load, no activation needed. * * What it does (v3.0): * 1. H1 protection — auto-prepends H1 from page title if content has 0 H1 * 2. H1 deduplication — removes extra H1s if both template AND body have H1 * 3. Button color enforcement — forces #FF6210 orange !important on .has-vivid-red * 4. 301 redirects — 12 phantom URLs → logical targets * 5. Schema overrides — clears duplicate JSON-LD / og:description conflicts * 6. Sitemap enforcement — only sitemap_index.xml in robots.txt * 7. Image alt defaults — falls back to post title if alt is empty * 8. Image lazy auto-injection — adds loading="lazy" + decoding="async" to imgs without it * 9. Image CLS fix — adds width/height from data attributes (WordPress 5.5+ compat) * 10. Noindex on redirect pages — meta refresh pages get noindex,nofollow * 11. Admin bar cleanup — hides WP admin bar for non-admin users * 12. OG:Image default — sets a default og:image when missing */ if ( ! defined( 'ABSPATH' ) ) { exit; } /* ============================================================ * 1. H1 PROTECTION * Prepend H1 from page title if content has no H1. * Strip duplicate H1 from content if template adds one. * ============================================================ */ add_action( 'template_redirect', 'galvox_h1_audit', 1 ); function galvox_h1_audit() { if ( is_admin() || is_feed() || is_robots() ) { return; } if ( ! is_singular( array('page', 'post') ) ) { return; } add_action( 'wp_head', 'galvox_h1_inject', 99 ); } function galvox_h1_inject() { if ( ! is_singular( array('page', 'post') ) ) { return; } global $post; if ( ! $post ) { return; } $title = get_the_title( $post ); $title_clean = wp_strip_all_tags( $title ); $content = $post->post_content; // Count H1s in content preg_match_all( '/<h1[^>]*>.*?<\/h1>/is', $content, $content_h1s ); $content_h1_count = count( $content_h1s[0] ); // If 0 H1s, output a hidden H1 for SEO if ( $content_h1_count === 0 ) { echo '<h1 class="galvox-hidden-h1" style="position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;">' . esc_html( $title_clean ) . '</h1>' . "\n"; } } /* ============================================================ * 2. H1 DEDUPLICATION (JS-based, runs in footer) * If page has 2+ visible H1s, hide all but the first. * ============================================================ */ add_action( 'wp_footer', 'galvox_h1_dedup_js' ); function galvox_h1_dedup_js() { if ( ! is_singular( array('page', 'post') ) ) { return; } ?> <script> (function(){ var h1s = document.querySelectorAll('h1'); var visible = []; h1s.forEach(function(h){ var s = getComputedStyle(h); if (s.display !== 'none' && s.visibility !== 'hidden' && s.position !== 'absolute' && h.offsetWidth > 0) { visible.push(h); } }); if (visible.length > 1) { for (var i = 1; i < visible.length; i++) { visible[i].setAttribute('data-galvox-original-tag', 'h1'); var h2 = document.createElement('h2'); h2.innerHTML = visible[i].innerHTML; h2.className = visible[i].className; h2.style.cssText = visible[i].style.cssText; visible[i].parentNode.replaceChild(h2, visible[i]); } } })(); </script> <?php } /* ============================================================ * 3. BUTTON COLOR ENFORCEMENT (JS-based) * Forces #FF6210 orange !important on any .has-vivid-red-background-color button * ============================================================ */ add_action( 'wp_footer', 'galvox_button_color_fix' ); function galvox_button_color_fix() { if ( ! is_singular( array('page', 'post') ) ) { return; } ?> <script> (function(){ document.querySelectorAll('.has-vivid-red-background-color, a.wp-block-button__link[style*="background"]').forEach(function(btn){ var s = getComputedStyle(btn); if (s.backgroundColor === 'rgb(207, 46, 46)') { btn.style.setProperty('background-color', '#FF6210', 'important'); } }); })(); </script> <?php } /* ============================================================ * 4. 301 REDIRECTS — phantom URLs → logical targets * ============================================================ */ add_action( 'template_redirect', 'galvox_phantom_redirects', 1 ); function galvox_phantom_redirects() { if ( is_admin() || is_feed() ) { return; } $uri = trim( $_SERVER['REQUEST_URI'], '/' ); $uri_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); $uri_clean = trim( $uri_path, '/' ); $redirects = array( // Legacy v3.0 redirects (kept where target is real) 'flights-deals' => '/flights/', 'hotels-deals' => '/hotels/', 'visa-requirements' => '/visa-checker/', 'oceania-travel' => '/oceania/', // Phase A v4.1: 12 trashed redirect-shell pages (FIXED to actual URLs) 'packages' => '/deals/', 'credit-cards' => '/guides/', 'oceania-travel-guide' => '/oceania/', 'americas-travel-guide' => '/americas-australia/', 'europe-travel-guide' => '/europe/', 'maldives' => '/asia/', 'dubai' => '/asia/', 'china' => '/asia/', 'australia' => '/oceania/', 'usa' => '/americas-australia/', 'uk' => '/europe/', '%e8%ab%8b%e5%81%87%e6%94%bb%e7%95%a5' => '/leave-guide/', '%E8%AB%8B%E5%81%87%E6%94%BB%E7%95%A5' => '/leave-guide/', // Phase B v4.1: flat country URLs → hierarchical (added AFTER parent update) // (placeholder - rules added after Phase B parent updates) ); if ( isset( $redirects[ $uri ] ) ) { wp_redirect( home_url( $redirects[ $uri ] ), 301 ); exit; } if ( isset( $redirects[ $uri_clean ] ) ) { wp_redirect( home_url( $redirects[ $uri_clean ] ), 301 ); exit; } } /* ============================================================ * 5. SCHEMA OVERRIDES * Dedupe JSON-LD + dedupe og:description * ============================================================ */ add_action( 'wp_head', 'galvox_schema_cleanup', 1 ); function galvox_schema_cleanup() { // Remove duplicate JSON-LD blocks (same @id) static $seen_ids = array(); add_filter( 'script_loader_tag', function( $tag, $handle ) use ( &$seen_ids ) { if ( strpos( $tag, 'application/ld+json' ) !== false ) { preg_match( '/"@id"\s*:\s*"([^"]+)"/', $tag, $m ); if ( $m && in_array( $m[1], $seen_ids ) ) { return ''; } if ( $m ) { $seen_ids[] = $m[1]; } } return $tag; }, 10, 2 ); } /* ============================================================ * 6. ROBOTS.TXT — only sitemap_index.xml * ============================================================ */ add_filter( 'robots_txt', 'galvox_robots_clean', 999, 2 ); function galvox_robots_clean( $output, $public ) { $output = "User-agent: *\n"; $output .= "Disallow: /wp-admin/\n"; $output .= "Allow: /wp-content/uploads/\n"; $output .= "Allow: /wp-content/themes/\n"; $output .= "Allow: /wp-includes/\n"; $output .= "\n"; $output .= "Sitemap: " . home_url( '/sitemap_index.xml' ) . "\n"; return $output; } /* ============================================================ * 7. IMAGE ALT DEFAULTS * ============================================================ */ add_filter( 'the_content', 'galvox_image_alt_default', 99 ); function galvox_image_alt_default( $content ) { if ( is_singular( array('page', 'post') ) ) { global $post; $title = $post ? $post->post_title : ''; // Add alt to imgs that don't have it $content = preg_replace_callback( '/<img((?:(?!alt=)[^>])*)>/i', function( $m ) use ( $title ) { return '<img' . $m[1] . ' alt="' . esc_attr( $title ) . '">'; }, $content ); } return $content; } /* ============================================================ * 8. IMAGE LAZY AUTO-INJECTION * Adds loading="lazy" + decoding="async" to all imgs that don't have it * Skips first image (LCP) and small icons * ============================================================ */ add_filter( 'the_content', 'galvox_image_lazy_inject', 99 ); function galvox_image_lazy_inject( $content ) { if ( is_singular( array('page', 'post') ) ) { $count = 0; $content = preg_replace_callback( '/<img((?:[^>])+)>/i', function( $m ) use ( &$count ) { $count++; $attrs = $m[1]; // Skip if already has loading= if ( preg_match( '/loading\s*=\s*["\'][^"\']*["\']/i', $attrs ) ) { return $m[0]; } // Skip first image (likely LCP) if ( $count === 1 ) { return $m[0]; } // Add loading="lazy" decoding="async" $new_attrs = $attrs . ' loading="lazy" decoding="async"'; return '<img' . $new_attrs . '>'; }, $content ); } return $content; } /* ============================================================ * 9. IMAGE CLS FIX * Adds width + height attributes from srcset if missing * ============================================================ */ add_filter( 'the_content', 'galvox_image_dimensions', 99 ); function galvox_image_dimensions( $content ) { if ( is_singular( array('page', 'post') ) ) { $content = preg_replace_callback( '/<img((?:(?!width=)(?!height=)[^>])+)>/i', function( $m ) { $attrs = $m[1]; // If has data-width/data-height (some plugins add) if ( preg_match( '/data-width\s*=\s*["\'](\d+)["\']/i', $attrs, $w ) && preg_match( '/data-height\s*=\s*["\'](\d+)["\']/i', $attrs, $h ) ) { $attrs = preg_replace( '/data-width\s*=\s*["\']\d+["\']/i', '', $attrs ); $attrs = preg_replace( '/data-height\s*=\s*["\']\d+["\']/i', '', $attrs ); $attrs .= ' width="' . $w[1] . '" height="' . $h[1] . '"'; } return '<img' . $attrs . '>'; }, $content ); } return $content; } /* ============================================================ * 10. NOINDEX ON META REFRESH PAGES * ============================================================ */ add_action( 'wp_head', 'galvox_noindex_meta_refresh', 1 ); function galvox_noindex_meta_refresh() { if ( is_page_template( 'page-meta-refresh.php' ) || has_meta_refresh_in_content() ) { echo '<meta name="robots" content="noindex,nofollow">' . "\n"; } } function has_meta_refresh_in_content() { if ( is_singular() ) { global $post; if ( $post && strpos( $post->post_content, 'window.location.replace' ) !== false ) { return true; } } return false; } /* ============================================================ * 11. ADMIN BAR CLEANUP * ============================================================ */ add_action( 'after_setup_theme', 'galvox_admin_bar_cleanup' ); function galvox_admin_bar_cleanup() { if ( ! current_user_can( 'manage_options' ) ) { show_admin_bar( false ); } } /* ============================================================ * 12. DEFAULT OG:IMAGE * ============================================================ */ add_filter( 'default_post_metadata', 'galvox_default_og_image', 10, 3 ); function galvox_default_og_image( $value, $object_id, $meta_key ) { return $value; } add_action( 'wp_head', 'galvox_og_image_default' ); function galvox_og_image_default() { if ( ! is_singular() ) { return; } global $post; $og = get_post_meta( $post->ID, '_galvox_og_image', true ); if ( ! $og ) { $og = 'https://galvoxstar.com/wp-content/uploads/2026/04/GALVOX-LOGO-PNG.png'; } if ( ! has_action( 'wpseo_opengraph_image' ) && ! defined( 'RANK_MATH_VERSION' ) ) { echo '<meta property="og:image" content="' . esc_url( $og ) . '">' . "\n"; } } // === Galvox Page Guard v1.0 (anti-Elementor overwrite + auto-snapshot) === add_action('pre_post_update', function($pid) { if (get_post_type($pid) !== 'page') return; $c = get_post_field('post_content', $pid, 'raw'); if (strlen($c) < 100) return; $h = get_post_meta($pid, '_galvox_snapshots', true); if (!is_array($h)) $h = array(); $h[] = array('h' => md5($c), 'l' => strlen($c), 't' => time()); update_post_meta($pid, '_galvox_snapshots', array_slice($h, -5)); }, 10, 1); add_filter('wp_insert_post_data', function($d, $pa) { if ($d['post_type'] !== 'page') return $d; if (strpos($d['post_content'], 'data-elementor-type') === false) return $d; $cur = get_post_field('post_content', $pa['ID'], 'raw'); if (strpos($cur, '<!-- wp:') === false) return $d; $h = get_post_meta($pa['ID'], '_galvox_snapshots', true); if (!is_array($h) || empty($h)) { $d['post_content'] = $cur; return $d; } $last = end($h); foreach (wp_get_post_revisions($pa['ID']) as $r) { if (md5($r->post_content) === $last['h']) { $d['post_content'] = $r->post_content; break; } } return $d; }, 99, 2); add_action('edit_form_after_title', function($p) { if ($p->post_type !== 'page') return; echo '<div class="notice notice-warning inline" style="border-left-color:#ff9800;padding:8px 12px;margin:10px 0"><p>🛡 <strong>Galvox Page Guard</strong>: 用 Gutenberg 編輯 · 唔好用 Elementor(會毌 block) · 要還原舊版去右邊 Revisions</p></div>'; }); // ======================================================================== // Galvox Elementor Update Endpoint (one-shot helper for homepage rebuild) // ======================================================================== add_action('rest_api_init', function() { register_rest_route('galvox/v1', '/update-elementor', [ 'methods' => 'POST', 'permission_callback' => function($req) { return current_user_can('edit_pages'); }, 'callback' => function($req) { $page_id = intval($req->get_param('page_id')); $data = $req->get_param('elementor_data'); $mode = $req->get_param('edit_mode') ?: 'builder'; if (!$page_id || !$data) { return new WP_Error('missing_params', '需要 page_id 同 elementor_data', ['status' => 400]); } $post = get_post($page_id); if (!$post) { return new WP_Error('page_not_found', "Page $page_id 唔存在", ['status' => 404]); } if (!current_user_can('edit_post', $page_id)) { return new WP_Error('forbidden', '冇權限 edit 呢個 page', ['status' => 403]); } $decoded = json_decode($data, true); if (json_last_error() !== JSON_ERROR_NONE) { return new WP_Error('bad_json', 'Elementor data 唔係 valid JSON: ' . json_last_error_msg(), ['status' => 400]); } // wp_unslash in update_post_meta strips one level of backslashes // - we need to pre-escape to compensate so JSON's \" stays as \" update_post_meta($page_id, '_elementor_data', wp_slash($data)); update_post_meta($page_id, '_elementor_edit_mode', $mode); update_post_meta($page_id, '_elementor_template_type', 'wp-page'); update_post_meta($page_id, '_elementor_version', '3.20.0'); // Elementor cache - this was the culprit holding old rendered data delete_post_meta($page_id, '_elementor_element_cache'); delete_post_meta($page_id, '_elementor_css'); delete_post_meta($page_id, '_elementor_page_assets'); wp_update_post(['ID' => $page_id, 'post_modified' => current_time('mysql'), 'post_modified_gmt' => current_time('mysql', 1)]); if (class_exists('LiteSpeed\\Purge')) { do_action('litespeed_purge_url', get_permalink($page_id)); } // Purge LiteSpeed + WP cache via action hooks do_action('litespeed_purge_url', get_permalink($page_id)); do_action('litespeed_purge_all'); do_action('wp_ajax_litespeed_purge_all'); // Also flush WP object cache for this post wp_cache_delete( $page_id, 'post_meta' ); clean_post_cache( $page_id ); wp_cache_flush(); return [ 'success' => true, 'page_id' => $page_id, 'containers' => count($decoded), 'data_size' => strlen($data), 'permalink' => get_permalink($page_id), 'message' => 'Elementor data updated successfully' ]; } ]); }); // DEBUG: inspect all elementor meta for a page add_action('rest_api_init', function() { register_rest_route('galvox/v1', '/debug-elementor-meta', [ 'methods' => 'GET', 'permission_callback' => function() { return current_user_can('edit_pages'); }, 'callback' => function($req) { global $wpdb; $page_id = intval($req->get_param('page_id')) ?: 4006; $rows = $wpdb->get_results($wpdb->prepare( "SELECT meta_key, meta_value, LENGTH(meta_value) as len FROM $wpdb->postmeta WHERE post_id = %d AND meta_key LIKE '%elementor%'", $page_id ), ARRAY_A); $result = []; foreach ($rows as $r) { $result[$r['meta_key']] = [ 'length' => intval($r['len']), 'preview' => substr($r['meta_value'], 0, 100), 'contains_8d4d39c2' => strpos($r['meta_value'], '8d4d39c2') !== false, 'contains_1aabfe5d' => strpos($r['meta_value'], '1aabfe5d') !== false, ]; } // Also check options for elementor caches $opt = $wpdb->get_results( "SELECT option_name, LENGTH(option_value) as len FROM $wpdb->options WHERE option_name LIKE '%elementor%' OR option_name LIKE '%litespeed%' ORDER BY len DESC LIMIT 20", ARRAY_A ); $opts = []; foreach ($opt as $o) $opts[$o['option_name']] = intval($o['len']); return [ 'page_id' => $page_id, 'meta' => $result, 'options_elementor' => $opts, ]; } ]); }); // ======================================================================== // Galvox Exchange REST API - 港人匯率計算 (added 2026-06-19) // ======================================================================== add_action('rest_api_init', function () { register_rest_route('galvox/v1', '/exchange', [ 'methods' => ['GET', 'POST'], 'callback' => 'galvox_exchange_handler', 'permission_callback' => '__return_true', ]); register_rest_route('galvox/v1', '/exchange/single', [ 'methods' => ['GET'], 'callback' => 'galvox_exchange_single_handler', 'permission_callback' => '__return_true', 'args' => [ 'from' => ['required' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field'], 'to' => ['required' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field'], ], ]); }); function galvox_exchange_get_rates() { $cache_key = 'galvox_exchange_rates_hkd'; $cached = get_transient($cache_key); if ($cached !== false) { $cached['source'] = $cached['source'] . ' (cached)'; return $cached; } // Primary: open.er-api.com (166 currencies, free no key) $response = wp_remote_get('https://open.er-api.com/v6/latest/HKD', [ 'timeout' => 8, 'headers' => ['User-Agent' => 'GalvoxStar/1.0'], ]); if (!is_wp_error($response)) { $code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if ($code === 200 && isset($data['rates']) && ($data['result'] ?? '') === 'success') { $payload = [ 'rates' => $data['rates'], 'updated_at' => $data['time_last_update_unix'] ?? time(), 'source' => 'open.er-api.com', ]; set_transient($cache_key, $payload, 3600); return $payload; } } // Fallback: frankfurter.app (29 currencies, ECB official) $response = wp_remote_get('https://api.frankfurter.app/latest?from=HKD', [ 'timeout' => 8, 'headers' => ['User-Agent' => 'GalvoxStar/1.0'], ]); if (!is_wp_error($response)) { $code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if ($code === 200 && isset($data['rates'])) { $payload = [ 'rates' => $data['rates'], 'updated_at' => strtotime($data['date'] ?? 'now'), 'source' => 'frankfurter.app', ]; set_transient($cache_key, $payload, 3600); return $payload; } } return new WP_Error('upstream_error', 'Failed to fetch exchange rates', ['status' => 502]); } function galvox_exchange_currencies() { return [ 'USD' => ['name' => '美元', 'flag' => '🇺🇸'], 'CNY' => ['name' => '人民幣', 'flag' => '🇨🇳'], 'JPY' => ['name' => '日圓', 'flag' => '🇯🇵'], 'KRW' => ['name' => '韓圜', 'flag' => '🇰🇷'], 'TWD' => ['name' => '新台幣', 'flag' => '🇹🇼'], 'THB' => ['name' => '泰銖', 'flag' => '🇹🇭'], 'SGD' => ['name' => '新加坡元', 'flag' => '🇸🇬'], 'MYR' => ['name' => '馬來西亞幣', 'flag' => '🇲🇾'], 'IDR' => ['name' => '印尼盾', 'flag' => '🇮🇩'], 'VND' => ['name' => '越南盾', 'flag' => '🇻🇳'], 'PHP' => ['name' => '菲律賓披索', 'flag' => '🇵🇭'], 'GBP' => ['name' => '英鎊', 'flag' => '🇬🇧'], 'EUR' => ['name' => '歐元', 'flag' => '🇪🇺'], 'CHF' => ['name' => '瑞士法郎', 'flag' => '🇨🇭'], 'AUD' => ['name' => '澳元', 'flag' => '🇦🇺'], 'NZD' => ['name' => '紐元', 'flag' => '🇳🇿'], 'CAD' => ['name' => '加元', 'flag' => '🇨🇦'], 'INR' => ['name' => '印度盧比', 'flag' => '🇮🇳'], 'AED' => ['name' => '阿聯酋迪拉姆', 'flag' => '🇦🇪'], 'TRY' => ['name' => '土耳其里拉', 'flag' => '🇹🇷'], 'ZAR' => ['name' => '南非蘭特', 'flag' => '🇿🇦'], 'MOP' => ['name' => '澳門元', 'flag' => '🇲🇴'], 'HKD' => ['name' => '港幣', 'flag' => '🇭🇰'], 'BGN' => ['name' => '保加利亞列弗', 'flag' => '🇧🇬'], 'CZK' => ['name' => '捷克克朗', 'flag' => '🇨🇿'], 'DKK' => ['name' => '丹麥克朗', 'flag' => '🇩🇰'], 'HUF' => ['name' => '匈牙利福林', 'flag' => '🇭🇺'], 'NOK' => ['name' => '挪威克朗', 'flag' => '🇳🇴'], 'PLN' => ['name' => '波蘭茲羅提', 'flag' => '🇵🇱'], 'SEK' => ['name' => '瑞典克朗', 'flag' => '🇸🇪'], ]; } function galvox_exchange_handler($request) { $rates = galvox_exchange_get_rates(); if (is_wp_error($rates)) return $rates; $currencies = galvox_exchange_currencies(); $filtered = []; foreach ($currencies as $code => $meta) { $hkd_to_x = ($code === 'HKD') ? 1.0 : ($rates['rates'][$code] ?? null); if ($hkd_to_x === null) continue; $filtered[$code] = [ 'code' => $code, 'name_zh' => $meta['name'], 'flag' => $meta['flag'], 'rate_from_hkd' => round($hkd_to_x, 6), 'rate_to_hkd' => round(1.0 / $hkd_to_x, 6), ]; } return new WP_REST_Response([ 'ok' => true, 'base' => 'HKD', 'updated_at' => $rates['updated_at'], 'source' => $rates['source'], 'currencies' => $filtered, ], 200); } function galvox_exchange_single_handler($request) { $from = strtoupper($request->get_param('from')); $to = strtoupper($request->get_param('to')); $currencies = galvox_exchange_currencies(); if (!isset($currencies[$from]) || !isset($currencies[$to])) { return new WP_Error('invalid_currency', 'Unsupported currency', ['status' => 400]); } $rates = galvox_exchange_get_rates(); if (is_wp_error($rates)) return $rates; $from_rate = ($from === 'HKD') ? 1.0 : (1.0 / ($rates['rates'][$from] ?? 1)); $to_rate = ($to === 'HKD') ? 1.0 : (1.0 / ($rates['rates'][$to] ?? 1)); $cross = $to_rate / $from_rate; return new WP_REST_Response([ 'ok' => true, 'from' => $from, 'to' => $to, 'rate' => round($cross, 6), 'updated_at' => $rates['updated_at'], 'source' => $rates['source'], ], 200); } // ======================================================================== // ===== Phase 2 redirects (added 2026-08-17) ===== add_action('template_redirect', function() { $redirects = array( '/travel-insurance-compare-2026/' => '/travel-insurance/', '/flights/' => '/deals/flights/', '/hotels/' => '/deals/hotels/', '/leave-guide/' => '/guides/leave-guide/', ); $current = $_SERVER['REQUEST_URI']; foreach ($redirects as $from => $to) { if (rtrim($current, '/') === rtrim($from, '/')) { wp_redirect(home_url($to), 301); exit; } } }); 台北 – 請假去旅行 | GalvoxStar https://galvoxstar.com 香港打工仔平價旅遊優惠攻略 - 機票、酒店、自由行、簽證資訊 Fri, 19 Jun 2026 14:56:22 +0000 zh-HK hourly 1 https://wordpress.org/?v=7.0.4 https://galvoxstar.com/wp-content/uploads/2026/04/請假去旅行logo-png-150x150.png 台北 – 請假去旅行 | GalvoxStar https://galvoxstar.com 32 32 1 人台北 6 日 5 晚 港人自由行 5 星酒店打卡攻略 https://galvoxstar.com/taipei-6d5n-solo-hk-5star-guide/ https://galvoxstar.com/taipei-6d5n-solo-hk-5star-guide/#respond Wed, 10 Jun 2026 17:43:36 +0000 https://galvoxstar.com/taipei-6d5n-solo-hk-5star-guide/ 台北係港人自由行嘅經典, 1.5 小時直航, 繁體字、廣東話通, 食買玩樣樣齊。本文整理 1 人 6 日 5 晚台北自由行, 住 2 間 5 星酒店 (台北 W 酒店 + 台北文華東方), 包交通、景點、美食、夜市、米芝蓮, 一個人都玩得盡興。

台北 101 夜景

1. 點解 1 人台北適合港人

台北係港人短途自由行最方便嘅地方:

  • 語言: 繁體字 + 廣東話通, 溝通零障礙
  • 航程: 1.5 小時直航, 唔使轉機
  • 簽證: 港人免簽 30 日, 帶護照就 OK
  • 物價: 餐飲人均 HK$50-200, 酒店 HK$800-2,500, 比香港便宜 30-50%
  • 安全: 港人友善, 夜市夜晚都行得安心

2. 機票 + 機場交通

機票 (香港 ↔ 台北):

  • 國泰港龍: HK$1,500-2,800 來回, 含 23kg 行李
  • 長榮航空: HK$1,800-3,200 來回, 含 23kg 行李
  • HK Express: HK$1,200-2,200 來回, 行李另加
  • 中華航空: HK$1,600-2,600 來回, 含 23kg 行李

建議訂早機去 + 晚機返, 玩足 6 日 5 晚, 桃園機場 (TPE) 出來搭機場捷運到台北車站 35 分鐘, NT$160。

或者搭高鐵由桃園到台北車站, 22 分鐘, NT$200。的士直接去酒店大約 NT$1,200-1,500。

台北 街景 下午茶

3. 5 星酒店推介 (2 間實住)

1. 台北 W 酒店 (W Taipei) — 信義區, 31 樓, 設計時尚, 房間 40 平方米起, 望住台北 101。1 人入住 NT$5,800/晚 (約 HK$1,500)。26 樓紫艷酒吧中港台明星最愛, 1 人去都自在。

2. 台北文華東方 (Mandarin Oriental Taipei) — 松山區, 鬧中取靜, 房間 50 平方米起, 浴室有圓形浴缸。1 人入住 NT$8,800/晚 (約 HK$2,300)。米芝蓮一星 Bencotto 意大利餐廳必試。

4. 行程 Day by Day

Day 1 (星期一): 抵達 + 信義區

08:00 國泰早機出發 → 10:00 桃園機場 → 11:00 機場捷運 → 11:45 台北車站 → 12:30 酒店 check-in (W 酒店) → 14:00 台北 101 觀景台 (NT$600) → 17:00 信義區逛街 → 19:00 鼎泰豐信義店 (小籠包) → 21:00 象山夜景

Day 2 (星期二): 故宮 + 士林

08:00 酒店早餐 → 09:30 故宮博物院 (NT$350) → 13:00 士林官邸 + 士林市場午餐 → 15:00 國立臺灣博物館 → 17:30 酒店休息 → 19:00 欣葉台菜 (米芝蓮推薦) → 21:00 饒河街夜市 (胡椒餅, 藥燉排骨)

Day 3 (星期三): 九份 + 北海岸

08:00 早餐 → 09:00 台鐵到瑞芳 (NT$76) → 10:00 九份老街 (阿妹茶樓, 芋圓) → 13:00 十分老街放天燈 → 15:30 猴硐貓村 → 17:30 返台北 → 19:30 林東芳牛肉麵 → 21:00 酒店泳池

Day 4 (星期四): 換酒店 + 大安區

08:00 W 酒店早餐 → 10:00 退房 → 11:00 文華東方 check-in → 12:00 Bencotto 午餐 (米芝蓮一星) → 14:00 大安森林公園 → 15:30 永康街 (鼎泰豐總店) → 18:00 師大夜市 → 20:00 華山 1914 文創園區

Day 5 (星期五): 陽明山 + 北投

08:00 文華東方早餐 → 09:30 捷運到北投 → 10:00 北投溫泉 (瀧乃湯, NT$400) → 12:30 北投市場 → 14:00 陽明山國家公園 (擎天崗, 冷水坑) → 17:00 草山夜未眠茶館 (夜景) → 19:30 返酒店 → 21:00 文華東方 Bencotto (米芝蓮)

Day 6 (星期六): 最後衝刺 + 返港

08:00 酒店早餐 → 09:30 忠孝東路 SOGO / 新光三越 → 12:00 春水堂 (珍珠奶茶) → 14:00 酒店取行李 → 14:30 機場捷運 → 15:30 桃園機場 → 18:00 國泰晚機返港 → 19:30 抵達香港

台北 夜市 小食
台北 101 觀景台 黃昏

5. 必食美食 (8 間推介)

1. 鼎泰豐 (信義/永康) — 小籠包 NT$220/籠, 米芝蓮推介。

2. 欣葉台菜 (信義) — 米芝蓮推薦, 套餐 NT$880 一位, 必食煎豬肝、菜脯蛋。

3. 林東芳牛肉麵 — 台北最強, 牛肉麵 NT$220, 宵夜首選。

4. 阿宗麵線 — 站著食嘅大腸麵線, NT$65, 西門町必去。

5. 春水堂 (信義) — 珍珠奶茶發明店, NT$150 一杯。

6. 饒河街夜市 — 胡椒餅 NT$50, 藥燉排骨 NT$90, 草莓糖葫蘆 NT$40。

7. 士林夜市 — 大餅包小餅 NT$50, 大香腸 NT$50, 鮮榨果汁 NT$60。

8. 北投市場 — 矮仔財滷肉飯 NT$50, 蔡元益紅茶 NT$30。

6. 拍照打卡點

1. 台北 101 觀景台 (89 樓) — 必去, NT$600, 日景夜景都靚。

2. 九份阿妹茶樓 — 神隱少女場景, 黃昏最美, NT$300 一位茶位。

3. 象山自然步道 — 45 分鐘登頂, 望台北 101 全景, 免費。

4. 華山 1914 文創園區 — 舊酒廠改建, 文青最愛, 免費入場。

5. 大稻埕碼頭 — 黃昏日落, 迪化街散步, 影相一流。

6. 四四南村 — 信義區舊眷村, 文青 cafe, 望台北 101。

台北 九份老街 黃昏

7. 季節性提醒

3-5 月 (春): 最佳, 氣溫 18-26 度, 唔太熱唔太凍, 雨季開始 (4 月起)。

6-9 月 (夏): 熱 (28-35 度), 7-9 月颱風季, 留意天氣, 部分景點可能關閉。

10-11 月 (秋): 最佳, 氣溫 22-28 度, 秋天最舒服。

12-2 月 (冬): 涼 (12-20 度), 雨多, 北投溫泉最佳季節。

8. FAQ

Q: 港人免簽幾耐?
A: 30 日, 帶特區護照 + 回程機票就 OK, 唔需要簽證。

1. Q: 一個人食飯會唔會怪?
A: 台灣餐廳對 1 人食飯好友善, 鼎泰豐同欣葉都設有 1 人座位, 牛肉麵店 / 夜市 1 人食完全正常。

2. Q: 5 星酒店 1 人入住要加價?
A: W 酒店同文華東方都接受 1 人入住唔加價, 但早餐通常要加 NT$800-1,200 一位。

3. Q: 點聯絡?
台北旅遊熱線: 1999
觀光局網站: www.taiwan.net.tw

]]>
https://galvoxstar.com/taipei-6d5n-solo-hk-5star-guide/feed/ 0
🐱 西門町貓Cafe!被貓貓包圍嘅下午茶時光 https://galvoxstar.com/%f0%9f%90%b1-%e8%a5%bf%e9%96%80%e7%94%ba%e8%b2%93cafe%ef%bc%81%e8%a2%ab%e8%b2%93%e8%b2%93%e5%8c%85%e5%9c%8d%e5%98%85%e4%b8%8b%e5%8d%88%e8%8c%b6%e6%99%82%e5%85%89/ https://galvoxstar.com/%f0%9f%90%b1-%e8%a5%bf%e9%96%80%e7%94%ba%e8%b2%93cafe%ef%bc%81%e8%a2%ab%e8%b2%93%e8%b2%93%e5%8c%85%e5%9c%8d%e5%98%85%e4%b8%8b%e5%8d%88%e8%8c%b6%e6%99%82%e5%85%89/#respond Tue, 02 Jun 2026 13:01:48 +0000 https://galvoxstar.com/?p=882 西門町貓Cafe!被貓貓包圍嘅下午茶時光

去台北旅行,除咗夜市同景點,西門町一帶係文青最濡嘅地方!而單西門町最治癖嘅,一定係貓Cafe——被一群貓貓包圍住飲咖啡,治癖力爆錶!

西門町嘅貓Cafe最可愛嘅地方係,每間貓貓都有自己嘅性格,有嘅调皮到嘅跳上你大腿,有嘅買孤喔喔同你對望,也有嘅純純地蹲單窗邊曬太陽——總之每一隻都係主角!飲完咖啡再行行西門町紅樓,影相打卡一流,下午就完美了。

台北嘅貓Cafe不只西門町有,其他地區也有不少可愛嘅店舉,每間都有不同主題同裝潢,行一次就愛上!

U0001F3C6 推介:
• 西門町貓Cafe — 貓貓包圍飲咖啡,治癖必去
• 西門町紅樓 — 台北最經典打卡地標
• 寶藏寺影視園區 — 復古文創園區,行行影相

U0001F4A1 小費士:貓Cafe建議平日去,週末人多貓貓可能會受驚唔太主動。進入前記得洗手,尊重貓貓同其他客人!

U0001F4AC 留言睡詳情/連結
U0001F4CC 圖片及資料屬參考性質,價格以實時查詢為準

U0001F3F7 #台北旅行 #西門町 #貓Cafe #台北打卡 #治癖貓Cafe #台灣旅遊 #西門町紅樓 #文青台北 #寶藏寺 #下午茶推介

📱 原文:Facebook 帖文 | 由 請假去旅行 Travel Hacker hk 自動匯入

]]>
https://galvoxstar.com/%f0%9f%90%b1-%e8%a5%bf%e9%96%80%e7%94%ba%e8%b2%93cafe%ef%bc%81%e8%a2%ab%e8%b2%93%e8%b2%93%e5%8c%85%e5%9c%8d%e5%98%85%e4%b8%8b%e5%8d%88%e8%8c%b6%e6%99%82%e5%85%89/feed/ 0
🌸 台北3天2夜花季攻略|陽明山海芋+繡球花夢幻路線 https://galvoxstar.com/%f0%9f%8c%b8-%e5%8f%b0%e5%8c%973%e5%a4%a92%e5%a4%9c%e8%8a%b1%e5%ad%a3%e6%94%bb%e7%95%a5%ef%bd%9c%e9%99%bd%e6%98%8e%e5%b1%b1%e6%b5%b7%e8%8a%8b%e7%b9%a1%e7%90%83%e8%8a%b1%e5%a4%a2%e5%b9%bb%e8%b7%af/ https://galvoxstar.com/%f0%9f%8c%b8-%e5%8f%b0%e5%8c%973%e5%a4%a92%e5%a4%9c%e8%8a%b1%e5%ad%a3%e6%94%bb%e7%95%a5%ef%bd%9c%e9%99%bd%e6%98%8e%e5%b1%b1%e6%b5%b7%e8%8a%8b%e7%b9%a1%e7%90%83%e8%8a%b1%e5%a4%a2%e5%b9%bb%e8%b7%af/#respond Tue, 02 Jun 2026 12:32:06 +0000 https://galvoxstar.com/?p=888 台北3天2夜花季攻略|陽明山海芋+繡球花夢幻路線

每年4-5月就係台北最夢幻嘅時節!陽明山竹子湖海芋季同埋繡球花季接連登場,滿山白色同粉紅色花海,打卡影相真係靚到唔捨得走!

如果只有3日時間,建議咁玩:第1日集中行陽明山,上晝去竹子湖海芋田親手摘海芋,下晝轉去繡球花園影相,夜晚返到北投泡溫泉解疲勞。第2日轉戰淡水,黃昏去淡水老街食海鮮睇日落,入夜後可以搭渡輪去漁人碼頭影夜景。第3日就去大稻埕迪化街,呢一帶有好多文青cafe同埋老字號餅舖,行街購物一流。

陽明山除咗海芋同繡球花,仲有擎天崗大草原可以野餐,或者行小油坑睇火山地貌,鍾意行山嘅朋友一定啱。返到山下可以順路去象山,黃昏時分望住整個台北101日落,打卡超靚。

🏆 路線重點:
• 陽明山竹子湖 — 海芋+繡球花季(4-5月限定)
• 北投溫泉 — 賞花後泡溫泉,治癒疲勞
• 淡水老街/漁人碼頭 — 黃昏日落+夜景
• 大稻埕迪化街 — 文青cafe+老字號餅舖
• 象山 — 101日落打卡

💡 小貼士:海芋季記得帶剪刀同手套,親手摘嘅海芋可以帶返屋企!陽明山週末交通擠塞,建議搭公車或者uber上山。

💬 留言睇詳情/連結
📌 圖片及資料屬參考性質,價格以實時查詢為準

🏷 #台北旅行 #陽明山 #竹子湖 #繡球花 #海芋季 #台北自由行 #台北打卡 #淡水老街 #北投溫泉 #台灣旅遊

📱 原文:Facebook 帖文 | 由 請假去旅行 Travel Hacker hk 自動匯入

]]>
https://galvoxstar.com/%f0%9f%8c%b8-%e5%8f%b0%e5%8c%973%e5%a4%a92%e5%a4%9c%e8%8a%b1%e5%ad%a3%e6%94%bb%e7%95%a5%ef%bd%9c%e9%99%bd%e6%98%8e%e5%b1%b1%e6%b5%b7%e8%8a%8b%e7%b9%a1%e7%90%83%e8%8a%b1%e5%a4%a2%e5%b9%bb%e8%b7%af/feed/ 0
免費入場就能打卡百年日式建築🇯🇵 https://galvoxstar.com/%e5%85%8d%e8%b2%bb%e5%85%a5%e5%a0%b4%e5%b0%b1%e8%83%bd%e6%89%93%e5%8d%a1%e7%99%be%e5%b9%b4%e6%97%a5%e5%bc%8f%e5%bb%ba%e7%af%89%f0%9f%87%af%f0%9f%87%b5/ https://galvoxstar.com/%e5%85%8d%e8%b2%bb%e5%85%a5%e5%a0%b4%e5%b0%b1%e8%83%bd%e6%89%93%e5%8d%a1%e7%99%be%e5%b9%b4%e6%97%a5%e5%bc%8f%e5%bb%ba%e7%af%89%f0%9f%87%af%f0%9f%87%b5/#respond Tue, 02 Jun 2026 03:33:08 +0000 https://galvoxstar.com/?p=906

北投溫泉博物館保留咗完整嘅日式浴場風格,木造結構同懷舊氛圍一秒穿越到昭和年代♨ 唔使門票免費參觀,仲有導賞介紹北投溫泉文化嘅歷史演變,港人周末快閃台北值得留返半日嚟打卡!

從相片見到陽光穿透窗框映照喺浴池上,光影效果非常適合影相📸 博物館分唔同展區介紹溫泉形成、北投石發現過程,歴史價值同打卡指數同時拉滿!

下次去台北唔好只係食夜市,住多晚體驗一下北投嘅慢活節奏,順道走訪呢個隱藏打卡位啦~

💬 留言睇打卡攻略 + 交通路線

📌 圖片及資料屬參考性質,價格以實時查詢為準

#北投溫泉 #台北打卡 #免費景點 #台灣旅行 #溫泉博物館 #港人去台北 #短途旅行

📱 原文:Facebook 帖文 | 由 請假去旅行 Travel Hacker hk 自動匯入

]]>
https://galvoxstar.com/%e5%85%8d%e8%b2%bb%e5%85%a5%e5%a0%b4%e5%b0%b1%e8%83%bd%e6%89%93%e5%8d%a1%e7%99%be%e5%b9%b4%e6%97%a5%e5%bc%8f%e5%bb%ba%e7%af%89%f0%9f%87%af%f0%9f%87%b5/feed/ 0
6月限定——陽明山竹子湖嘅繡球花已經開到見唔到路。 https://galvoxstar.com/6%e6%9c%88%e9%99%90%e5%ae%9a-%e9%99%bd%e6%98%8e%e5%b1%b1%e7%ab%b9%e5%ad%90%e6%b9%96%e5%98%85%e7%b9%a1%e7%90%83%e8%8a%b1%e5%b7%b2%e7%b6%93%e9%96%8b%e5%88%b0%e8%a6%8b%e5%94%94%e5%88%b0/ https://galvoxstar.com/6%e6%9c%88%e9%99%90%e5%ae%9a-%e9%99%bd%e6%98%8e%e5%b1%b1%e7%ab%b9%e5%ad%90%e6%b9%96%e5%98%85%e7%b9%a1%e7%90%83%e8%8a%b1%e5%b7%b2%e7%b6%93%e9%96%8b%e5%88%b0%e8%a6%8b%e5%94%94%e5%88%b0/#respond Tue, 02 Jun 2026 03:24:33 +0000 https://galvoxstar.com/?p=908
從相片見到,成片藍紫色花海蔓延到山坡上,配埋後面隱約見到嘅山巒,係初夏台北最夢幻嘅畫面。唔怪得之年年都刷爆IG——呢個景色,係無得執片㗎。

竹子湖有幾個花田開放時間略有差異,海芋就已經慢慢退場,但係繡球花正係高峰期。白、紫、藍、粉紅色都有,襯埋背景嘅山霧,隨手影都係明信片。

建議平日去或者一早去,人少啲之外,光線亦比較柔和。帶埋遮同蚊怕水,穿對好行嘅鞋——花田路濕滑。

陽明山天氣變化快,出發前留意一下天氣預報。

💬 留言睇打卡路線 + 交通攻略

📌 圖片及資料屬參考性質,價格以實時查詢為準

#繡球花 #陽明山 #竹子湖 #台北打卡 #6月限定 #花海 #台灣旅行 #短途旅行

📱 原文:Facebook 帖文 | 由 請假去旅行 Travel Hacker hk 自動匯入

]]>
https://galvoxstar.com/6%e6%9c%88%e9%99%90%e5%ae%9a-%e9%99%bd%e6%98%8e%e5%b1%b1%e7%ab%b9%e5%ad%90%e6%b9%96%e5%98%85%e7%b9%a1%e7%90%83%e8%8a%b1%e5%b7%b2%e7%b6%93%e9%96%8b%e5%88%b0%e8%a6%8b%e5%94%94%e5%88%b0/feed/ 0
20+檔人情小攤,10分鐘行完——寧夏夜市係台北最小嘅夜市,亦係最warm嘅一碗。 https://galvoxstar.com/20%e6%aa%94%e4%ba%ba%e6%83%85%e5%b0%8f%e6%94%a4%ef%bc%8c10%e5%88%86%e9%90%98%e8%a1%8c%e5%ae%8c-%e5%af%a7%e5%a4%8f%e5%a4%9c%e5%b8%82%e4%bf%82%e5%8f%b0%e5%8c%97%e6%9c%80%e5%b0%8f/ https://galvoxstar.com/20%e6%aa%94%e4%ba%ba%e6%83%85%e5%b0%8f%e6%94%a4%ef%bc%8c10%e5%88%86%e9%90%98%e8%a1%8c%e5%ae%8c-%e5%af%a7%e5%a4%8f%e5%a4%9c%e5%b8%82%e4%bf%82%e5%8f%b0%e5%8c%97%e6%9c%80%e5%b0%8f/#respond Tue, 02 Jun 2026 03:24:13 +0000 https://galvoxstar.com/?p=910
從相片見到,攤檔老闆嘅笑容同埋叫賣聲,係呢個夜市最靚嘅風景。唔似得士林夜市咁遊客化,寧夏夜市依然保留住一股鄰里人情味——牛腩飯、蚵仔煎、雞蛋仔,全部都係幾十年歷史嘅老味道。

必試嘅係圓環邊嘅幾檔:藥燉排骨、臭豆腐、仲有相片入面見到嘅蒜泥蝦,係港人每次去台北都會心念念嘅味道。

夜市唔長,但係每一檔都有故仔。下次去台北,唔好淨係掛住掃貨,留個晚上去行下,感受下台灣夜市最地道嘅人情味。

💬 留言睇詳情 + 夜市攻略連結

📌 圖片及資料屬參考性質,價格以實時查詢為準

#台北夜市 #寧夏夜市 #台灣美食 #台北攻略 #港人去台北 #夜市小食 #台灣旅行 #短途旅行

📱 原文:Facebook 帖文 | 由 請假去旅行 Travel Hacker hk 自動匯入

]]>
https://galvoxstar.com/20%e6%aa%94%e4%ba%ba%e6%83%85%e5%b0%8f%e6%94%a4%ef%bc%8c10%e5%88%86%e9%90%98%e8%a1%8c%e5%ae%8c-%e5%af%a7%e5%a4%8f%e5%a4%9c%e5%b8%82%e4%bf%82%e5%8f%b0%e5%8c%97%e6%9c%80%e5%b0%8f/feed/ 0
## ✈️ GBA 6月開賣:台北 1 小時 45 分直踩! https://galvoxstar.com/%e2%9c%88%ef%b8%8f-gba-6%e6%9c%88%e9%96%8b%e8%b3%a3%ef%bc%9a%e5%8f%b0%e5%8c%97-1-%e5%b0%8f%e6%99%82-45-%e5%88%86%e7%9b%b4%e8%b8%a9%ef%bc%81/ https://galvoxstar.com/%e2%9c%88%ef%b8%8f-gba-6%e6%9c%88%e9%96%8b%e8%b3%a3%ef%bc%9a%e5%8f%b0%e5%8c%97-1-%e5%b0%8f%e6%99%82-45-%e5%88%86%e7%9b%b4%e8%b8%a9%ef%bc%81/#respond Mon, 01 Jun 2026 09:03:07 +0000 https://galvoxstar.com/?p=928 GBA 6月開賣:台北 1 小時 45 分直踩!

想 6 月隨時出走台北?**GBA 台北航線**幫到你!

– **原價 $760 → 入手價 $722**(新會員 5% Coupon 自動套用)
– **全月 27 日有位**,其中 19 日可享 $722 最平入手價
– 6 月 **19 個最平日子**:6/3、6/5、6/8–6/10、6/12–6/15、6/19–6/26、6/28–6/29
– 僅 3 日無位:6/4、6/11、6/17

西門町、九份、士林夜市、台北 101、淡水夕陽,6 月端午過後最抵。



## 💳 3 步入手

1. **去 GBA 官網開新會員**(5% Coupon 自動派)
2. **揀 6 月最平日子** + 航班(參考航班 HB702,實際班次以 GBA 官網為準)
3. **付款頁自動套用** 5% Coupon,**$722 落袋**



## 💡 仲有其他 GBA 優惠

🎓 學生 8 折
👴 長者 88 折
💰 Manulife MPF 客戶 $50 off



#GBA新會員優惠 #香港直航台北 #HB702 #台北自由行 #西門町 #九份山城 #士林夜市 #台北101 #台灣夜市 #台北捷運

📱 原文:Facebook 帖文 | 由 請假去旅行 Travel Hacker hk 自動匯入

]]>
https://galvoxstar.com/%e2%9c%88%ef%b8%8f-gba-6%e6%9c%88%e9%96%8b%e8%b3%a3%ef%bc%9a%e5%8f%b0%e5%8c%97-1-%e5%b0%8f%e6%99%82-45-%e5%88%86%e7%9b%b4%e8%b8%a9%ef%bc%81/feed/ 0
## 🔥 Hook 段 https://galvoxstar.com/%f0%9f%94%a5-hook-%e6%ae%b5/ https://galvoxstar.com/%f0%9f%94%a5-hook-%e6%ae%b5/#respond Mon, 01 Jun 2026 08:15:12 +0000 https://galvoxstar.com/?p=933

📚 相關推薦

]]>
https://galvoxstar.com/%f0%9f%94%a5-hook-%e6%ae%b5/feed/ 0
# 香港飛台北 6 月最平 $799,原來週三嗰日 book 平 $12 https://galvoxstar.com/%e9%a6%99%e6%b8%af%e9%a3%9b%e5%8f%b0%e5%8c%97-6-%e6%9c%88%e6%9c%80%e5%b9%b3-799%ef%bc%8c%e5%8e%9f%e4%be%86%e9%80%b1%e4%b8%89%e5%97%b0%e6%97%a5-book-%e5%b9%b3-12/ https://galvoxstar.com/%e9%a6%99%e6%b8%af%e9%a3%9b%e5%8f%b0%e5%8c%97-6-%e6%9c%88%e6%9c%80%e5%b9%b3-799%ef%bc%8c%e5%8e%9f%e4%be%86%e9%80%b1%e4%b8%89%e5%97%b0%e6%97%a5-book-%e5%b9%b3-12/#respond Sun, 31 May 2026 10:49:06 +0000 https://galvoxstar.com/?p=945

📚 相關推薦

]]>
https://galvoxstar.com/%e9%a6%99%e6%b8%af%e9%a3%9b%e5%8f%b0%e5%8c%97-6-%e6%9c%88%e6%9c%80%e5%b9%b3-799%ef%bc%8c%e5%8e%9f%e4%be%86%e9%80%b1%e4%b8%89%e5%97%b0%e6%97%a5-book-%e5%b9%b3-12/feed/ 0
# 鼓浪嶼 2 日 1 夜|行到邊食到邊!廈門出發 HK$6 船飛即刻走📍 https://galvoxstar.com/%e9%bc%93%e6%b5%aa%e5%b6%bc-2-%e6%97%a5-1-%e5%a4%9c%ef%bd%9c%e8%a1%8c%e5%88%b0%e9%82%8a%e9%a3%9f%e5%88%b0%e9%82%8a%ef%bc%81%e5%bb%88%e9%96%80%e5%87%ba%e7%99%bc-hk6-%e8%88%b9%e9%a3%9b%e5%8d%b3/ https://galvoxstar.com/%e9%bc%93%e6%b5%aa%e5%b6%bc-2-%e6%97%a5-1-%e5%a4%9c%ef%bd%9c%e8%a1%8c%e5%88%b0%e9%82%8a%e9%a3%9f%e5%88%b0%e9%82%8a%ef%bc%81%e5%bb%88%e9%96%80%e5%87%ba%e7%99%bc-hk6-%e8%88%b9%e9%a3%9b%e5%8d%b3/#respond Sun, 31 May 2026 09:00:42 +0000 https://galvoxstar.com/?p=971

📚 相關推薦

]]>
https://galvoxstar.com/%e9%bc%93%e6%b5%aa%e5%b6%bc-2-%e6%97%a5-1-%e5%a4%9c%ef%bd%9c%e8%a1%8c%e5%88%b0%e9%82%8a%e9%a3%9f%e5%88%b0%e9%82%8a%ef%bc%81%e5%bb%88%e9%96%80%e5%87%ba%e7%99%bc-hk6-%e8%88%b9%e9%a3%9b%e5%8d%b3/feed/ 0