บทเรียน SEO จากการแก้ไขเว็บไซต์ของเราเอง
เราใช้เวลาไม่กี่วันอ่านเว็บไซต์ของเราเองในแบบที่ search engine อ่าน และพบหกเรื่องที่ควรแก้ ทุกหน้าประกาศ FAQ block สองอันพร้อมกัน Google ใช้แสงเรืองๆ ตกแต่งเบื้องหลังเป็น thumbnail ของเรา หน้า template บางชุดติดอันดับกับคำค้นที่ไม่ได้ตอบ และส่วนใหม่ของเว็บไซต์ถูก edge ของเราเองบล็อกบน staging ไม่มีเรื่องไหนรุนแรงมาก แต่ทุกเรื่องกำลังลดทอนการมองเห็นของเราอย่างเงียบๆ
เว็บไซต์ในหนึ่งย่อหน้า
mythex.ai เป็น single-page app ที่เรา prerender ตอน build สคริปต์จะไล่ทุก route เขียนไฟล์ HTML แบบ static สำหรับแต่ละหน้า และแทรก title, description และ structured data ของหน้านั้น (บล็อก JSON-LD ที่บอก search engine ว่าหน้านั้นคืออะไร ดู structured data คืออะไร) สิ่งที่ตามมาส่วนใหญ่อยู่ในขั้นตอน prerender เพราะนั่นคือ HTML ที่ crawler อ่านจริงๆ
1. ทุกหน้าอ้างว่าตัวเองคือหน้า FAQ
อาการ template HTML ของเรามี FAQPage block ใช้ทั่วทั้งเว็บอยู่ใน structured data โดย URL ชี้ไปที่ /faq จากนั้น prerender จะเพิ่ม FAQPage ของแต่ละหน้าทับลงไปอีก ดังนั้นทุกหน้าในเว็บไซต์จึงมีสองอัน และหน้านโยบายความเป็นส่วนตัวของเราก็กำลังบอก Google ว่ามันคือหน้า FAQ
ทำไมถึงสำคัญ Google คาดหวังให้มี FAQPage ไม่เกินหนึ่งอันต่อหน้า อันที่สองซึ่งชี้ไปที่อื่นคือสิ่งที่อาจทำให้ markup ของหน้านั้นถูกลดคุณค่า ไม่ใช่แค่ถูกเพิกเฉย
วิธีแก้ เราลบ block ทั่วทั้งเว็บออกแล้ว FAQ markup ของแต่ละหน้าตอนนี้มาจากที่เดียว รวมถึงหน้า /faq เองที่สร้างจากรายการคำถามทั้งหมด หน้าที่ไม่มี FAQ จะไม่ประกาศอะไรเลย ซึ่งเป็นคำตอบที่ตรงไปตรงมาที่สุด และ prerender จะทำให้ build ล้มเหลวหากหน้าใดมี FAQPage เกินหนึ่งอันอีก กฎที่อยู่แค่ในความจำของใครบางคนจะถูกทำลายในสักวัน แต่กฎที่ build บังคับใช้ไม่มีวันถูกทำลาย
2. Google ใช้รูปผิดแทนเรา
อาการ ในผลการค้นหา thumbnail ของ Mythex คือแสงเรืองที่ค่อยๆ กระพริบอยู่หลังส่วน hero ของหน้าแรก ซึ่งเป็นรูปพื้นหลังตกแต่ง ไม่ใช่การ์ดแชร์ของเรา
ทำไมมันเกิดขึ้น เราไม่เคยบอก Google ว่ารูปไหนแทนหน้าไหน มันจึงเลือกเองจากที่พบ
วิธีแก้ มีสองด้านของปัญหาเดียวกัน:
- บอกว่ารูปไหนเป็นของหน้านั้น หน้าแรกมีโหนด
WebPageที่มีprimaryImageOfPageชี้ไปที่การ์ดแชร์ และ structured data ของทุกหน้าที่ prerender มีรูปของตัวเอง (รูปแชร์ของหน้านั้น หรือรูปเริ่มต้น) - ซ่อนส่วนตกแต่ง รูปพื้นหลังถูกห้ามใน
robots.txtและส่งมาพร้อม headernoindex, noimageindexจึงไม่ไปปรากฏในการค้นหารูปภาพหรือ thumbnail
3. Search engine รู้จักเราแค่จากโลโก้
markup Organization ของเรามีชื่อ โลโก้ และลิงก์โซเชียลบางอย่าง เป็นแค่การสร้างแบรนด์ ไม่มีอย่างอื่น Search engine สร้าง knowledge panel ของบริษัทจากข้อมูลแบบทะเบียน ดังนั้นเราจึงเพิ่มข้อมูลจากใบอนุญาตการค้าของเรา: ชื่อตามกฎหมาย วันที่ก่อตั้ง ผู้ก่อตั้ง และที่อยู่จดทะเบียน เราตั้งใจไม่ใส่หมายเลขโทรศัพท์
4. หน้า template ตอบคำถามผิด
อาการ Search Console แสดงว่าหน้า template สามหน้าได้รับ impression แต่ไม่มีการคลิก หน้าหนึ่งติดอันดับกับ "content strategist portfolio" และรูปแบบอื่นของคำนี้ อีกหน้าหนึ่งกับ "best italian restaurant website design" และอีกหน้ากับกลุ่มคำรอบ "agile board" ซึ่งครึ่งหนึ่งของคำค้นเหล่านั้นมีคำว่า "free" ตำแหน่งอยู่ระหว่างกลางถึงช่วง 50
ทำไม แต่ละหน้าตอบคำถามที่ต่างจากคำถามที่ถูกถาม คนที่อยากเห็นว่าการออกแบบร้านอาหารอิตาเลียนที่ดีหน้าตาเป็นอย่างไร กลับเข้ามาเจอหน้าที่ขายเครื่องมือสร้างเว็บให้เขา
วิธีแก้ แต่ละหน้าทั้งสามมีส่วนใหม่ที่เขียนเพื่อคำค้น ไม่ใช่เพื่อผลิตภัณฑ์ มี title และ description ที่ใช้คำที่คนพิมพ์จริงๆ และมี FAQ ที่คุ้มค่ากับ markup ที่มันเคยส่งออกมาอยู่แล้ว
commit เดียวกันยังแก้ปัญหาที่เงียบกว่า บล็อก "related templates" เคยหยิบ template สี่อันแรกในหมวด ดังนั้น template พอร์ตโฟลิโอทุกอันจึงชี้ไปที่พอร์ตโฟลิโอสี่อันเดิม และส่วนที่เหลือของหมวดนั้นไม่มีลิงก์ภายในเลย เราแทนที่ด้วยวงแหวนที่เรียงตามหมวดย่อย ทุกหน้า template ตอนนี้มีลิงก์เข้าและออกพอดีหน้าละสี่ลิงก์ และ HTML ที่ prerender ก็พิมพ์ลิงก์เหล่านั้นออกมาแล้ว ก่อนหน้านี้ลิงก์มีอยู่ก็ต่อเมื่อ JavaScript ทำงานแล้ว ซึ่ง crawler อาจไม่มีวันทำ
5. บอก Bing เกี่ยวกับหน้าใหม่ทันทีที่ deploy
Google ไม่สนใจ IndexNow ซึ่งเป็นโปรโตคอลสำหรับแจ้ง search engine เมื่อ URL เปลี่ยน Bing, Yandex และ Seznam ใช้มัน และดัชนีของ Bing คือสิ่งที่ ChatGPT search อ่าน แอปสร้างเว็บด้วย AI ที่ผู้ช่วย AI หาไม่เจอจึงเป็นความล้มเหลวอีกแบบหนึ่ง
วิธีที่ชัดเจนคือส่ง sitemap ทั้งหมดทุกครั้งที่ deploy แต่นั่นคือวิธีที่ key จะถูกจำกัดอัตรา และ deploy ส่วนใหญ่ไม่ได้เปลี่ยนอะไรที่ search engine สนใจ ดังนั้นสคริปต์จึงเปรียบเทียบ sitemap ที่เว็บไซต์เสิร์ฟอยู่ตอนนี้กับ sitemap ที่เพิ่ง build แล้วส่งเฉพาะส่วนต่าง
รายละเอียดสองอย่างทำให้มันใช้งานได้:
- Snapshot ก่อน deploy baseline ต้องถูกเก็บก่อนที่ build ใหม่จะขึ้นระบบ หลังจากนั้น sitemap "ที่ใช้งานอยู่" ก็คือตัวใหม่แล้ว และ diff ทุกครั้งจะว่างเปล่า
- เฉพาะหน้าใหม่ ณ ตอนนี้ sitemap ของเราไม่มีวันที่
lastmodสคริปต์จึงแจ้งหน้าใหม่แต่ไม่แจ้งการเขียนทับ การประทับวันที่ build ลงทุก URL จะทำให้ทั้งเว็บถูกมองว่าเปลี่ยนทุกครั้งที่ deploy ซึ่งเป็นสแปมแบบที่เรากำลังหลีกเลี่ยงอยู่พอดี
มันทำงานเฉพาะตอน deploy ของ production และจะไม่ทำให้ build ล้มเหลว เมื่อถึงตอนที่มันทำงาน เว็บไซต์ก็ขึ้นระบบแล้ว และการแจ้ง search engine ไม่คุ้มที่จะทำให้ deploy เป็นสีแดง
6. Edge ของเราเองบอกว่า "ไม่พบ"
ตอนเราเปิดตัวหน้า /ai (ดูเพิ่มเติมใน หน้า landing สำหรับทุกประเภทธุรกิจ) staging แสดง "Not found" กับทุกหน้า ในขณะที่ static host เสิร์ฟได้ตามปกติ
บริการที่อยู่หน้าโดเมนการตลาดของเราส่งต่อเฉพาะเส้นทางที่อยู่ใน allowlist ส่วนอื่นจะได้ 404 ทันที /ai เป็นของใหม่และไม่อยู่ใน list เราจึงเพิ่ม /ai และ /ai/* พร้อม test ที่ยืนยันว่าผ่าน เป็นบั๊กเล็กๆ แต่เป็นแบบที่ทำให้ส่วนใหม่ของเว็บไซต์มองไม่เห็นสำหรับ crawler โดยไม่มีใครสังเกตเห็น
สิ่งที่เราเรียนรู้
- อ่าน HTML ที่ crawler อ่าน ส่วนใหญ่ของปัญหาเหล่านี้มองไม่เห็นในเบราว์เซอร์ และชัดเจนในไฟล์ที่ prerender แล้ว
- เปลี่ยนกฎ SEO ให้เป็นการตรวจสอบตอน build "FAQPage หนึ่งอันต่อหน้า" ตอนนี้ถูกบังคับใช้ ไม่ใช่แค่จำไว้
- บอก search engine ว่าคุณหมายถึงอะไร ถ้าคุณไม่บอกว่ารูปหรือข้อมูลไหนแทนคุณ มันจะเดาเอง
- Search Console บอกว่าคนถามคำถามอะไร impression ที่ไม่มีการคลิกมักหมายความว่าหน้านั้นตอบคำถามอื่น
- ส่งส่วนต่าง ไม่ใช่ทุกอย่าง การแจ้งเฉพาะสิ่งที่เปลี่ยนช่วยให้คุณอยู่ภายใต้ขีดจำกัดอัตราได้
หากคุณกำลังทำแบบเดียวกันกับเว็บไซต์ที่คุณสร้าง คู่มือของเรื่อง SEO สำหรับเว็บไซต์ที่สร้างด้วย AI และ การตั้งค่า Google Search Console ครอบคลุมพื้นฐานไว้แล้ว