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


12

わかりましたので、私の質問は非常に簡単です。プラグインにカスタムルーティングルールを実装する必要があります。これらのルートは引数を1つだけ取るので(複雑ではない)、次のようになります。http//www.example.org/myroute/myargument

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

これのための最良のアプローチは何ですか?乾杯

回答:


15

次の3つの重要なことを行う必要があります。

  1. URIの一部をに渡される値に変換するカスタムの書き換えルールを作成しますindex.php
  2. WordPressのクエリ変数のホワイトリストにを追加myroutemyargumentて、WordPressがクエリ文字列に表示されたときにそれらを無視しないようにします。
  3. 書き換えルールをフラッシュします。

まず、の代わりにhttp://www.example.org/myroute/myargument、URIをこれらの特別な「ルート」の1つと見なす必要があることを示す、ある種の特別なプレフィックスまたはサフィックスを決めることをお勧めします。この例のために、私は接頭辞を選んだapi、それはなるように、http://www.example.org/api/myroute/myargument。私が選んだのはapi、あなたが取り組んでいるように見えるようなRESTfulなことをするとき、それは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は書き換えルールのリストの検索を停止し、に渡されるクエリ文字列の参照($matches[1]$matches[2])の代わりに正規表現のキャプチャされた値を使用しますindex.php

クエリ変数myroutemyargumentホワイトリストに追加すると、WordPressはそれらを破棄するのではなく、それらに注意を向けさせます。

カスタムルートを「名前空間」する別の方法

/api/接頭辞としての使用を避けたい場合は、代わりにクエリ文字列変数/フィールドを使用できます。そのようなことを行うには、次のようなものに正規表現を変更します(.*?)/(.+?)\\?api=1し、その後の追加apiに追加するパラメータとしてarray_push()で行われたコールmy_insert_query_vars()

これによりカスタムルートが変更され、いつでもトリガーされるようapi=1になりますhttp://example.com/anytext/anytext?api=1。たとえば、のトリガーになるクエリ文字列の最初の要素です。

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

プレフィックスまたはサフィックスのいずれかで「名前空間」を指定しないと、URIパターンが衝突することになります。これは、WordPressがカスタムパターンを投稿またはページとして意図されたものと区別する方法がないためです。WordPressはそれmyrouteが分類法、用語、または親ページではないことをどのようにして知るのでしょうか?

お役に立てれば。


1
便利なメモ:ルールは定義のmy_insert_rewrite_rules順序に従って定義されています!最初に最も長いルールから始めて、次に最も単純なルールまで作業を進めます。そうでない場合、/ api / myrouteは/ api / myroute / myargumentをオーバーライドします。
2014

1
@npcカスタム書き換えルールを作成するときに注意すべき重要な点ですが、それらもそのように衝突する可能性があります。ただし、上記の例では、/ api / myrouteは単に有効なパスではないため、これは問題になりません。
eddiemoya 14

example.org/api/myroute/myargumentページがリクエストされたときに、プラグインディレクトリからカスタムテンプレートをロードするにはどうすればよいですか?
Matt Keys

1
wordpressによる実際の完全なソリューションは次のとおり
Imran Zahoor

6

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' ) );

1
を使用してadd_rewrite_endpoint、ルールを生成し、クエリ変数を一度に追加することもできます。また、独自の書き換えルールを追加する場合はadd_rewrite_rule、フィルタリングではなく関数をお勧めしますrewrite_rules_array
ミロ

Miloに感謝します。コードを更新して、rewrite配列をフィルタリングする代わりにadd_rewrite_ruleを使用しました。私はadd_rewrite_endpointを見ましたが、私のニーズにはadd_rewrite_tagの方が適していると思います。add_rewrite_endpointは、既存のWPリライトに追加の引数を追加したい場合に、ほとんど役に立ちます。私がここで間違っていたら訂正してください。
Matt Keys

1
オブジェクト指向のアプローチが好きです。あまりにも多くのWP開発者は、まだOOPの使用方法を知りません。PHP開発者に私の信念を取り戻そうとしてくれてありがとう。;)
Arvid、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.