さて、私の質問はとても簡単です。私は自分のプラグインにいくつかのカスタムルーティングルールを実装する必要があります。これらの経路はただ1つの引数を取るだけなので(複雑なことではありません)、 http://www.example.org/myroute/myargument のようになります。
そして理想的には、これはカスタムクラスを呼び出し、カスタムテンプレートを表示します(それは直接クラスにアクセスすることができます)。
これに対する最善のアプローチは何ですか?乾杯
あなたは3つの重要なことをする必要があります。
myroute
とmyargument
をwordpressへのクエリ変数として追加すると、書き換え規則によって何かが渡されるときに、それらが有効な$ _GETパラメータであることがわかります。まず、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文字列内の後方参照に渡します。
クエリ変数を追加しても、myroute
とmyargument
はindex.phpが扱うことができるようになります。
あなたのカスタムルートを「ネームスペース」する別の方法
接頭辞として/api/
を使用したくない場合は、代わりにクエリ文字列varを使用できます。そのようなことをするには、正規表現を(.*?)/(.+?)\\?api=1
のようなものに変更してから、my_insert_query_vars()
のarray_Push
関数に追加パラメーターとしてapi
を追加します。
それはhttp://example.com/anytext/anytext?json=1
があるときはいつでも引き起こされるカスタムルートを変更するでしょう。
「名前空間」という用語の使用は無視してください。簡潔にするために使用しています。
あなたが接頭辞や接尾辞のどちらかで '名前空間'をいけないなら、あなたは衝突するURIパターンで終わるでしょう。これはWordPressがあなたのカスタムパターンを投稿やページを意図したものと区別する方法がないためです。その「myroute」が分類法でも用語でも親ページでもない場合、Wordpressはどのようにしてそれを知るのでしょうか。
お役に立てれば。
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' ) );