태그 보관물: plugin-development

plugin-development

mu-plugins 플러그인에서 사용자 정의 게시물 유형에 대해 flush_rewrite_rules를 플러시하는 가장 좋은 방법은 무엇입니까? 후 “일회성”이벤트이므로 CPT를

사용자 정의 게시물 유형을 인스턴스화하는 플러그인을 작성 중입니다 (다른 것들 중에서도). 멀티 사이트 플러그인이며 mu-plugins 디렉토리 에 있습니다 .

이 상황에서 flush_rewrite_rules () 를 처리하는 가장 좋은 방법은 무엇입니까 ? ‘정상적인’플러그인의 경우 활성화 훅 에서이 작업을 수행합니다.이 훅은 사용할 수 없으므로 필수 플러그인에는 사용할 수 없습니다.

이것은 맞춤 게시물 유형을 등록한 후 “일회성”이벤트이므로 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' ) );

따라서 CPT 등록은 모든 ‘초기’작업마다 발생하지만이 권한이 있으면 다시 쓰기 규칙 플러시가 한 번만 발생합니다. 이제까지 .

내가 올바른 길을 가고 있습니까?

(편집) : 방금 시도했습니다. 내 CPT에서 404 찾을 수 없음 오류가 발생하여 다시 쓰기 규칙이 작동하지 않습니다.

(편집 # 2) :이 질문에 표시된 것처럼 전역 변수에 액세스하기위한 솔루션을 시도했습니다 . 다중 사이트에서 다시 쓰기 규칙을 안정적으로 플러시하는 방법은 무엇입니까? -이것을 보여주기 위해 위의 코드 예제를 업데이트 할 것입니다. 불행히도 CPT를로드하려고 할 때 여전히 404 오류가 발생합니다. 다시 쓰기 규칙이 데이터베이스에 저장되어 있고 사용되지 않는 것 같습니다. 나는 길을 잃었다.



답변

flush_rewrite_rules함수는 테마 또는 플러그인을 기반으로하는 플러그인과 같은 일부 컨텍스트에서 신뢰할 수 있지만 작동하는지 확실하지 않습니다.mu-plugin

내 진술은 WordPress가 다음과 같이 초기화되었다는 사실에 근거합니다.

  • 부르는 wp-settings.php파일을
  • do_action( 'muplugins_loaded' );후크를 호출하면 플러그인이 초기화됩니다.
  • 전화 $GLOBALS['wp_rewrite'] = new WP_Rewrite();여기 방법은 flush_rules지금부터 초기화로 볼 수 있습니다
  • do_action( 'setup_theme' );이 후크에서 flush_rewrite_rules의지가 작동 하는 모든 돈을 걸었 습니다.

해결책?

개인적으로 rewrite_rules 옵션을 확실하게 삭제했습니다.

delete_option('rewrite_rules');

또는

update_option('rewrite_rules', '' );

워드 프레스가 부족할 때마다 rewrite_rules다시 빌드 할 것입니다. 이것도 flush_rules방법입니다.

WordPress 실행 흐름에는 이와 같은 기능을 사용할 수없는 지점이 있습니다. WordPress의 핵심 에서도이 진술을 발견했습니다.

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

유일한 문제는 성능 일 것입니다. 모든 요청에 ​​대해이 작업을 수행하지 마십시오. 보시다시피 첫 번째 호출에서만 플러시하고 싶습니다. 이것은 좋습니다.

추신 : 나는 그런 자체 프로모션 팬이 아니지만 오래 전에이 기사 를 작성 했으며 여전히 이것에 대해 서 있다고 생각합니다.


답변

mu-plugin에 옵션이있는 경우 업데이트 후 즉시 플러시를 배치합니다.

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();


답변