私の目標は、新しい書き換え規則に基づいてカスタムテンプレートにリダイレクトすることです。ただし、不適切なクエリを行うためのワードプレスは必要ありません。
私のコード:
function add_rewrite_rules() {
add_rewrite_rule(
'^settore/([^/]*)/?$',
'index.php?settore=$matches[1]',
'top'
);
add_rewrite_tag('%settore%','(caldareria|tessile)');
}
add_action( 'init', 'add_rewrite_rules' );
function set_root_category_template($template){
$settore = get_query_var('settore');
if($settore != '') $template = locate_template('root-taxonomy.php');
return $template;
}
add_filter('template_include','set_root_category_template',99);
それはちょうどリダイレクトしますが、root-taxonomy.phpの$ wp_query-> postsをチェックすると、通常の投稿のリストが表示されます。代わりに、そのページで私はいくつかの特定の分類学用語データを尋ねるカスタムクエリを作ります、そしてそれ故に、デフォルトクエリは全く役に立ちません。どうすれば止められますか?結局、私はindex.phpにデフォルトのクエリ変数を渡していないので、wpがまだクエリを実行している理由を理解できません。
メインのクエリを実行するためにWordPressを停止するのは困難です。あなたはWordPressの深い心の中を掘る必要があります。
WordPressフロントエンドのワークフロー:
wp-blog-header.php
関数wp()
を呼び出すwp()
functionは wp class のインスタンスを作成し、それに対してmain()
メソッドを呼び出すmain()
メソッドコード:
public function main($query_args = '') {
$this->init();
$this->parse_request($query_args); // build query vars starting from url
$this->send_headers();
$this->query_posts(); // run main query via WP_Query using built query vars
$this->handle_404(); // if query has no results set 404 headers and WP_Query props
$this->register_globals();
}
クエリに基づいてテンプレートファイルをロードするwp-blog-header.php
include template-loader.php
そのため、メインクエリを停止する唯一の方法は、wp()
を実行できないようにすることです。
それは早いフックをフックして、あなたが必要とすることをして、そして最後にexit()
をすることで行うことができます。
このアプローチの問題は、wp()
が実行できなくなり、wpクラスがリクエストを解析できなくなるため、追加した書き換えファイルが解析されないことです。
そのため、書き換えタグと書き換え規則を追加する代わりに、 url を直接調べて、それがカスタムアクションをトリガーするものかどうかを選択することをお勧めします。
まず最初に、URLの相対的な部分だけを返す関数を書きましょう。現在のURLがexample.com/wp/path/to/somewhere?foo=bar
のようなもので、あなたのホームURLがexample.com/wp/
の場合、関数はpath/to/somewhere
を返します。
function get_relative_url() {
$home_path = rtrim( parse_url( home_url(), PHP_URL_PATH ), '/' );
$path = trim( substr( add_query_arg( array() ), strlen( $home_path ) ), '/' );
$qs = array_keys( $_GET );
if ( ! empty( $qs ) ) {
$path = remove_query_arg( $qs, $path );
}
return $path;
}
これで、アーリーフックを使ってURLを調べることができます。そして、それが目的のパスを含んでいる場合に限り、$settore
変数を設定し、テンプレートをロードして終了します。
add_action( 'wp_loaded', function() { // 'wp_loaded' hook happen before wp() is ran
$path = get_relative_url();
$url_parts = explode( '/', $path );
if (
isset( $url_parts[1] )
&& $url_parts[0] === 'settore'
&& in_array( $url_parts[1], array( 'caldareria', 'tessile' ), TRUE )
) {
// ok the current url is something like example.com/settore/tessile
// and 'tessile' is in the variable $url_parts[1]
$template = locate_template( 'root-taxonomy.php' );
if ( empty( $template ) ) return; // do nothing if template not found
global $settore;
$settore = $url_parts[1]; // in the template you can access to $settore variable.
require_once $template;
exit(); // prevent WordPress to do anything else
}
} );
それで全部です。
上のコードでは、現在のURLがright oneであるかどうかを理解し、$settore
変数を設定するのは簡単でした。url構造は簡単だったためです。 symfonyルーティングコンポーネントのようなツール URLをいくつかの変数にマッチさせる。
このアプローチは私が Cortex で使っていたものです、あなたが普通そのようなことをするつもりならばそこを見てください。
ご覧のとおり、私が投稿したコードのメインクエリ(global $wp_query
)は使用されていません。テンプレートでは空のWP_Query
オブジェクトになります。 is_tax()
、is_archive()
などのテンプレートタグは機能しません。
おそらく、あなたの 'root-taxonomy.php'ではget_header()
とget_footer()
を使うでしょうから、それはheaderとfooterにも当てはまります。
また、プラグインによっては正しく動作しない場合があります。クエリに基づいてタイトルタグを設定するSEOプラグインを使用している場合は、問題が発生します。
考えられる解決策は、手動でglobal $wp_query
にアクセスする主要なクエリプロパティを設定するか、カスタムヘッダーを使用することです。 get_header('root-tax')
、あなたのカスタムテンプレートのために、そしてheader-root-tax.php
カスタムタイトルタグおよび/または他の問題で処理します。
どうしてこんな感じじゃないの?
add_action( 'pre_get_posts', 'my_post_queries' );
function my_post_queries( $query ) {
if ($query->is_main_query() && !is_admin()) {
// maybe check for specific page here
// if (is_tax('your-taxonomy') {
$query = false;
remove_all_actions ( '__after_loop');
// }
}
}
それとも私はその質問を誤解しましたか?