web-dev-qa-db-ja.com

Wordpressのカスタムプラグインルート

さて、私の質問はとても簡単です。私は自分のプラグインにいくつかのカスタムルーティングルールを実装する必要があります。これらの経路はただ1つの引数を取るだけなので(複雑なことではありません)、 http://www.example.org/myroute/myargument のようになります。

そして理想的には、これはカスタムクラスを呼び出し、カスタムテンプレートを表示します(それは直接クラスにアクセスすることができます)。

これに対する最善のアプローチは何ですか?乾杯

10
Fran

あなたは3つの重要なことをする必要があります。

  1. URIの一部をindex.phpに渡される値に変換するためのカスタム書き換えルールを作成します。
  2. myroutemyargumentをwordpressへのクエリ変数として追加すると、書き換え規則によって何かが渡されるときに、それらが有効な$ _GETパラメータであることがわかります。
  3. 書き換えルールをフラッシュします。

まず、http://www.example.org/myroute/myargumentの代わりに、URIをこれらの特別な「ルート」の1つと見なすべき時期を示すために、ある種の特別なプレフィックスまたはサフィックスを使用することをお勧めします。この例のために、接頭辞apiを選択したので、http://www.example.org/api/myroute/myargumentになります。私はapiを選んだのは、私があなたが取り組んでいるように見えるような安らかなことをしたとき、それはAPIのためだったからです。

コード

add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_filter( 'query_vars','my_insert_query_vars' );
add_action( 'wp_loaded','my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules(){
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules )
{
    $newrules = array();
    $newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars )
{
    array_Push($vars, 'myroute', 'myargument');
    return $vars;
}

クイックブレークダウン

そのすべてはかなり単純明快で、正規表現パターンはWordPressのすべての書き換え規則のリストに追加されており、あなたのカスタムパターンはリストの先頭にあります。パターンと一致すると、WordPressは検索を中止し、キャプチャされた値をindex.php文字列内の後方参照に渡します。

クエリ変数を追加しても、myroutemyargumentはindex.phpが扱うことができるようになります。

あなたのカスタムルートを「ネームスペース」する別の方法

接頭辞として/api/を使用したくない場合は、代わりにクエリ文字列varを使用できます。そのようなことをするには、正規表現を(.*?)/(.+?)\\?api=1のようなものに変更してから、my_insert_query_vars()array_Push関数に追加パラメーターとしてapiを追加します。

それはhttp://example.com/anytext/anytext?json=1があるときはいつでも引き起こされるカスタムルートを変更するでしょう。

「名前空間」という用語の使用は無視してください。簡潔にするために使用しています。

あなたが接頭辞や接尾辞のどちらかで '名前空間'をいけないなら、あなたは衝突するURIパターンで終わるでしょう。これはWordPressがあなたのカスタムパターンを投稿やページを意図したものと区別する方法がないためです。その「myroute」が分類法でも用語でも親ページでもない場合、Wordpressはどのようにしてそれを知るのでしょうか。

お役に立てれば。

12
eddiemoya

Eddiemoyaが上で行ったことを少し拡張するには:

この質問の元のポスターのように、私はカスタムリライトを作成し、そのリライトページのカスタムテンプレートも提供したいと思いました。 edditmoyaからのコードで私は正しい方向から始めました、そして私はページがアクセスされたときに私のカスタムテンプレートを提供するための特別な機能を追加しました。

カスタムテンプレートはどこにでも置くことができます。私の場合はカスタムテンプレートはプラグインディレクトリに格納されています。

また、プラグインのアクティブ化中に書き換えルールをフラッシュする必要があるかどうかだけをチェックしたいので、それをregister_activation_hookに設定しました。

私がしたことの完全な例については以下を見てください:

_更新_ / miloからのアドバイスに基づいて簡略化

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );
4
Matt Keys