WordPress REST API: ทำไมจึงบล็อกเฉพาะผู้ที่ไม่ได้ล็อกอิน แทนที่จะปิดทั้งหมด

ประกาศแอฟฟิลิเอต Ver 3.1
ประกาศแอฟฟิลิเอต Ver 3.2 (เฉพาะมือถือ)

WordPress REST API เปิดเผยชื่อผู้ใช้ของเว็บไซต์ผ่านที่อยู่ wp-json แม้แต่กับผู้เข้าชมที่ไม่ได้ล็อกอิน ถ้าปิดทั้งหมด บางครั้งการบันทึกในตัวแก้ไขบล็อกจะล้มเหลว บทความนี้จึงสรุปวิธีบล็อกเฉพาะคำขอที่ไม่ได้ล็อกอิน และตรวจด้วยการตอบกลับ 401

1️⃣ WordPress REST API คืออะไร: ที่อยู่ wp-json และหน้าที่

WordPress REST API คือฟีเจอร์พื้นฐานของ WordPress ที่รับส่งข้อมูลเว็บไซต์ เช่น โพสต์ หน้า และผู้ใช้ ในรูปแบบ JSON และตอบกลับอยู่ใต้ /wp-json/ ต่อท้ายที่อยู่เว็บไซต์

ใต้ /wp-json/ ที่อยู่จะแยกตามชนิดข้อมูล เช่น [wp/v2/posts]·[wp/v2/pages]·[wp/v2/users] และเรียกที่อยู่แต่ละอันว่า Endpoint ตัวแก้ไขบล็อกก็ส่งคำขอมาที่ที่อยู่นี้ตอนบันทึกโพสต์

https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users

2️⃣ ชื่อผู้ใช้ที่เปิดเผยผ่าน wp-json

  • ↪️ เหตุผลที่บล็อก: users 401 · เห็นได้จากหน้าผู้เขียนด้วย

Endpoint [wp/v2/users] ตอบกลับชื่อที่แสดงและค่า slug ของผู้ใช้ทุกคนที่เผยแพร่โพสต์ และโดยค่าเริ่มต้น slug จะเป็นชื่อล็อกอินตรง ๆ บัญชีผู้ดูแลระบบของเว็บไซต์ทดสอบ https://testpilotweb.com/ ก็มี slug เหมือนชื่อล็อกอิน

ถ้าชื่อล็อกอินถูกเปิดเผย ผู้โจมตีแค่หารหัสผ่านให้ได้ก็ล็อกอินได้ และหน้าล็อกอิน WordPress ของเว็บไซต์ทดสอบก็บันทึกการเดารหัสผ่าน 2,570 ครั้งในวันเดียวคือ 7 ตุลาคม 2026

แม้บล็อกที่อยู่นี้แล้ว ชื่อเดียวกันก็ยังอยู่ในที่อยู่หน้าผู้เขียน (/author/ชื่อล็อกอิน/)

3️⃣ สิ่งที่พังเมื่อปิดทั้งหมด

  • ↪️ การบันทึกในตัวแก้ไขบล็อก · เครื่องมือ MCP 0 รายการ

ถ้าปิด WP REST API ทั้งหมด การบันทึกโพสต์ในตัวแก้ไขบล็อกจะล้มเหลวเป็นอย่างแรก Perfmatters ซึ่งเป็นปลั๊กอินปรับแต่ง WordPress ตัวหนึ่งจึงแบ่งขอบเขตการปิดเป็น 2 ระดับคือ [Disable for Non-Admins] และ [Disable When Logged Out] ถ้าเว็บไซต์มีบัญชีผู้เขียนหรือผู้ร่วมเขียน [Disable for Non-Admins] ก็จะทำให้บัญชีเหล่านั้นบันทึกโพสต์ไม่ได้

แม้เว็บไซต์จะบล็อกเฉพาะผู้ที่ไม่ได้ล็อกอิน แต่พอเชื่อมคอนเนกเตอร์ MCP ใน claude.ai หลังยืนยันตัวตนเสร็จ เครื่องมือกลับแสดงเป็น 0 รายการ บันทึกของเซิร์ฟเวอร์มีคำขอ MCP เป็น 401 ทั้งหมด สาเหตุคือ Perfmatters บล็อกคำขอก่อนที่ MCP จะตรวจโทเคน

ค่า [Disable REST API]ที่อยู่ users สำหรับผู้เข้าชมที่ไม่ได้ล็อกอินการบันทึกโพสต์ของบัญชีที่ไม่ใช่ผู้ดูแลระบบเหมาะกับ
Default (Enabled)เปิดเผยชื่อผู้ใช้บันทึกได้—
Disable for Non-Admins401บันทึกไม่ได้เว็บไซต์ที่ไม่มีบัญชีผู้เขียน·ผู้ร่วมเขียน
Disable When Logged Out401บันทึกได้เว็บไซต์ที่มีบัญชีผู้เขียน การเชื่อมต่อด้วยโทเคน เช่น MCP ให้เพิ่มเส้นทางยกเว้น

4️⃣ การตั้งค่าบล็อกเฉพาะผู้ที่ไม่ได้ล็อกอิน (Perfmatters)

  • ↪️ ตำแหน่งการตั้งค่า · ตรวจการตอบกลับ 401

ในหน้าผู้ดูแลระบบ WordPress ไปที่ [ตั้งค่า] → [Perfmatters] → [General] เปลี่ยน [Disable REST API] ในส่วน [Core] เป็น [Disable When Logged Out] แล้วกด [บันทึกการเปลี่ยนแปลง]

WordPress Settings → Perfmatters → General (WordPress REST API)
Perfmatters Disable REST API: Disable When Logged Out

ภาษาที่ Perfmatters รองรับ: อังกฤษ (ค่าเริ่มต้น) เกาหลี เยอรมัน ฝรั่งเศส อิตาลี ดัตช์ โปรตุเกส (บราซิล) รัสเซีย ยูเครน ตุรกี บัลแกเรีย ฮังการี อินโดนีเซีย เปอร์เซีย จีน (ตัวย่อ)

Perfmatters settings simulator: General → Core
ซิมูเลเตอร์การตั้งค่า Perfmatters · รีวิว·คู่มือ Perfmatters

ถ้าเปิด /wp-json/wp/v2/users ในหน้าต่างไม่ระบุตัวตนโดยไม่ล็อกอิน จะได้การตอบกลับ 401 พร้อมข้อความ [Sorry, you do not have permission to make REST API requests.] ส่วนตัวแก้ไขบล็อกในสถานะล็อกอินก็ยังบันทึกโพสต์ได้ตามปกติ

🔌 คำขอเดียวกัน การตอบกลับสองแบบ GET /wp-json/wp/v2/users
เว็บไซต์ที่ไม่ได้บล็อก
200
ผู้เข้าชมที่ไม่ได้ล็อกอินก็เห็นชื่อผู้ใช้ได้
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
เว็บไซต์ที่ตั้ง [Disable When Logged Out]
401
คำขอที่ไม่ได้ล็อกอินจะได้การตอบกลับ 401 พร้อมข้อความ
{⏎  "code": "rest_authentication_error",⏎  "message": "Sorry, you do not have permission to make REST API requests.",⏎  "data": { "status": 401 }⏎}
slug โดยค่าเริ่มต้น slug จะเป็นชื่อล็อกอินตรง ๆ
ด้านซ้ายนำมาเฉพาะ 4 รายการจากการตอบกลับ คือ id·name·slug·link และชื่อเป็นตัวอย่าง (user_a)


5️⃣ ตั้งข้อยกเว้นให้เส้นทางที่บล็อก

  • ↪️ ข้อยกเว้นเส้นทาง MCP · ต่างจากการลบลิงก์ REST API

เมื่อต้องเปิดเฉพาะบางเส้นทางในสถานะที่บล็อกไว้ ให้เพิ่มเส้นทางนั้นในฟิลเตอร์ [perfmatters_rest_api_exceptions] ของ Perfmatters ปัญหาเครื่องมือ 0 รายการของคอนเนกเตอร์ MCP ใน claude.ai แก้ได้ด้วยการสร้างสนิปเปต PHP ในเมนู [Code] ของ Perfmatters ให้ยกเว้นเฉพาะเส้นทาง MCP

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

แม้ตั้งข้อยกเว้นแล้ว คำขอที่ไม่มีโทเคนก็ถูก MCP บล็อกเองด้วยข้อความ [MCP authentication required.] และการตอบกลับ 401 ส่วน /wp-json/wp/v2/users ก็ยังได้การตอบกลับ 401 จาก Perfmatters ต่อไป

🚦 ลำดับที่คำขอผ่าน
ก่อนตั้งข้อยกเว้น · คำขอ MCP
คำขอที่คอนเนกเตอร์ MCP ของ claude.ai ส่งหลังยืนยันตัวตนเสร็จ ขณะตั้ง [Disable When Logged Out]
Perfmatters
บล็อกด้วย 401
→↓
ตรวจโทเคน MCP
ไปไม่ถึง
→↓
ผลลัพธ์
เครื่องมือ 0 รายการ
หลังตั้งข้อยกเว้น · คำขอ MCP
/mcp/mcp-oauth-server เพิ่มเส้นทางนี้ในข้อยกเว้นของ Perfmatters แล้ว
Perfmatters
ผ่านเพราะเป็นเส้นทางยกเว้น
→↓
ตรวจโทเคน MCP
MCP ตรวจเอง
→↓
ผลลัพธ์
ไม่มีโทเคนได้ 401
[MCP authentication required.]
หลังตั้งข้อยกเว้น · /wp-json/wp/v2/users
เส้นทางที่ไม่ได้ใส่ในข้อยกเว้นจะยังถูกบล็อก
Perfmatters
บล็อกด้วย 401
→↓
ผลลัพธ์
ยังกันการเปิดเผยชื่อผู้ใช้ได้
⚠️ Perfmatters บล็อกคำขอก่อนที่ MCP จะตรวจโทเคน

[Remove REST API Links] ในส่วน [Core] เดียวกันเป็นการตั้งค่าที่ลบแค่ลิงก์ api.w.org ออกจากส่วนหัวของหน้าและ Header ของการตอบกลับ ส่วน WP REST API ยังตอบกลับตามเดิม

🔢 FAQ & เนื้อหาแนะนำ

xmlrpc.php เป็นที่อยู่ต่างจาก REST API จึงยังตอบกลับแม้บล็อก REST API แล้ว เว็บไซต์ทดสอบบันทึกคำขอ POST ไปที่ xmlrpc.php 734 ครั้งในวันเดียวคือ 8 ตุลาคม 2026 และ Perfmatters บล็อกได้ด้วย [Disable XML-RPC] ในส่วน [Core] เดียวกัน

WP Rocket ใส่ที่อยู่ /wp-json/ ไว้ในรายการยกเว้นแคช การตอบกลับของ REST API จึงเปลี่ยนทันทีที่บันทึก ส่วนการตั้งค่าที่เปลี่ยน HTML ของหน้า เช่น [Remove REST API Links] จะมีผลหลังล้างแคช

ไม่ใช่ ตัวแก้ไขบล็อกของ WordPress ส่งคำขอไปที่ REST API ตอนบันทึกโพสต์ และคอนเนกเตอร์ MCP ที่เชื่อมเครื่องมือ AI อย่าง claude.ai ก็ใช้เส้นทางใต้ /wp-json/

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 0   +   7   =