わかりましたので、私の質問は非常に簡単です。プラグインにカスタムルーティングルールを実装する必要があります。これらのルートは引数を1つだけ取るので(複雑ではない)、次のようになります。http://www.example.org/myroute/myargument
そして理想的には、これはカスタムクラスを呼び出し、カスタムテンプレートを表示します(それはクラスに直接アクセスできます)。
これのための最良のアプローチは何ですか?乾杯
わかりましたので、私の質問は非常に簡単です。プラグインにカスタムルーティングルールを実装する必要があります。これらのルートは引数を1つだけ取るので(複雑ではない)、次のようになります。http://www.example.org/myroute/myargument
そして理想的には、これはカスタムクラスを呼び出し、カスタムテンプレートを表示します(それはクラスに直接アクセスできます)。
これのための最良のアプローチは何ですか?乾杯
回答:
次の3つの重要なことを行う必要があります。
index.php
。myroute
しmyargument
て、WordPressがクエリ文字列に表示されたときにそれらを無視しないようにします。まず、の代わりに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
。
クエリ変数myroute
とmyargument
ホワイトリストに追加すると、WordPressはそれらを破棄するのではなく、それらに注意を向けさせます。
カスタムルートを「名前空間」する別の方法
/api/
接頭辞としての使用を避けたい場合は、代わりにクエリ文字列変数/フィールドを使用できます。そのようなことを行うには、次のようなものに正規表現を変更します(.*?)/(.+?)\\?api=1
し、その後の追加api
に追加するパラメータとしてarray_push()
で行われたコールmy_insert_query_vars()
。
これによりカスタムルートが変更され、いつでもトリガーされるようapi=1
になりますhttp://example.com/anytext/anytext?api=1
。たとえば、のトリガーになるクエリ文字列の最初の要素です。
「名前空間」という用語の使用は無視してください。簡潔にするために使用しているだけです。
プレフィックスまたはサフィックスのいずれかで「名前空間」を指定しないと、URIパターンが衝突することになります。これは、WordPressがカスタムパターンを投稿またはページとして意図されたものと区別する方法がないためです。WordPressはそれmyroute
が分類法、用語、または親ページではないことをどのようにして知るのでしょうか?
お役に立てれば。
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' ) );
add_rewrite_endpoint
、ルールを生成し、クエリ変数を一度に追加することもできます。また、独自の書き換えルールを追加する場合はadd_rewrite_rule
、フィルタリングではなく関数をお勧めしますrewrite_rules_array
。
my_insert_rewrite_rules
順序に従って定義されています!最初に最も長いルールから始めて、次に最も単純なルールまで作業を進めます。そうでない場合、/ api / myrouteは/ api / myroute / myargumentをオーバーライドします。