programing

WordPress 플러그인에서 프로그래밍 방식으로 Mod Rewrite 규칙 추가

powerit 2023. 6. 27. 22:34
반응형

WordPress 플러그인에서 프로그래밍 방식으로 Mod Rewrite 규칙 추가

다음 샘플 플러그인은 다음에 사용자 지정 모드 다시 쓰기 규칙을 추가합니다..htaccess사용자가 영구 링크 설정을 변경할 때 사용합니다.

/* Plugin Name: Sample Mod Rewrite  */

add_action('generate_rewrite_rules', array(new custom_mod_rewrite, "generate_rewrite_rules"));

class custom_mod_rewrite {
    function __construct() {
        $this->wp_rewrite = & $GLOBALS["wp_rewrite"];
    }
    function generate_rewrite_rules() {

        $non_wp_rules = array(
            'simple-redirect/?$plugin_name' => 'http://google.com',
            'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
        );

        $this->wp_rewrite->non_wp_rules = $non_wp_rules + $this->wp_rewrite->non_wp_rules;
        add_filter('mod_rewrite_rules', array(&$this, "mod_rewrite_rules"));
    }
    function mod_rewrite_rules($rules) {
        return preg_replace('#^(RewriteRule \^.*/)\?\$plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
    }
}

제가 발견한 문제는 두 가지입니다.

  1. 기본 Permal 링크로 설정되어 있으면 규칙이 추가되지 않습니다.
  2. 더 중요한 것은 사용자가 퍼멀링크 설정을 변경하지 않는 한 규칙이 추가되지 않는다는 것입니다.(으로 해결 가능)$wp_rewrite->flush_rules()플러그인 활성화 시 수행됨)

#2의 경우, 프로그래밍 방식으로 규칙을 추가할 수 있는 좋은 방법이 있는지 궁금합니다.

IIS(윈도우즈 서버에서 일반적인)는 mod_rewrite를 지원하지 않습니다.

출처: http://codex.wordpress.org/Using_Permalinks#Permalinks_without_mod_rewrite

모든 시스템에서 사용하는 것은 아닌 것 같습니다..htaccess그래서 직접 편집합니다..htaccess파일이 분산 플러그인에 적합하지 않을 수 있습니다.몰라.아마도 서버가 Apache를 사용하는지, 그리고 만약 그렇다면 .htaccess가 쓰기 가능한지, 기존 규칙에 추가 규칙이 없는지 확인해야 할 것 같습니다. 그러면 마침내 규칙을 추가할 수 있습니다.또한 사용자가 플러그인을 비활성화할 때 규칙을 지워야 합니다.그래서 좀 곤란합니다.

만약 워드프레스가 내장된 API 같은 것으로 처리할 수 있다면 워드프레스에 맡기고 싶습니다.하지만 위의 예는 제가 지금까지 발견할 수 있었던 것입니다.그래서 당신의 정보에 감사드립니다.

갱신하다

스퍼펠이 제안했듯이, 저는 당신을 위해$wp_rewrite->flush_rules()그러나 #1 문제는 여전히 지속됩니다. 기본 Permal Link 설정을 사용할 때는 아무런 영향도 받지 않습니다.아이디어 있어요?

/* Plugin Name: Sample Mod Rewrite  */

$custom_mod_rewrite = new custom_mod_rewrite;
register_activation_hook( __FILE__, array($custom_mod_rewrite, 'flush_rewrite_rules'));
register_deactivation_hook( __FILE__, array($custom_mod_rewrite, 'flush_rewrite_rules'));
add_action('generate_rewrite_rules', array($custom_mod_rewrite, "generate_rewrite_rules"));

class custom_mod_rewrite {
    function __construct() {
        $this->wp_rewrite = & $GLOBALS["wp_rewrite"];
    }
    function flush_rewrite_rules() {
        $this->wp_rewrite->flush_rules();
    }
    function generate_rewrite_rules() {

        $non_wp_rules = array(
            'simple-redirect/?$plugin_name' => 'http://google.com',
            'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
        );

        $this->wp_rewrite->non_wp_rules = $non_wp_rules + $this->wp_rewrite->non_wp_rules;
        add_filter('mod_rewrite_rules', array(&$this, "mod_rewrite_rules"));
    }
    function mod_rewrite_rules($rules) {
        return preg_replace('#^(RewriteRule \^.*/)\?\$plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
    }
}

또한 플러그인을 비활성화해도 이전 규칙으로 다시 변경되지 않습니다.나는 단지 codex 예제를 따라 플러그인을 비활성화할 때 규칙을 플러시하도록 설정했을 뿐입니다.그래서 추가된 규칙을 삭제할 코드가 있어야 합니다.

참고로, 코덱스에 따르면,

다시 쓰기 규칙을 플러시하는 것은 많은 비용이 드는 작업입니다. ... 플러그인의 활성화 후크에서 다시 쓰기 규칙을 플러시하거나 다시 쓰기 규칙을 변경해야 합니다.

남은 문제:

  1. 기본 Permal 링크로 설정되어 있으면 규칙이 추가되지 않습니다.
  2. 플러그인을 비활성화해도 이전 규칙으로 다시 변경되지 않습니다.

안타깝게도 현재로서는 효과적인 해결책이 없는 것 같습니다.

일부 변경 사항을 추가한 후 다시 쓰기 규칙을 "수정"해야 합니다. http://codex.wordpress.org/Function_Reference/flush_rewrite_rules

여기에 설명된 것처럼 심포니의 라우팅 시스템을 사용할 수 있습니다. http://pookey.co.uk/wordpress/archives/80-playing-with-symfony-routing-without-symfony

간단한 플러그인을 작성하여 아이디어를 구현할 수 있습니다.

편집: .htaccess를 편집하는 플러그인이 이미 있습니다.http://plugins.svn.wordpress.org/wp-htaccess-editor/trunk/ 그것을 예로 들어보세요.

참고: .htaccess 직접 편집은 Apache 사용자가 파일에 대한 쓰기 액세스 권한을 가지고 있다는 것을 의미하며 이는 위험할 수 있습니다.하지만 당신은 이미 알고 있을 겁니다.;)

언급URL : https://stackoverflow.com/questions/12824334/adding-mod-rewrite-rules-programmatically-in-wordpress-plugin

반응형