จะล้างกฎการเขียนซ้ำบนไซต์ที่เชื่อถือได้ได้อย่างไร


20

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

แล้ววันหนึ่งที่ใครบางคนพยายามที่จะเรียกใช้มันในหลายไซต์

แทนที่จะเป็นสถานการณ์ง่าย ๆ เช่น:

  1. สร้างเว็บไซต์ WordPress แล้ว
  2. ติดตั้งและเปิดใช้งานปลั๊กอินแล้ว

ตอนนี้คุณมีสถานการณ์ฝันร้ายเช่น:

  1. ติดตั้งปลั๊กอินแล้วและเปิดใช้งานเครือข่าย
  2. มีการสร้างไซต์ WordPress ใหม่ (หรือร้อย) ในเว็บไซต์หลายไซต์

ในทางทฤษฎีมันควรจะใช้ได้ใช่มั้ย ในทางปฏิบัติมันผิดพลาดในรูปแบบที่น่าตื่นเต้น:

  • $wp_rewrite รัฐอาจมาจากเว็บไซต์ที่ไม่ถูกต้อง
  • switch_to_blog() ไม่ติดตามสถานะการเขียนซ้ำเช่นกัน
  • ส่วน "ภายหลัง" อาจเกิดขึ้นในบล็อกที่แตกต่างกันโดยสิ้นเชิง
  • ปลั๊กอินอื่น ๆทั้งหมดที่คุณควรเล่นได้ดีอาจไม่เปิดใช้งานอย่างสม่ำเสมอในไซต์ต่างๆ

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

ดังนั้นวิธีที่จะไปเกี่ยวกับปลั๊กอินเชื่อถือล้างเขียนกฎใน MultiSite การ :

  1. เมื่อมีการสร้างเว็บไซต์ใหม่สำหรับเว็บไซต์หรือไม่
  2. เมื่อไซต์ที่มีอยู่ถูกเปิดใช้งานจากไม่ได้ใช้งานสำหรับไซต์หรือไม่
  3. เมื่อมีการเปิดใช้งานเครือข่ายปลั๊กอินสำหรับทุกไซต์หรือไม่
  4. เมื่อปลั๊กอินถูกปิดการใช้งานเครือข่ายสำหรับทุกเว็บไซต์?
  5. อาจเป็นไปได้ในสถานการณ์อื่น ๆ ที่เกี่ยวข้องกับการเขียนบริบทโลกที่เปลี่ยนแปลงไป?

คำตอบ:


11

หมายเหตุ: นี่เป็นคำตอบที่ไม่สมบูรณ์ซึ่งจะถูกขยายเมื่อมีการเพิ่มทีละส่วน


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

global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

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

สิ่งนี้ไม่ใช้กับไซต์เดียวที่บริบทไม่สำคัญเนื่องจากมีเพียงบริบทเดียว

flush_rewrite_rules()ในความคิดของฉันมีข้อบกพร่องในสมมติฐานที่ว่ามันเป็นบริบทที่ถูกต้อง แต่ไม่คำนึงถึงการใช้งานของเราswitch_to_blogซึ่งการเปลี่ยนแปลงบริบทอย่างสมบูรณ์และทำให้เราอยู่ในดินแดนอันตรายหากเราพยายามที่จะล้างกฎอาจ

นี่คือลักษณะภายในของflush_rewrite_rules()หน้าตา:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

ฉันไม่สามารถคิดเหตุผลว่าทำไมมันไม่ควรมีลักษณะเช่นนี้:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

... โดยเฉพาะอย่างยิ่งเมื่อคุณพิจารณาว่าตัวสร้างWP_Rewriteทำอะไร มันทำอย่างนี้ ...

public function __construct() {
    $this->init();
}

แตะที่จุดแรกของความกังวลเพื่อเพิ่มเติมบรรทัดนี้

ดังนั้นปลั๊กอินจะไปเกี่ยวกับการล้างกฎการเขียนซ้ำในหลายไซต์ได้อย่างไร :

  • เมื่อมีการสร้างเว็บไซต์ใหม่สำหรับเว็บไซต์หรือไม่

ลองดูสิ่งที่ WordPress คอร์จะสะดุดตาในระหว่างกระบวนการนี้:

  • เป็นครั้งแรก wpmu_create_blog()
  • ซึ่งจะเรียกinstall_blog()สิ่งที่จะเปิดpopulate_options()
  • จากนั้นpopulate_options()ตั้งค่าโครงสร้างลิงก์เริ่มต้นในตารางตัวเลือก
  • หลังจากinstall_blog()วิ่งwp_install_defaults()แล้วถูกเรียก
  • จากนั้นฟwp_install_defaults()ลัชกฏการเขียนซ้ำสำหรับไซต์ที่สร้างขึ้นใหม่ก่อนที่จะเปลี่ยนกลับไปเป็นบล็อกปัจจุบันผ่านทางในrestore_current_blog()ที่สุด

สิ่งสำคัญที่ควรทราบคือฟwp_install_defaults()ลัชกฏทุกประการตามที่ฉันแนะนำด้านบน:

$wp_rewrite->init();
$wp_rewrite->flush_rules();

... เพราะนั่นเป็นวิธีเดียวที่จะตรวจสอบให้แน่ใจว่าpermalink_structureมีการสร้างกฎและกฎที่ถูกต้องสำหรับบริบทปัจจุบัน

นอกจากนี้ในปัญหาที่พบภายในปัญหา Githubเหตุผลที่ผู้ใช้ประสบปัญหาดังต่อไปนี้:

เมื่อมีการสร้างเว็บไซต์ใหม่มันจะแบ่งระดับการโพสต์ไว้ในไซต์ระดับบนสุดเท่านั้น - ในการกำหนดค่าลิงก์ส่วนใหญ่ แต่ไม่ใช่ทั้งหมด:

2 รูปแบบเหล่านี้ทำงานอย่างถูกต้อง

ค่าเริ่มต้น - ทำงานตามที่คาดไว้

วัน & ชื่อ - ทำงานตามที่คาดไว้

... เพราะถ้าบล็อกหลักมีโครงสร้างลิงก์ Day & Name /%year%/%monthnum%/%day%/%postname%/เมื่อมีการสร้างเว็บไซต์ใหม่ก็จะมีโครงสร้างลิงก์/%year%/%monthnum%/%day%/%postname%/ตามวันและชื่อตามค่าเริ่มต้นด้วยเหตุนี้จึงไม่มีปัญหาที่น่าสังเกตเมื่อปลั๊กอิน SEO ของ Yoast เขียนใหม่ กฎระเบียบเกี่ยวกับshutdownเบ็ด


ฟังดูถูกแล้ว สิ่งที่น่ารำคาญกับการติดตั้งไซต์ใหม่คือคุณไม่สามารถขอระหว่างกระบวนการได้ แต่หลังจากเสร็จสิ้นแล้ว เนื่องจากว่ากฎจะถูกลบทิ้งสองครั้ง
Anton Timmermans

เวลาพอสมควรแล้วจึงชี้ไปที่การล้มดาบที่นี่ :) ยังมีอีกมากที่คิดออก :(
Rarst

เป็นไปไม่ได้ที่จะตั้งค่าบริบทด้วยตนเอง$wp_rewriteเพื่อให้คุณสามารถวนซ้ำและรีเซ็ตแต่ละไซต์เครือข่ายได้ ฉันมีเว็บไซต์เครือข่ายขนาดใหญ่ที่มีปัญหาเกี่ยวกับความคิดเห็นในปลั๊กอินที่กำหนดเอง การสร้างปลั๊กอินที่เพิ่ม cron ดูเหมือนจะเกินความจำเป็นเพราะมันจะถูกรีเซ็ตเสมอ การวนลูปด้วย URL ที่กำหนดเองน่าจะเหมาะสมที่สุด แต่ฉันไม่รู้ว่าจะทำอย่างไรกับเว็บไซต์ทั้งหมด
Adam Patterson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.