다중 사이트에서 다시 쓰기 규칙을 안정적으로 플러시하는 방법은 무엇입니까?


20

다시 쓰기 규칙을 플러시해야하는 플러그인이 있다고 가정 해 보겠습니다. 활성화 훅과 플러시 늦게 추가하면 모든 것이 원활하고 호환됩니다.

그리고 어느 날 누군가가 여러 사이트에서 그것을 실행하려고합니다.

다음과 같은 간단한 시나리오 대신

  1. 워드 프레스 사이트가 생성됩니다
  2. 플러그인 설치 및 활성화

이제 다음과 같은 악몽 시나리오가 있습니다.

  1. 플러그인 설치 및 네트워크 활성화
  2. 멀티 사이트에 새로운 워드 프레스 사이트 (또는 100 개)가 생성됩니다

이론적으로는 효과가 있습니다. 실제로 그것은 놀라운 방식으로 잘못됩니다.

  • $wp_rewrite 상태가 잘못된 사이트 일 수 있습니다
  • switch_to_blog() 다시 쓰기 상태도 추적하지 않습니다
  • "나중에"부분은 완전히 다른 블로그에서 발생할 수 있습니다
  • 다른 모든 플러그인은 다른 사이트에서 일관되게 활성화되지 않을 수도 있습니다.

예를 들어, 새로운 사이트가 생성 될 때마다 기본 사이트에서 퍼머 링크가 제대로 작동하지 않는 방법을 알 수 있습니다 .

따라서 다중 사이트에서 플러그인이 다시 쓰기 규칙 안정적으로 플러시 하는 방법은 무엇 입니까 ?

  1. 새 사이트를 만들 때 사이트에 대해?
  2. 기존 사이트가 비활성 상태에서 활성화되면 해당 사이트에 대해
  3. 플러그인이 네트워크 활성화되면 모든 사이트에 대해?
  4. 플러그인이 네트워크 비활성화되면 모든 사이트에 대해?
  5. 다른 시나리오에서 전역 컨텍스트 다시 쓰기가 변경되는 것을 포함합니까?

답변:


11

참고 : 이것은 불완전한 답변으로 점진적으로 확장 될 것입니다


멀티 사이트에서 재 작성 규칙을 플러시 할 수있는 신뢰할 수있는 유일한 방법은 기본 및 / 또는 다른 블로그 컨텍스트의 퍼머 링크 구조를 손상시키지 않으면 서 (어떻게 어떻게 전환하는지에 따라) 주어진 컨텍스트에서 재 작성 규칙을 플러시하는 것입니다. :

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

위의 내용은 다시 쓰기 규칙을 구성하고 데이터베이스에 변경 사항을 커밋하기 전에 주어진 컨텍스트에 대한 올바른 퍼머 링크 구조가 검색 및 설정되도록합니다.

하나의 컨텍스트 만 있기 때문에 컨텍스트가 중요하지 않은 단일 사이트에는 적용되지 않습니다.

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();
}

이 라인을 더 발전시키기 위해 첫 번째 관심사를 다루면서

따라서 다중 사이트 에서 플러그인이 다시 쓰기 규칙을 안정적으로 플러시하는 방법은 무엇 입니까 ?

  • 새 사이트를 만들 때 사이트에 대해?

이 과정에서 워드 프레스 코어가 주목할만한 사항을 살펴 보자.

  • 먼저 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 문제 내에서 입증 된 문제 에서 사용자가 다음과 같은 동작을 경험 한 이유는 다음과 같습니다.

새 사이트를 만들면 최상위 사이트에서만 게시물 수준 퍼머 링크가 끊어집니다.

이 두 형식은 올바르게 작동합니다.

기본값-예상대로 작동

요일 및 이름-예상대로 작동

... 기본 블로그에 Day & Name Permalink 구조 /%year%/%monthnum%/%day%/%postname%/가있는 경우 새 사이트가 작성 될 때 /%year%/%monthnum%/%day%/%postname%/기본적으로 Day & Name Permalink 구조 가 있으므로 Yoast SEO 플러그인이 다시 쓸 때 눈에 띄는 문제가 발생하지 않습니다. shutdown후크 규칙 .


맞습니다. 새 사이트를 설치할 때 성가신 것은 프로세스가 완료된 후에 만 ​​프로세스 중에 연결할 수 없다는 것입니다. 이로 인해 규칙이 두 번 플러시됩니다.
Anton Timmermans

바운티 타임이 소진되었으므로 여기에 칼이 떨어질 것입니다. :) 아직도 많은 것을 알아낼 수 있습니다. :(
Rarst

$wp_rewrite각 네트워크 사이트를 반복하여 재설정 할 수 있도록 컨텍스트를 수동으로 설정할 수 없습니까? 사용자 정의 플러그인에서 일부 영구 링크 문제로 고통받는 대규모 네트워크 사이트가 있습니다. cron을 추가하는 플러그인을 만드는 것은 항상 재설정하는 것처럼 과도한 것으로 보입니다. 사용자 정의 URL을 사용하여 루핑하는 것이 이상적이지만 모든 사이트에서이를 수행하는 방법을 모르겠습니다.
Adam Patterson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.