บทความ

โครงสร้างโค้ดที่ทำให้ Google เข้าใจว่าเว็บนี้พูดเรื่องอะไร

SEO ที่เราทำกับเว็บนี้แทบไม่มีเรื่องคีย์เวิร์ดเลยครับ เกือบทั้งหมดคือการตัดสินใจตอนเขียนโค้ด ว่าจะบอกอะไรกับเครื่องที่มาอ่าน และจะไม่บอกอะไร

เผยแพร่

ไดอะแกรมกล่อง Article ชี้ไปยังกล่อง Person ด้วยลูกศรที่กำกับว่า @id วางบนภาพตู้บัตรรายการของห้องสมุด

สมมติว่ามีคนหนึ่งกำลังหาบริษัทรับทำระบบให้โรงงาน เขาพิมพ์คำถามลงไปในช่องค้นหา หรือไม่ก็ถามผู้ช่วย AI สักตัวหนึ่ง

สิ่งที่ตัดสินว่าเว็บของเราจะโผล่ไปอยู่ในคำตอบนั้นมั้ย ไม่ได้เริ่มจากตอนที่เขาพิมพ์ครับ แต่เริ่มตั้งแต่วันที่เราเขียนโค้ดหน้านั้นเสร็จ แล้วเลือกว่าจะบอกอะไรกับเครื่องที่เข้ามาอ่าน

บทความนี้เล่าว่าเว็บนี้บอกอะไรไว้บ้าง และที่สำคัญกว่านั้นคือ ตั้งใจไม่บอกอะไรบ้าง เราไม่ได้คิดว่าตัวเองเก่งกว่าใครนะครับ เราแค่คิดเยอะกับมันหน่อยเท่านั้นเอง

เรื่องนี้ไม่ค่อยเกี่ยวกับคีย์เวิร์ดเท่าไร

พอพูดถึง SEO คนมักนึกถึงการเลือกคำ ความถี่ของคำ แล้วก็ความยาวบทความ

แต่สิ่งที่ตัดสินก่อนหน้านั้นทั้งหมดคือ เครื่องที่เข้ามาอ่านเข้าใจมั้ยว่าหน้านี้คืออะไร หน้านี้กับอีกหน้าเป็นหน้าเดียวกันคนละภาษาหรือเป็นคนละหน้า ใครเป็นคนเขียนบทความนี้ ตำแหน่งงานนี้ประกาศเมื่อไรและให้เงินเดือนเท่าไร

คำตอบพวกนี้ไม่ได้อยู่ในเนื้อหาที่คนอ่านเห็นครับ มันอยู่ในโครงสร้างของหน้า ซึ่งเป็นงานของคนเขียนโค้ด ไม่ใช่ของคนเขียนบทความ

structured data ที่บอกความจริง ไม่ใช่ที่บอกให้ดูดี

เว็บนี้ฝังข้อมูลสำหรับเครื่องอ่านไว้หลายชุดครับ ระดับทั้งเว็บมีตัวบริษัทกับตัวเว็บไซต์ ส่วนแต่ละหน้าเพิ่มของตัวเองเข้าไป บทความประกาศว่าเป็นบทความและใครเขียน หน้าบริการประกาศว่าเป็นบริการ หน้าตำแหน่งงานประกาศว่าเป็นประกาศรับสมัครงาน และหน้าที่อยู่ลึกเข้าไปจะมีเส้นทางบอกว่าตัวเองอยู่ตรงไหนของเว็บ

ที่อยากเล่าคือการตัดสินใจว่าจะ ไม่ ประกาศอะไร ซึ่งเป็นส่วนที่คนมักข้ามไป

หน้าบริการของเรา ประกาศตัวเองว่าเป็น Service ไม่ใช่ Product ครับ เพราะสิ่งที่เราขายไม่ใช่ของที่หยิบจากชั้นวางแล้วจ่ายเงิน ถ้าประกาศว่าเป็น Product เมื่อไร Google จะเริ่มมองหาราคาและคะแนนรีวิว ซึ่งเราไม่มีทั้งสองอย่าง แล้วหน้านั้นก็จะกลายเป็นสินค้าที่ข้อมูลไม่ครบ แทนที่จะเป็นบริการที่ข้อมูลครบ

อีกอันคือช่องค้นหา มาตรฐาน structured data เปิดให้เว็บประกาศได้ว่ามีระบบค้นหาภายในนะ ส่งคำค้นมาที่ที่อยู่นี้ได้เลย เว็บนี้ไม่ประกาศไว้ครับ เพราะเรายังไม่ได้ทำหน้าค้นหา เราเก็บมันไว้จนกว่าบทความจะเยอะพอจะต้องใช้ การประกาศเส้นทางที่กดแล้วเจอหน้าไม่พบ ให้ผลเสียมากกว่าการไม่ประกาศอะไรเลยครับ

และอันที่ผมชอบที่สุดคือคำถามที่พบบ่อยครับ Google ตัดการแสดงผลแบบพิเศษของ FAQ ออกไปตั้งแต่ปี 2023 เหลือไว้เฉพาะเว็บหน่วยงานรัฐและเว็บสุขภาพ เราก็รู้ว่าใส่ไปแล้วแทบไม่มีทางได้หน้าตาพิเศษในผลค้นหา แต่ยังใส่อยู่ดี เพราะมันบอกเครื่องที่มาอ่าน รวมถึงผู้ช่วย AI ที่กำลังหาคำตอบให้ใครสักคน ว่าข้อความไหนคือคำตอบของคำถามไหน

ข้อบังคับที่เราถือกับตัวเองคือ คำถามและคำตอบในโค้ดต้องมาจากข้อความชุดเดียวกับที่คนอ่านเห็นบนหน้าจอเป๊ะ ๆ ครับ เพราะถ้าสองอย่างนี้ไม่ตรงกันเมื่อไร สิ่งที่เราบอกเครื่องอ่านก็ไม่ใช่สิ่งที่อยู่บนหน้าจริง ซึ่ง Google มีชื่อเรียกของมันอยู่แล้ว และจัดการกับหน้าแบบนั้นตามนั้น

บทความที่ไม่มีชื่อคนเขียน กับบทความที่ไม่ประกาศอะไรเลย

ตอนแรกเราประกาศบทความเป็น Article เฉย ๆ ครับ ไม่มีชื่อคนเขียน เพราะยังไม่ได้ทำระบบผู้เขียน พอมาคิดอีกที Article ที่ไม่มีคนเขียน ก็คือการประกาศว่าหน้านี้เป็นงานเขียนของไม่มีใคร ซึ่งให้ผลแย่กว่าการไม่ประกาศว่าเป็นบทความไปเลยด้วยซ้ำ

ตอนนี้บทความกับคนเขียนถูกประกาศไว้เป็นกราฟเดียวกันครับ ตัวคนเขียนมีที่อยู่ของตัวเองซึ่งชี้ไปหน้าทีมของเรา แล้วบทความก็ชี้ไปหาที่อยู่นั้นแทนที่จะพิมพ์ชื่อซ้ำอีกรอบ เครื่องที่อ่านเจอชิ้นไหนก่อนก็ได้ข้อมูลชุดเดียวกัน และถ้าบทความไหนยังไม่มีคนเขียนจริง ๆ เราก็ไม่ประกาศส่วนนั้น ดีกว่าประกาศชื่อลอย ๆ ไว้ให้ครบฟอร์ม

สองภาษาที่ไม่ได้แข่งกันเอง

เว็บนี้มีทุกหน้าอยู่สองภาษาครับ ซึ่งเป็นจุดที่เว็บสองภาษามักเจอปัญหาเหมือน ๆ กัน เพราะถ้าไม่ได้บอกความสัมพันธ์ไว้ หน้าไทยกับหน้าอังกฤษจะกลายเป็นสองหน้าที่แข่งกันเอง หรือไม่ก็ถูกมองว่าเป็นเนื้อหาซ้ำ

ทุกหน้าจึงประกาศสามอย่างครับ หนึ่ง ที่อยู่หลักของหน้านี้ สอง หน้านี้มีอีกภาษาหนึ่งอยู่ที่ไหน และสาม ถ้าเครื่องไม่รู้จะเลือกภาษาไหนให้ผู้ใช้ ให้ไปที่ฉบับภาษาไทย

แผนผังเว็บก็บอกเรื่องเดียวกันซ้ำอีกรอบ ตอนนี้มีเก้าสิบหกรายการ เป็นภาษาไทยสี่สิบแปด อังกฤษสี่สิบแปด และทุกรายการพกความสัมพันธ์ของคู่ภาษาไปด้วย ไม่ใช่แค่รายชื่อลิงก์เฉย ๆ

รายละเอียดเล็ก ๆ อีกอย่างที่ชอบเล่าคือวันที่ครับ หน้าบทความแสดงวันที่แบบไทยว่า 2 กันยายน 2569 ให้คนอ่าน แต่ในโค้ดเดียวกันนั้นมีวันที่แบบมาตรฐานสากลกำกับไว้ให้เครื่องอ่าน คนได้ปีพุทธศักราชแบบที่คุ้นตา เครื่องได้ค่าที่มันเข้าใจ ไม่ต้องเลือกอย่างใดอย่างหนึ่ง

staging ที่ห้าม index จากโค้ด ไม่ใช่จากช่องติ๊กใน CMS

เว็บนี้มีสองที่ครับ ตัวจริงกับตัวทดสอบ เนื้อหาเหมือนกันเกือบทั้งหมด และตัวทดสอบต้องไม่ถูก Google เก็บเข้าไปเด็ดขาด เพราะถ้าโดนเก็บ เว็บเราจะกลายเป็นสองเว็บที่เนื้อหาซ้ำกันทุกหน้า และลูกค้าอาจกดเข้าไปเจอเว็บทดสอบจากผลค้นหาโดยไม่รู้ตัว

วิธีที่เจอบ่อยคือใส่ช่องติ๊กใน CMS ไว้ว่าห้ามเก็บ ซึ่งทำงานได้ดีตราบใดที่ค่านั้นยังอยู่ครับ แต่มันเป็นค่าที่แก้ได้ และเว็บทดสอบก็เป็นที่ที่คนเข้าไปลองอะไรหลายอย่าง เราเลยไม่ให้เรื่องนี้ขึ้นกับค่าที่แก้ได้ โค้ดตรวจเองว่ากำลังรันอยู่ที่ไหน ถ้าไม่ใช่ตัวจริง หน้านั้นจะบอกห้ามเก็บเสมอ และช่องติ๊กใน CMS ของตัวทดสอบก็สั่งกลับไม่ได้ ส่วนช่องติ๊กใน CMS ยังมีอยู่นะครับ แต่มันทำได้ทางเดียวคือสั่งห้ามเพิ่ม ไม่ใช่สั่งอนุญาต

บทความตั้งเวลาที่ยังไม่มีตัวตน จนกว่าจะถึงวันของมัน

เรื่องนี้ผมว่าน่าสนใจมากเลยแหละครับ

เว็บนี้ตั้งเวลาบทความล่วงหน้าได้ และตอนนี้ก็มีบทความที่ตั้งไว้ล่วงหน้าอยู่จริง คำถามคือ ระหว่างที่ยังไม่ถึงวัน หน้านั้นมีอยู่มั้ย

คำตอบของเว็บนี้คือไม่มีครับ ไม่ใช่ซ่อน ไม่ใช่ขึ้นข้อความว่ายังไม่เผยแพร่ แต่ตอบกลับไปว่าไม่พบหน้านี้ และไม่ปรากฏในแผนผังเว็บด้วย เราลองยิงเข้าไปที่บทความของวันพรุ่งนี้แล้วครับ ได้ไม่พบหน้าตามที่ควรเป็น

เหตุผลคือหน้าที่เข้าถึงได้ก่อนกำหนด คือหน้าที่ถูกเก็บเข้าดัชนีได้ก่อนกำหนดเหมือนกัน แล้ววันที่เผยแพร่จริงก็จะกลายเป็นวันที่สอง ไม่ใช่วันแรก

เผยแพร่แล้วขึ้นทันที โดยไม่ต้อง deploy

หน้าเว็บทุกหน้าถูกสร้างไว้ล่วงหน้าเป็นไฟล์นิ่งครับ รอบล่าสุดสร้างไว้ร้อยสิบสองหน้า นั่นทำให้เว็บเร็ว แต่ก็แปลว่าหน้าที่เสิร์ฟอยู่คือหน้าที่สร้างไว้เมื่อสักครู่ ไม่ใช่ข้อมูลล่าสุดในระบบจัดการเนื้อหา เราเลยต่อสายไว้ พอมีการแก้เนื้อหา ระบบจะยิงสัญญาณมาบอกเว็บให้ล้างของเก่าทิ้งทันที เนื้อหาใหม่ขึ้นภายในราวสิบห้าถึงหกสิบวินาที โดยไม่ต้อง deploy อะไรทั้งสิ้น

ที่อยากเน้นคือ การ deploy ควรเกิดขึ้นตอนแก้โค้ด ครับ ถ้าการแก้คำผิดในบทความหนึ่งคำต้อง deploy ใหม่ แปลว่าเนื้อหากับโค้ดยังผูกติดกันอยู่ และคนเขียนเนื้อหาก็ต้องรอคิวของคนเขียนโค้ดไปเรื่อย ๆ ซึ่งเป็นค่าใช้จ่ายที่ไม่มีใครเห็นในตอนแรก

ประกาศงานที่ Google ยอมแสดง

ล่าสุดเราเพิ่งเพิ่มสองอย่างให้หน้าตำแหน่งงานครับ เพราะทั้งสองอย่างเป็นเงื่อนไขที่ Google ต้องการก่อนจะยอมแสดงประกาศงานในผลค้นหาสายงาน

อย่างแรกคือวันที่ประกาศ ซึ่งแต่เดิมเราไม่มีเก็บไว้เลย ประกาศงานที่ไม่มีวันที่คือประกาศที่ Google จะไม่แสดงให้ครับ

อย่างที่สองคือช่วงเงินเดือน ตรงนี้มีรายละเอียดที่ทำให้เราต้องออกแบบใหม่ครับ เราไม่ได้เก็บเป็นข้อความว่าสี่หมื่นถึงหนึ่งแสน แต่เก็บเป็นตัวเลขสองตัวแยกกัน เพราะต้องบอกเครื่องอ่านด้วยว่าเป็นสกุลเงินอะไร และเป็นต่อเดือนหรือต่อปี ข้อความนั้นไม่ได้บอกสองอย่างนี้เลย

ผลพลอยได้คือหน้าเว็บภาษาไทยกับภาษาอังกฤษจัดรูปแบบตัวเลขคนละแบบได้ จากข้อมูลชุดเดียวกัน โดยไม่มีใครต้องพิมพ์ซ้ำสองรอบ

ของที่เราเขียนไว้ให้เครื่องอ่าน ที่ไม่ใช่ Google

เว็บนี้มีไฟล์ข้อความไฟล์หนึ่งที่ไล่รายชื่อหน้าทั้งหมดพร้อมคำอธิบายสั้น ๆ เอาไว้ครับ ไม่ได้เขียนให้เครื่องมือค้นหาแบบเดิม แต่เขียนให้ผู้ช่วย AI ที่กำลังอ่านเว็บเราเพื่อตอบคำถามใครสักคน

จะมีใครใช้มันจริงมั้ย เรายังไม่รู้ครับ แต่ต้นทุนของมันคือไฟล์ข้อความไฟล์เดียว และทิศทางที่คนหาข้อมูลกำลังเปลี่ยนไปก็ค่อนข้างชัด

สิ่งที่เว็บนี้ยังขาด

ยังมีอันหนึ่งที่เรารู้ว่าขาดครับ

แผนผังเว็บของเราไม่มีวันที่แก้ไขล่าสุดกำกับไว้เลยสักรายการ ทั้งที่ในระบบจัดการเนื้อหามีวันที่นั้นอยู่แล้ว ค่านั้นคือสิ่งที่บอกเครื่องมือค้นหาว่าควรกลับมาดูหน้าไหนก่อน การไม่ใส่ไม่ได้ทำให้อะไรพัง แต่มันคือการปล่อยข้อมูลที่มีอยู่แล้วทิ้งไปเปล่า ๆ

เขียนไว้ตรงนี้เพื่อให้มันเป็นงานที่มองเห็น ไม่ใช่ช่องว่างที่เงียบครับ

สรุปให้เพื่อน ๆ เอาไปใช้ต่อ

ถ้าคุณกำลังจะจ้างใครทำเว็บ สามคำถามนี้ถามได้เลยครับ เว็บทดสอบของเราถูกกันไม่ให้ขึ้น Google ด้วยอะไร หน้าสองภาษาบอกความสัมพันธ์กันยังไง และเวลาแก้เนื้อหาหนึ่งบรรทัด ต้อง deploy ใหม่มั้ย

ถ้าคุณเป็นคนทำเว็บเหมือนเรา ข้อที่อยากชวนคิดคือ structured data ทุกชิ้นที่เราประกาศออกไป มันคือคำสัญญาว่าหน้านั้นเป็นแบบนั้นจริง การประกาศให้ครบทุกช่องเพื่อให้เครื่องมือตรวจขึ้นสีเขียว ไม่ใช่เป้าหมายครับ เป้าหมายคือสิ่งที่ประกาศออกไปตรงกับสิ่งที่อยู่บนหน้าจอจริง

อยากให้เราช่วยดูเว็บหรือระบบที่คุณกำลังทำอยู่ ติดต่อเราได้ เลยครับ

เกี่ยวกับผู้เขียน

ภาพถ่ายของ Film

ฟิล์ม — วิสิฏฐ์ ครับ ทำธุรกิจเป็นหลัก แต่ยังลงมือทำ BA เองอยู่บ่อยกว่าที่ควร และเขียนโค้ดได้ประปรายทั้งหน้าบ้านหลังบ้าน มีธุรกิจเล็ก ๆ อยู่สองสามบริษัท ติดตามวงการเทคโนโลยีและธุรกิจแบบคลั่งไคล้ ทั้งในไทยและต่างประเทศ นอกเวลางานชอบฟิสิกส์ ดาราศาสตร์ งาน DIY และเรื่องเน็ตเวิร์ก เปิดเพลงฟังตลอดเวลาแต่ร้องไม่เป็น ชอบเล่นดนตรีทั้งที่เล่นได้ไม่ค่อยดี เล่นกีฬาหลายอย่าง โดยเฉพาะกีฬาที่ใช้แร็กเกต ไม่ได้ชอบเที่ยวเท่าไร แต่ชอบพามิ้นท์ไปเที่ยวที่ต่าง ๆ ทั่วโลก เป็นคนกลัว เอ้ย รักเมีย เสียอยู่อย่างเดียวคือแทบไม่เล่นเกม

เขียนร่วมกับ Claude Opus 5