web-dev-qa-db-ja.com

デフォルトのクエリを作成するためにwordpressを停止する方法

私の目標は、新しい書き換え規則に基づいてカスタムテンプレートにリダイレクトすることです。ただし、不適切なクエリを行うためのワードプレスは必要ありません。

私のコード:

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がまだクエリを実行している理由を理解できません。

4
Luca Reghellin

メインのクエリを実行するためにWordPressを停止するのは困難です。あなたはWordPressの深い心の中を掘る必要があります。

WordPressフロントエンドのワークフロー:

  1. wp-blog-header.php 関数wp()を呼び出す
  2. wp() functionは wp class のインスタンスを作成し、それに対してmain()メソッドを呼び出す
  3. 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();
    }
    
  4. クエリに基づいてテンプレートファイルをロードする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カスタムタイトルタグおよび/または他の問題で処理します。

4
gmazzap

どうしてこんな感じじゃないの?

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

それとも私はその質問を誤解しましたか?

1
Web-Entwickler