Cách tốt nhất để flush_rewrite_rules cho loại bài đăng tùy chỉnh, trong plugin mu-plugins?


9

Tôi đang viết một plugin khởi tạo một loại bài đăng tùy chỉnh (trong số những thứ khác). Nó là một plugin nhiều trang và nằm trong thư mục mu-plugins .

Cách thực hành tốt nhất để xử lý flush_rewrite_rules () trong tình huống này là gì? Đối với một plugin 'bình thường', bạn sẽ thực hiện điều này trong một hook kích hoạt - điều này sẽ không thể thực hiện được đối với một plugin phải sử dụng vì những hook đó không có sẵn.

Vì đây được coi là sự kiện "một lần" sau khi đăng ký loại bài đăng tùy chỉnh, sẽ có ý nghĩa khi làm điều gì đó như thế này trong lớp của tôi đăng ký CPT:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

Vì vậy, đăng ký CPT xảy ra trên mọi hành động 'init' - nhưng nếu tôi có quyền này, quy tắc viết lại sẽ chỉ xảy ra một lần. Bao giờ .

Có phải tôi đang trên đường ray bên phải không?

(chỉnh sửa): Tôi vừa thử nó; CPT của tôi đang đưa ra một lỗi 404 không tìm thấy, vì vậy các quy tắc viết lại không hoạt động :-(

(chỉnh sửa # 2): Tôi đã thử giải pháp truy cập biến toàn cục như trong câu hỏi này: Làm thế nào để xóa các quy tắc viết lại trên multisite một cách đáng tin cậy? - Tôi sẽ cập nhật ví dụ mã của tôi ở trên để hiển thị điều này. Thật không may, tôi vẫn gặp lỗi 404 khi thử tải CPT. Tôi thấy rằng các quy tắc viết lại đang được lưu trữ trong cơ sở dữ liệu, có vẻ như chúng không được sử dụng. Tôi bị lạc



Thực sự không có cách thích hợp để làm điều này. Điều này về cơ bản là tốt nhất tại thời điểm viết bình luận này.
Pieter Goosen

@PieterGoosen - cảm ơn, tôi đã thấy điều đó sớm hơn và tôi đã cập nhật câu hỏi của mình để xem xét giải pháp khác. Vẫn không làm việc. Tôi tự hỏi nếu tôi đã phá vỡ một cái gì đó bằng cách thực hiện flush_rewrite_rules () trước khi thấy câu trả lời khác? Có lẽ tôi phải xóa trang web thử nghiệm của mình và thiết lập lại nó, để kiểm tra chính xác quy trình chính xác?
CC

Điều đó có thể là có thể. Việc thực thi các quy tắc viết lại tuôn ra sai trong nhiều trang có thể phá vỡ tất cả các quy tắc viết lại trong mạng của bạn. Nếu tôi ở nơi bạn, tôi sẽ chỉ bắt đầu mới. Chỉ hy vọng đây là một kết thúc cài đặt cục bộ không phải là một trang web trực tiếp ;-)
Pieter Goosen

đúng ... tôi sẽ thử nó Và không, đó là một trang web thử nghiệm và tôi nghĩ rằng tôi có thể xóa sạch DB và thiết lập lại cấu hình mạng trong lúc ngủ! :-)
CC

Câu trả lời:


2

Các flush_rewrite_ruleschức năng đáng tin cậy trong một số hoàn cảnh giống như một chủ đề hoặc một plugin dựa trên móc nhưng tôi không chắc chắn nếu nó làm việc cho mộtmu-plugin

Tuyên bố của tôi dựa trên thực tế là WordPress được khởi tạo theo cách này:

  • gọi wp-settings.phptập tin
  • gọi do_action( 'muplugins_loaded' );hook, ở đây plugin của bạn được khởi tạo
  • gọi $GLOBALS['wp_rewrite'] = new WP_Rewrite();đây là phương thức flush_rulesđược khởi tạo và có sẵn từ bây giờ
  • do_action( 'setup_theme' );được gọi và tôi đặt cược tất cả tiền của mình vào cái móc này flush_rewrite_rulessẽ hoạt động

Giải pháp?

Cá nhân, tôi thấy đáng tin cậy việc xóa tùy chọn Rewrite_rules.

delete_option('rewrite_rules');

hoặc là

update_option('rewrite_rules', '' );

Bất cứ khi nào WordPress sẽ thiếu rewrite_rulesnó sẽ xây dựng chúng trở lại, đây cũng là flush_rulesphương pháp làm.

Có một số điểm trong luồng thực thi WordPress nơi các chức năng như thế này không khả dụng. ngay cả trong cốt lõi của WordPress tôi đã tìm thấy tuyên bố này

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

Vấn đề duy nhất là hiệu suất, đừng làm điều này theo mọi yêu cầu bởi vì đây là một quá trình khó khăn để xây dựng chúng trở lại. Như tôi có thể thấy bạn chỉ muốn xả chúng ở lần gọi đầu tiên và đây là một điều tốt.

Tái bút: Tôi không phải là một người hâm mộ tự quảng cáo như vậy nhưng tôi cũng đã viết một bài viết về điều này từ lâu và tôi nghĩ rằng nó vẫn đứng lên cho điều này


0

Nếu mu-plugin của bạn có các tùy chọn, tôi sẽ đặt ngay sau khi cập nhật chúng:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
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.