web-dev-qa-db-ja.com

$ wp_queryの開始?

WordPressがグローバルな$wp_queryを設定し、has_posts()the_post()関数を使えるようにするためのメインクエリをいつ開始するのでしょうか。アーカイブテンプレートを使用してページを作成した場合、クエリを設定する方法はどのようにしてわかりますか?

私は archive.php をWordPressのデフォルトテーマの一つで見ています。アーカイブページがありますが、get_header()has_posts()を呼び出すだけなので、クエリはすでに設定されています。それでWordPressはURLでカスタム投稿タイプのパラメータを使うようにURLをルーティングしますか?

カスタムアーカイブページを作成する場合は、メインのクエリをどこで変更すればよいですか。新しいアーカイブテンプレートファイルでは?

4
TurtleTread

User Rarst非常に有名な答えを持っています 彼はどこにレイアウトしています ロードプロセスwp-blog-header.php がロードされるたびにこのグラフを見ると、$post$wp_queryのような多くのWordPressグローバルを設定する関数wp()が呼び出されます。 ( 二次参照 ユーザー別 Gmazzap

これは技術的な面ですが、質問の中心は独自のカスタムアーカイブページを作成することです。 WordPressには テンプレート階層 があり、カスタム投稿タイプなどのために カスタムアーカイブ を作成できます。

メインのクエリを変更するもう1つの一般的な方法は、 pre_get_posts というfunctions.phpファイルで Hook を使用することです。これにより、WordPressが実際にデータベースにpingを実行して情報を取得する前にクエリオブジェクトを変更して、さまざまな設定でThe Loopを簡単に変更できるようになります。デフォルトの10の代わりに20の投稿を表示するようにループを変更する例は次のようになります。

function wpse_265733( $query ) {

    // Don't run on admin
    if( $query->is_admin ) {
        return;
    }

    // Run only on the blog page
    if( is_home() ) {
        $query->set( 'posts_per_page', 20 );    // Set posts per page to 20.
    }

}
add_action( 'pre_get_posts', 'wpse_265733' );
2
Howdy_McGee

プラグインとテーマ関数がロードされた後、WordPressは書き換え規則のリストをたどって要求に一致するパターンを見つけることによって、入ってくる要求をクエリ変数に解析します。

組み込みの型ページ、さまざまなアーカイブ、単一ビュー、ページ編集、フィードには、デフォルトの規則がいくつかあります。独自のルールやエンドポイントを手動で追加することも、カスタムコンテンツ用にこれらすべてのルールを自動生成できる新しいコンテンツタイプを登録することもできます。

リクエストがクエリ変数に変換されると、クエリが実行されます。多くの場合、クエリの結果によって、どのテンプレートが読み込まれるかが決まります。

それからもちろんテンプレートがロードされ、すべてがうまくいっています。

そうは言っても、あなたがすべてのステップで物事を修正することを可能にするために利用可能な多くのアクションとフィルタがあります。プロセスのより詳細な見方とそれらのいくつかが何かを見るために、 Action Reference を見てください。

最も簡単で一般的な方法は pre_get_posts action です。これによりクエリ変数が公開され、クエリを実行する前に変更を加えることができます。クエリ変数の参照については WP_Query を参照してください。

それがあなたのニーズを満たさない場合は、 request filter を見てください。これは、WordPressが起こっているリクエストのタイプについて決定を下す前に、クエリvar抽出の直後に実行されるので、より根本的なクエリ操作を可能にします。

3
Milo