{"id":23,"date":"2025-09-26T12:01:41","date_gmt":"2025-09-26T12:01:41","guid":{"rendered":"https:\/\/soraisall.com\/?page_id=23"},"modified":"2025-09-26T12:34:34","modified_gmt":"2025-09-26T12:34:34","slug":"23-2","status":"publish","type":"page","link":"https:\/\/soraisall.com\/index.php\/23-2\/","title":{"rendered":"\u4e0a\u4e2d\u6807\u8bb0"},"content":{"rendered":"\n<!-- Community Spots \u2014 Submit + Map + REST Loader (v2.2, optimized) -->\n\n<!-- Leaflet CSS\uff08CDN\uff09-->\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" integrity=\"sha256-p4NxAoJBhIIN+hmNHrzRCf9tD\/miZyoHS5obTRR9BMY=\" crossorigin=\"anonymous\" \/>\n\n<style>\n  :root {\n    --brand:#0D6EFD;\n    --chip:#f1f3f5;\n    --chip-active:#e7f1ff;\n    --text:#1f2937;\n    --muted:#6b7280;\n    --card:#ffffff;\n    --border:#e5e7eb;\n    --danger:#DC2626;\n    --success:#059669;\n  }\n  body { margin:0; font:15px\/1.6 -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial; color:var(--text); }\n  .wrap { max-width:1080px; margin:24px auto; padding:0 16px; }\n\n  \/* \u63d0\u4ea4\u5361\u7247 *\/\n  .submit-card{ background:#fff; border:1px solid var(--border); border-radius:14px; padding:16px;\n    box-shadow:0 4px 18px rgba(0,0,0,.05); margin-bottom:14px; }\n  .submit-title{ font-weight:700; margin-bottom:6px }\n  .submit-grid{ display:grid; grid-template-columns:1fr 1fr; gap:12px }\n  .submit-grid .full{ grid-column:1\/-1 }\n  .submit-grid label{ display:block; font-size:12px; color:#6b7280; margin-bottom:4px }\n  .submit-grid input[type=\"text\"], .submit-grid textarea, .submit-grid input[type=\"file\"]{\n    width:100%; padding:10px; border:1px solid var(--border); border-radius:10px; font-size:14px\n  }\n  .submit-actions{ display:flex; gap:10px; align-items:center; margin-top:8px }\n  .btn{ appearance:none; border:0; border-radius:999px; padding:10px 14px; cursor:pointer; background:var(--brand); color:#fff; font-weight:600 }\n  .note{ font-size:12px; color:#64748b }\n  .ok{ color:var(--success) } .err{ color:var(--danger) }\n  @media (max-width:640px){ .submit-grid{ grid-template-columns:1fr } }\n\n  \/* \u5934\u90e8\/\u7b5b\u9009\/\u5730\u56fe *\/\n  .header { display:grid; gap:8px; margin:16px 0 12px; }\n  .title { font-size:22px; font-weight:700; }\n  .desc { color:var(--muted); font-size:14px; }\n  .chips { display:flex; flex-wrap:wrap; gap:8px; margin:12px 0 14px; }\n  .chip { padding:6px 10px; border-radius:999px; background:var(--chip); border:1px solid var(--border); cursor:pointer; font-size:13px; user-select:none; }\n  .chip.active { background:var(--chip-active); border-color:#b6d4fe; color:#0a58ca; }\n\n  #map { height:62vh; min-height:460px; width:100%;\n    border-radius:14px; background:#ddd; box-shadow:0 4px 20px rgba(0,0,0,.06); border:1px solid var(--border); position:relative; }\n  .popup { min-width:220px; }\n  .popup h3 { font-size:16px; margin:0 0 6px; line-height:1.3; }\n  .meta { font-size:12px; color:var(--muted); margin-bottom:6px; }\n  .tags { display:flex; flex-wrap:wrap; gap:6px; margin:8px 0; }\n  .tag { font-size:11px; padding:3px 8px; border-radius:999px; background:#eef2ff; color:#3730a3; }\n  .actions a { font-size:12px; margin-right:8px; text-decoration:none; color:var(--brand); }\n  .actions a:hover { text-decoration:underline; }\n\n  \/* \u52a0\u8f7d\u906e\u7f69 *\/\n  .map-mask{\n    position:absolute; inset:0; display:flex; align-items:center; justify-content:center;\n    background:linear-gradient(180deg, rgba(255,255,255,.72), rgba(255,255,255,.4));\n    border-radius:14px; pointer-events:none; opacity:0; transition:.2s ease;\n  }\n  .map-mask.show{ opacity:1; }\n  .spinner{ width:32px; height:32px; border-radius:50%; border:3px solid #cbd5e1; border-top-color:#334155; animation:spin 1s linear infinite; }\n  @keyframes spin{ to { transform: rotate(360deg); } }\n\n  @media (max-width:640px){ #map{ height:58vh; min-height:360px; } }\n<\/style>\n\n<div class=\"wrap\">\n  <!-- \u524d\u7aef\u6295\u7a3f\u8868\u5355 -->\n  <div class=\"submit-card\" id=\"spot-submit-card\">\n    <div class=\"submit-title\">\u63d0\u4ea4\u4f60\u7684\u70b9\u4f4d<\/div>\n    <div class=\"note\">\u5728\u4e0b\u65b9\u5730\u56fe\u4e0a<strong>\u70b9\u51fb\u4e00\u6b21<\/strong>\u9009\u62e9\u5750\u6807 \u2192 \u586b\u5199\u4fe1\u606f \u2192 \u63d0\u4ea4\uff08\u56fe\u7247 \u2264 3MB\uff09<\/div>\n    <form id=\"spot-form\" enctype=\"multipart\/form-data\">\n      <div class=\"submit-grid\">\n        <div>\n          <label>\u6807\u9898\uff08\u5730\u70b9\u540d\uff09*<\/label>\n          <input type=\"text\" name=\"title\" required placeholder=\"\u4f8b\u5982\uff1a\u843d\u65e5\u89c2\u666f\u53f0 3\u53f7\u4f4d\">\n        <\/div>\n        <div>\n          <label>\u6700\u4f73\u65f6\u95f4<\/label>\n          <input type=\"text\" name=\"best_time\" placeholder=\"\u4f8b\u5982\uff1a18:10\u201318:40\">\n        <\/div>\n        <div class=\"full\">\n          <label>\u7b80\u8981\u63cf\u8ff0<\/label>\n          <textarea name=\"desc\" rows=\"3\" placeholder=\"\u4f8b\u5982\uff1a\u89c6\u91ce\u5f00\u9614\uff0c\u5e26\u4e09\u811a\u67b6\u66f4\u7a33\u3002\"><\/textarea>\n        <\/div>\n        <div>\n          <label>\u6807\u7b7e\uff08\u9017\u53f7\u5206\u9694\uff09<\/label>\n          <input type=\"text\" name=\"tags\" placeholder=\"\u4f8b\u5982\uff1a\u843d\u65e5,\u62cd\u7167,\u5b89\u9759\">\n        <\/div>\n        <div>\n          <label>\u4e0a\u4f20\u56fe\u7247\uff08\u53ef\u9009\uff09<\/label>\n          <input type=\"file\" name=\"image\" accept=\".jpg,.jpeg,.png,.webp\">\n        <\/div>\n        <div>\n          <label>\u7eac\u5ea6\uff08\u81ea\u52a8\u56de\u586b\uff09*<\/label>\n          <input type=\"text\" name=\"lat\" id=\"lat\" required readonly placeholder=\"\u70b9\u51fb\u5730\u56fe\u83b7\u53d6\">\n        <\/div>\n        <div>\n          <label>\u7ecf\u5ea6\uff08\u81ea\u52a8\u56de\u586b\uff09*<\/label>\n          <input type=\"text\" name=\"lng\" id=\"lng\" required readonly placeholder=\"\u70b9\u51fb\u5730\u56fe\u83b7\u53d6\">\n        <\/div>\n      <\/div>\n      <div class=\"submit-actions\">\n        <button class=\"btn\" type=\"submit\">\u63d0\u4ea4\u70b9\u4f4d<\/button>\n        <div id=\"submit-msg\" class=\"note\"><\/div>\n      <\/div>\n      <input type=\"hidden\" name=\"action\" value=\"submit_spot\">\n      <input type=\"hidden\" name=\"nonce\" value=\"\">\n    <\/form>\n  <\/div>\n\n  <!-- \u6807\u9898 + \u7b5b\u9009 + \u5730\u56fe -->\n  <header class=\"header\">\n    <div class=\"title\">\u793e\u533a\u7f8e\u666f\u5730\u56fe<\/div>\n    <div class=\"desc\">\u6807\u6ce8\u201c\u843d\u65e5\u6700\u7f8e\u201d\u201c\u4eb2\u5b50\u53cb\u597d\u201d\u201c\u591c\u666f\u62cd\u7167\u4f4d\u201d\u7b49\u70b9\u4f4d\uff0c\u652f\u6301\u6807\u7b7e\u7b5b\u9009\u4e0e\u4e00\u952e\u5bfc\u822a\u3002<\/div>\n\n    <div id=\"chips\" class=\"chips\">\n      <div class=\"chip active\" data-tag=\"all\">\u5168\u90e8<\/div>\n      <div class=\"chip\" data-tag=\"\u843d\u65e5\">\u843d\u65e5<\/div>\n      <div class=\"chip\" data-tag=\"\u4eb2\u5b50\">\u4eb2\u5b50<\/div>\n      <div class=\"chip\" data-tag=\"\u591c\u666f\">\u591c\u666f<\/div>\n      <div class=\"chip\" data-tag=\"\u5b89\u9759\">\u5b89\u9759<\/div>\n      <div class=\"chip\" data-tag=\"\u62cd\u7167\">\u62cd\u7167<\/div>\n    <\/div>\n  <\/header>\n\n  <div id=\"map\" aria-label=\"\u793e\u533a\u5730\u56fe\">\n    <div class=\"map-mask\" id=\"map-mask\"><div class=\"spinner\" aria-label=\"\u52a0\u8f7d\u4e2d\"><\/div><\/div>\n  <\/div>\n<\/div>\n\n<!-- Leaflet JS\uff08CDN\uff09-->\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\" integrity=\"sha256-20nQCchB9co0qIjJZRGuk2\/Z9VM+kNiyxNV1lvTlZBo=\" crossorigin=\"anonymous\"><\/script>\n\n<script>\n\/* ========== \u5de5\u5177\uff1a\u52a0\u8f7d\u906e\u7f69 ========== *\/\nconst maskEl = document.getElementById('map-mask');\nconst showMask = () => maskEl?.classList.add('show');\nconst hideMask = () => maskEl?.classList.remove('show');\n\n\/* ========== \u5730\u56fe\u4e0e\u901a\u7528\u65b9\u6cd5 ========== *\/\nconst map = L.map('map', { zoomControl:true, scrollWheelZoom:true });\nL.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n  maxZoom:19,\n  attribution:'&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\" target=\"_blank\" rel=\"noopener\">OpenStreetMap<\/a>'\n}).addTo(map);\n\nconst markers = [];\nconst bounds  = L.latLngBounds();\n\n\/\/ \u8f7b\u91cf\u53bb\u91cd\u952e\uff1atitle@lat,lng\nconst seenKeys = new Set();\nconst makeKey = (spot) => `${(spot.title||'').trim()}@${Number(spot.lat).toFixed(6)},${Number(spot.lng).toFixed(6)}`;\n\n\/\/ \u5f39\u7a97 HTML + \u5bfc\u822a\u94fe\u63a5\nfunction popupHTML(spot){\n  const g  = `https:\/\/www.google.com\/maps?q=${spot.lat},${spot.lng}`;\n  const a  = `https:\/\/uri.amap.com\/marker?position=${spot.lng},${spot.lat}`;\n  const ap = `http:\/\/maps.apple.com\/?ll=${spot.lat},${spot.lng}`;\n  const tags = (spot.tags||[]).map(t=>`<span class=\"tag\">${t}<\/span>`).join(\"\");\n  return `\n    <div class=\"popup\">\n      <h3>${spot.title}<\/h3>\n      <div class=\"meta\">${spot.bestTime ? `\u6700\u4f73\u65f6\u95f4\uff1a${spot.bestTime}` : \"\"}<\/div>\n      ${spot.tips ? `<div class=\"meta\">\u5c0f\u8d34\u58eb\uff1a${spot.tips}<\/div>` : \"\"}\n      ${tags ? `<div class=\"tags\">${tags}<\/div>` : \"\"}\n      <div class=\"actions\">\n        <a href=\"${g}\" target=\"_blank\" rel=\"noopener\">Google \u5bfc\u822a<\/a>\n        <a href=\"${a}\" target=\"_blank\" rel=\"noopener\">\u9ad8\u5fb7\u5bfc\u822a<\/a>\n        <a href=\"${ap}\" target=\"_blank\" rel=\"noopener\">Apple \u5730\u56fe<\/a>\n      <\/div>\n    <\/div>\n  `;\n}\n\nfunction addSpot(spot){\n  if (!spot || typeof spot.lat!=='number' || typeof spot.lng!=='number') return;\n  const key = makeKey(spot);\n  if (seenKeys.has(key)) return; \/\/ \u53bb\u91cd\n  seenKeys.add(key);\n\n  const marker = L.marker([spot.lat, spot.lng]).addTo(map);\n  marker.bindPopup(popupHTML(spot));\n  marker._spot = spot;\n  markers.push(marker);\n  bounds.extend([spot.lat, spot.lng]);\n\n  \/\/ \u82e5\u65b0\u70b9\u5728\u5f53\u524d\u89c6\u91ce\u5916\uff0c\u9002\u5ea6\u6269\u5c55\n  const ll = L.latLng(spot.lat, spot.lng);\n  if (!map.getBounds().pad(0.05).contains(ll)) {\n    const nb = bounds.isValid() ? bounds : L.latLngBounds(ll, ll);\n    map.fitBounds(nb.pad(0.15));\n  }\n}\n\n\/* ========== \u6807\u7b7e\u7b5b\u9009 ========== *\/\nconst chipBar = document.getElementById('chips');\nfunction getActiveTags(){\n  return [...chipBar.querySelectorAll('.chip.active')].map(c=>c.dataset.tag).filter(t=>t && t!=='all');\n}\nfunction applyFilter(){\n  const actives = getActiveTags();\n  const showAll = actives.length === 0;\n  const nb = L.latLngBounds();\n  markers.forEach(m=>{\n    const tags = (m._spot.tags||[]);\n    const match = showAll ? true : actives.every(t=>tags.includes(t));\n    if (match){ if(!map.hasLayer(m)) m.addTo(map); nb.extend(m.getLatLng()); }\n    else { if(map.hasLayer(m)) map.removeLayer(m); }\n  });\n  if (nb.isValid()) map.fitBounds(nb.pad(0.15));\n}\nchipBar.addEventListener('click', e=>{\n  const chip = e.target.closest('.chip'); if(!chip) return;\n  const tag = chip.dataset.tag;\n  if (tag==='all'){\n    chipBar.querySelectorAll('.chip').forEach(c=>c.classList.remove('active'));\n    chip.classList.add('active');\n  } else {\n    chip.classList.toggle('active');\n    const allChip = chipBar.querySelector('.chip[data-tag=\"all\"]');\n    allChip.classList.remove('active');\n    if (getActiveTags().length===0) allChip.classList.add('active');\n  }\n  applyFilter();\n});\n\n\/* ========== \u524d\u7aef\u8868\u5355\uff1a\u70b9\u51fb\u5730\u56fe\u53d6\u5750\u6807 + AJAX \u63d0\u4ea4 ========== *\/\n\/\/ \u6ce8\u5165 nonce\uff08\u4f9d\u8d56 PHP \u7aef wp_localize_script \u6ce8\u5165\u7684 COMMUNITY_SPOTS\uff09\n(function(){\n  try { document.querySelector('#spot-form input[name=\"nonce\"]').value = COMMUNITY_SPOTS.nonce; }\n  catch(e){}\n})();\n\n\/\/ \u70b9\u51fb\u5730\u56fe \u2192 \u56de\u586b\u5750\u6807 + \u9884\u89c8\u6807\u8bb0\nlet previewMarker = null;\nmap.on('click', function(e){\n  const {lat, lng} = e.latlng;\n  document.getElementById('lat').value = lat.toFixed(6);\n  document.getElementById('lng').value = lng.toFixed(6);\n  if (previewMarker) map.removeLayer(previewMarker);\n  previewMarker = L.marker([lat, lng], {opacity:0.7}).addTo(map).bindPopup('\u65b0\u70b9\uff08\u9884\u89c8\uff09').openPopup();\n});\n\n\/\/ \u63d0\u4ea4\nconst formEl = document.getElementById('spot-form');\nconst msgEl  = document.getElementById('submit-msg');\n\nformEl.addEventListener('submit', async function(e){\n  e.preventDefault();\n  msgEl.className = 'note'; msgEl.textContent = '\u63d0\u4ea4\u4e2d\u2026';\n\n  \/\/ \u56fe\u7247\u5927\u5c0f\u4e0e\u7c7b\u578b\u9650\u5236\n  const img = formEl.querySelector('input[name=\"image\"]').files[0];\n  if (img) {\n    const okTypes = ['image\/jpeg','image\/png','image\/webp'];\n    if (!okTypes.includes(img.type)) {\n      msgEl.className='note err'; msgEl.textContent='\u4ec5\u652f\u6301 JPG\/PNG\/WebP \u683c\u5f0f\u3002'; return;\n    }\n    if (img.size > 3*1024*1024){\n      msgEl.className='note err'; msgEl.textContent='\u56fe\u7247\u592a\u5927\uff08>3MB\uff09\uff0c\u8bf7\u538b\u7f29\u540e\u518d\u8bd5\u3002'; return;\n    }\n  }\n  if (!window.COMMUNITY_SPOTS){\n    msgEl.className='note err';\n    msgEl.textContent='\u521d\u59cb\u5316\u5f02\u5e38\uff1a\u672a\u6ce8\u5165 nonce\u3002\u8bf7\u786e\u8ba4\u5df2\u6dfb\u52a0 PHP \u4ee3\u7801\u5e76\u5237\u65b0\u9875\u9762\u3002';\n    return;\n  }\n\n  const fd = new FormData(formEl);\n  try {\n    const res  = await fetch(COMMUNITY_SPOTS.ajax_url, { method:'POST', body:fd });\n    const json = await res.json();\n    if (!json.success) throw new Error(json?.data?.message || '\u63d0\u4ea4\u5931\u8d25');\n\n    \/\/ \u5373\u65f6\u5728\u672c\u9875\u52a0\u5165\u4e00\u679a\u6807\u8bb0\uff08\u4ec5\u5f53\u524d\u8bbf\u5ba2\u53ef\u89c1\uff09\n    const d = json.data;\n    const spot = { title:d.title, lat:d.lat, lng:d.lng, bestTime:d.best_time||'', tips:d.tips||'', tags:d.tags||[] };\n    addSpot(spot);\n    if (previewMarker){ map.removeLayer(previewMarker); previewMarker=null; }\n\n    formEl.reset(); document.getElementById('lat').value=''; document.getElementById('lng').value='';\n    msgEl.className='note ok'; msgEl.textContent='\u63d0\u4ea4\u6210\u529f\uff01\u5df2\u8fdb\u5165\u5f85\u5ba1\u6838\uff0c\u5ba1\u6838\u901a\u8fc7\u540e\u5c06\u5411\u6240\u6709\u8bbf\u5ba2\u516c\u5f00\u663e\u793a\u3002';\n  } catch (err){\n    msgEl.className='note err'; msgEl.textContent='\u63d0\u4ea4\u5931\u8d25\uff1a' + err.message;\n  }\n});\n\n\/* ========== \u7528 REST API \u81ea\u52a8\u52a0\u8f7d\u201c\u5df2\u53d1\u5e03\u201d\u70b9\u4f4d\uff08\u81ea\u52a8\u63a2\u6d4b\u524d\u7f00\uff09 ========== *\/\nconst PER_PAGE   = 100; \/\/ \u6bcf\u9875\u6700\u591a 100 \u6761\nlet   REST_PREFIX = null;\n\nasync function detectRestPrefix(){\n  const origin = window.location.origin;\n  const candidates = [\n    `${origin}\/wp-json`,\n    `${origin}\/index.php\/wp-json`\n  ];\n  for (const base of candidates){\n    try {\n      const res = await fetch(`${base}\/wp\/v2\/types`, { credentials:'same-origin' });\n      if (res.ok) return base;\n    } catch(e){}\n  }\n  throw new Error('\u65e0\u6cd5\u8bbf\u95ee REST API\uff08\/wp-json \u6216 \/index.php\/wp-json \u5747\u4e0d\u53ef\u7528\uff09');\n}\n\nasync function fetchSpotsPage(page=1){\n  if (!REST_PREFIX) REST_PREFIX = await detectRestPrefix();\n  const url = `${REST_PREFIX}\/wp\/v2\/spot?status=publish&per_page=${PER_PAGE}&page=${page}&_fields=id,title,meta`;\n  const res = await fetch(url, { credentials: 'same-origin' });\n  if (!res.ok) {\n    const text = await res.text();\n    console.warn('REST \u9519\u8bef\u54cd\u5e94\uff1a', res.status, text);\n    throw new Error('REST \u8bf7\u6c42\u5931\u8d25\uff1a' + res.status);\n  }\n  const totalPages = parseInt(res.headers.get('X-WP-TotalPages') || '1', 10);\n  const data = await res.json();\n  console.log('REST \u8fd4\u56de\uff1apage', page, 'items', data.length, 'totalPages', totalPages);\n  return { data, totalPages };\n}\n\nfunction normalizeSpot(item){\n  const meta = item.meta || {};\n  const lat  = parseFloat(meta.lat);\n  const lng  = parseFloat(meta.lng);\n  if (Number.isNaN(lat) || Number.isNaN(lng)) return null;\n  return {\n    title: (item.title && item.title.rendered) ? item.title.rendered : '\u672a\u547d\u540d\u5730\u70b9',\n    lat, lng,\n    bestTime: meta.best_time || '',\n    tips: meta.tips || '',\n    tags: Array.isArray(meta.tags) ? meta.tags : []\n  };\n}\n\nasync function loadAllPublishedSpots(){\n  showMask();\n  try {\n    let page = 1, totalPages = 1;\n    let count = 0;\n    do {\n      const { data, totalPages: tp } = await fetchSpotsPage(page);\n      totalPages = tp;\n      data.forEach(item => {\n        const spot = normalizeSpot(item);\n        if (spot) { addSpot(spot); count++; }\n      });\n      page++;\n    } while (page <= totalPages);\n\n    if (count === 0) {\n      \/\/ \u6ca1\u6709\u5df2\u53d1\u5e03\u70b9 \u2192 \u7ed9\u4e2a\u9ed8\u8ba4\u89c6\u89d2\uff08\u4f8b\u5982\u4e0a\u6d77\uff09\n     \/\/ \u9ed8\u8ba4\u89c6\u89d2\u6539\u4e3a\u4e0a\u6d77\u4e2d\u5b66\nmap.setView([31.141972, 121.433243], 18); \/\/ 15 \u662f\u7f29\u653e\u7ea7\u522b\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u6539\u5927\/\u6539\u5c0f\n\n      console.info('REST\uff1a\u6ca1\u6709\u5df2\u53d1\u5e03\u7684 spot\u3002\u5148\u5728\u540e\u53f0\u53d1\u5e03\u4e00\u6761\u8bd5\u8bd5\u3002');\n    } else {\n      \/\/ \u5e94\u7528\u7b5b\u9009\u5e76\u9002\u914d\u89c6\u91ce\n      if (typeof applyFilter === 'function') applyFilter();\n      else if (bounds.isValid()) map.fitBounds(bounds.pad(0.15));\n    }\n  } catch (e){\n    console.warn('\u52a0\u8f7d\u5df2\u53d1\u5e03\u70b9\u5931\u8d25\uff1a', e);\n  } finally {\n    hideMask();\n  }\n}\n\n\/\/ \u9875\u9762\u52a0\u8f7d\u5b8c\u540e\u6267\u884c\ndocument.addEventListener('DOMContentLoaded', loadAllPublishedSpots);\n<\/script>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u63d0\u4ea4\u4f60\u7684\u70b9\u4f4d \u5728\u4e0b\u65b9\u5730\u56fe\u4e0a\u70b9\u51fb\u4e00\u6b21\u9009\u62e9\u5750\u6807 \u2192 \u586b\u5199\u4fe1\u606f \u2192 \u63d0\u4ea4\uff08\u56fe\u7247 \u2264 3MB\uff09 \u6807\u9898\uff08\u5730\u70b9\u540d\uff09* \u6700\u4f73\u65f6\u95f4 \u7b80\u8981\u63cf\u8ff0 \u6807\u7b7e\uff08\u9017\u53f7\u5206\u9694\uff09 \u4e0a\u4f20\u56fe\u7247\uff08\u53ef\u9009\uff09 \u7eac\u5ea6\uff08\u81ea\u52a8\u56de\u586b\uff09* \u7ecf\u5ea6\uff08\u81ea\u52a8\u56de\u586b\uff09* \u63d0\u4ea4\u70b9\u4f4d \u793e\u533a\u7f8e\u666f\u5730\u56fe \u6807\u6ce8\u201c\u843d\u65e5\u6700\u7f8e\u201d\u201c\u4eb2\u5b50\u53cb\u597d\u201d\u201c\u591c\u666f\u62cd\u7167\u4f4d\u201d\u7b49\u70b9\u4f4d\uff0c\u652f\u6301\u6807\u7b7e\u7b5b\u9009\u4e0e\u4e00\u952e\u5bfc\u822a\u3002 \u5168\u90e8 \u843d\u65e5 \u4eb2\u5b50 \u591c\u666f \u5b89\u9759 \u62cd\u7167<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-23","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/pages\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":8,"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/pages\/23\/revisions"}],"predecessor-version":[{"id":37,"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/pages\/23\/revisions\/37"}],"wp:attachment":[{"href":"https:\/\/soraisall.com\/index.php\/wp-json\/wp\/v2\/media?parent=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}