web-dev-qa-db-ja.com

メインエリをカスタムクエリに置き換える

メインのクエリを自分のカスタムクエリに置き換えます。事は私が手動ページングの煩わしさを通過したくないということです。私はフィルタposts_resultsがあることを知っていますが、私はそれを正確に使用する方法がわからない、私はそれにたくさんの情報を見つけることができませんでした。 pre_get_postsはクエリを完全に置き換えるのではなく、単にクエリを変更するだけのようです。クエリを$postsにダンプしようとしましたが、ページングが失われました。これを回避する方法はありますか?

私は$posts = wpdb->get_results($query);を使ってメインのクエリを自分のものに置き換えます。

$queryは私のカスタムSQLです。 get_header()の真下にスニペットを追加しています。カスタム分類法ページのメインクエリを編集しようとしています:taxonomy-mytax.php

状況

現在私のクライアントは製造業者(分類学)と製品(分類学)そして実際の製品(カスタム投稿タイプ)を持っています。彼らは、最も有利な製造業者による分類順に(製品カテゴリページ - taxonomy-producttax.phpに)製品の投稿を表示するように要求しました(分類法)。だから私は彼らが注文を宣言する番号を設定することができる製造業者の分類法に特別なフィールドを追加しました。この番号は$wpdb->terms.term_groupに保存されます。それでは、Product Categoryページで、メインのクエリを、すべての製品を取得して製造元のterm_groupの順序で並べるまったく新しいクエリに完全に置き換えようとしています。製品と製造業者の両方(両方の分類法)に注文があり、どちらも$wpdb->terms.term_gruopに入れられて面倒でした。うまく機能するカスタムクエリを作成し、製造元の投稿をterm_groupの順番で表示します。 taxonomy-producttax.phpのメインのクエリを自分のカスタムSQLクエリに置き換えるだけですが、手動のページングには入りたくありませんでした。Wordpressに組み込まれているものを使用したいのです。

2
Howdy_McGee

メインクエリを$wpdbの出力に置き換えることはできません。主なクエリはWP_Queryオブジェクトです。 $wpdbは単純な配列またはオブジェクトを返しますが、WP_Queryオブジェクトは返しません。

たとえあなたが生のSQLを問い合わせに入れることができたとしても(私の頭の後ろにある何かはあなたがそうすることができると私に思わせるが私はそれに誓うことはできない) var_dump($wp_query);を試すと、単なるSQLクエリ以外にも多くのことが行われていることがわかります。オブジェクトを機能させるには、必要なページ区切りを含め、その他すべてのものを正しく設定する必要があります。

pre_get_postsオブジェクトを変更するには、それを置き換えるのではなく、posts_whereおよびおそらくWP_Queryのような他のクエリフィルタを使用する必要があります。 @Miloと@ChipBennettが要求したような詳細を知らずにあなたが提供することを躊躇しているのであれば、もっと多くの答えを与えることは不可能になるでしょう。

3
s_ha_dum

それは分類学のアーカイブページです。私の質問がするのは、ユーザーが設定したカテゴリー順で投稿を並べることです...だから私はselect、join、where、orderを変更する必要があります。

実際のコードを見なくても、より正確な答えを出すことは困難です。ただし、 pre_get_posts actionフック以外に、 WordPressには、クエリをもっと早く操作するためのフィルタ がいくつかあります。

あなたのニーズに合うようにメインのクエリを操作できないという本当の理由はほとんどありません。

だから私は彼らが注文を宣言する番号を設定することができる製造業者の分類法に特別なフィールドを追加しました。この番号は$wpdb->terms.term_groupに保存されます。それでは、Product Categoryページで、メインのクエリを、すべての製品を取得して製造元のterm_groupの順序で並べるまったく新しいクエリに完全に置き換えようとしています。製品と製造業者の両方(両方の分類法)に注文があり、どちらも$wpdb->terms.term_gruopに入れられて面倒でした。うまく機能するカスタムクエリを作成し、製造元の投稿をterm_groupの順番で表示します。

1
Chip Bennett