Làm thế nào để đáng tin cậy tuôn ra các quy tắc viết lại trên multisite?


20

Giả sử bạn có một plugin cần xóa các quy tắc viết lại. Bạn làm tất cả đúng cách với móc kích hoạt và thêm xả muộn, để mọi thứ đều trơn tru và tương thích.

Và rồi một ngày đẹp trời ai đó cố gắng chạy nó trên multisite.

Thay vì một kịch bản đơn giản như:

  1. Trang web WordPress được tạo
  2. Plugin được cài đặt và kích hoạt

Bây giờ bạn có những kịch bản ác mộng như:

  1. Plugin được cài đặt và kích hoạt mạng
  2. Trang web WordPress mới (hoặc một trăm) trong multisite được tạo

Về lý thuyết nó chỉ nên hoạt động, phải không? Trong thực tế, nó đi sai theo những cách ngoạn mục:

  • $wp_rewrite nhà nước có thể từ trang web sai
  • switch_to_blog() không theo dõi trạng thái viết lại
  • phần sau này có thể xảy ra trong một phần khác nhau
  • tất cả các plugin khác , bạn được cho là chơi tốt, có thể không được bật liên tục trên các trang web khác nhau

Ví dụ, bạn có thể thấy vấn đề này như thế nào khi cố gắng thực hiện nó ngay lập tức thổi bay permalinks trên trang web chính mỗi khi trang web mới được tạo .

Vì vậy, làm thế nào plugin sẽ đi về quy tắc viết lại đáng tin cậy trong multisite :

  1. Khi trang web mới được tạo ra, cho trang web?
  2. Khi trang web hiện tại được kích hoạt từ không hoạt động, cho trang web?
  3. Khi plugin được kích hoạt mạng, cho mọi trang web?
  4. Khi plugin bị vô hiệu hóa mạng, cho mọi trang web?
  5. Có thể trong các kịch bản khác, liên quan đến việc viết lại bối cảnh toàn cầu đang thay đổi?

Câu trả lời:


11

Lưu ý: đây là một câu trả lời không đầy đủ sẽ được mở rộng theo từng bước


Cách đáng tin cậy duy nhất để xóa các quy tắc viết lại trong multisite, mà không có khả năng phá hủy cấu trúc permalink của chính và bất kỳ bối cảnh blog nào khác (tùy thuộc vào cách thức và cách bạn chuyển sang và từ) là xóa các quy tắc viết lại trong ngữ cảnh cụ thể như vậy :

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

Ở trên đảm bảo rằng cấu trúc permalink chính xác cho bối cảnh cụ thể được lấy ra và được đặt trước khi xây dựng các quy tắc viết lại và cam kết các thay đổi đối với cơ sở dữ liệu.

Điều này không áp dụng cho một trang web nơi bối cảnh không quan trọng, vì chỉ có một bối cảnh.

flush_rewrite_rules()theo ý kiến ​​của tôi là thiếu sót trong tiền đề rằng nó giả định bối cảnh chính xác, nhưng không tính đến việc chúng ta sử dụng switch_to_blogđể thay đổi hoàn toàn bối cảnh và khiến chúng ta rơi vào lãnh thổ nguy hiểm nếu chúng ta cố gắng tuôn ra các quy tắc.

Đây là những gì bên trong của flush_rewrite_rules()trông giống như:

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

Tôi không thể nghĩ ra lý do tại sao nó không giống như thế này:

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

... Đặc biệt là khi bạn xem xét rằng các nhà xây dựng của WP_Rewritenhững gì? Nó làm điều này ...

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

Chạm vào điểm quan tâm đầu tiên của bạn để tiếp tục dòng này, mặc dù,

Vì vậy, làm thế nào plugin sẽ đi về quy tắc viết lại đáng tin cậy trong multisite :

  • Khi trang web mới được tạo ra, cho trang web?

Chúng ta hãy xem những gì cốt lõi WordPress sẽ gọi đáng chú ý trong quá trình này:

  • Đầu tiên wpmu_create_blog()
  • mà sau đó gọi install_blog()mà lần lượt gọipopulate_options()
  • sau đó populate_options()đặt cấu trúc permalink mặc định trong bảng tùy chọn
  • sau khi install_blog()chạy, wp_install_defaults()rồi được gọi
  • sau đó wp_install_defaults()xóa các quy tắc viết lại cho trang web mới được tạo trước khi chuyển trở lại blog hiện tại thông qua restore_current_blog().

Điều quan trọng cần lưu ý là wp_install_defaults()xóa các quy tắc chính xác như tôi đã đề xuất ở trên:

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

... bởi vì đó là cách duy nhất để đảm bảo chính xác permalink_structurevà các quy tắc được xây dựng cho bối cảnh hiện tại.

Cũng trong vấn đề được chứng minh trong vấn đề Github , lý do tại sao người dùng gặp phải hành vi sau:

Khi một trang web mới được tạo, nó chỉ phá vỡ các permalinks cấp độ bài đăng trên trang web cấp cao nhất - trong hầu hết các cấu hình permalink nhưng không phải tất cả:

2 định dạng này hoạt động chính xác.

Mặc định - Hoạt động như mong đợi

Ngày & Tên - Hoạt động như mong đợi

... là bởi vì nếu blog chính có cấu trúc permalink Day & Name /%year%/%monthnum%/%day%/%postname%/, khi một trang web mới được tạo, thì nó cũng có cấu trúc permalink Day & Name /%year%/%monthnum%/%day%/%postname%/theo mặc định, đó là lý do tại sao không có vấn đề đáng chú ý nào xuất hiện khi plugin Yoast SEO viết lại quy tắc trên shutdownmóc.


Âm thanh về đúng. Điều gây phiền nhiễu với việc cài đặt một trang web mới là bạn không thể kết nối trong suốt quá trình, chỉ sau khi nó đã được hoàn thành. Do đó, các quy tắc sẽ được tuôn ra hai lần.
Anton Timmermans

Bounty thời gian đã hết, vì vậy điểm rơi vào thanh kiếm ở đây. :) Vẫn còn rất nhiều để tìm ra mặc dù. :(
Hết

Có thể không tự thiết lập bối cảnh $wp_rewriteđể bạn có thể lặp qua và đặt lại từng trang mạng không? Tôi có một trang web mạng lớn đang gặp phải một số vấn đề về permalink trên các plugin tùy chỉnh. Làm một plugin có thêm cron có vẻ quá mức vì nó sẽ luôn được đặt lại chúng. Vòng lặp chúng với một URL tùy chỉnh sẽ là lý tưởng nhưng tôi không biết làm thế nào để làm điều đó cho tất cả các trang web.
Adam Patterson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.