Status = currentの調査のみを表示するようにarchive_research.phpをフィルタリングしようとしています。
Functions.phpで:
add_action( 'pre_get_posts', 'only_current' );
function only_current( $query ) {
if ( $query->is_main_query() ) {
$args = array(
'post_type' => 'research',
'tax_query' => array(
array(
'taxonomy' => 'status',
'field' => 'slug',
'terms' => 'current',
),
),
);
$query = new WP_Query( $args );
}
}
Archive-research.phpでは、
// theloop
if ( have_posts() ) : while ( have_posts() ) : the_post();
// print title etc
結果:research archiveはすべての研究を表示します。
私はこれの多くのわずかな変更を試みました。読みやすさのために、私はたくさんの冗長なコードを貼り付けることなくここでそれらを合計しようとします:
$query = new WP_Query( $args )
を$query->set('meta_query', $args)
または$query->set($args)
と置き換えます。同じ結果have_posts()
とthe_post()
を$wp_query->have_posts()
と$wp_query->the_post()
に置き換えます。同じ結果// theloop
の前にdo_action('only_current')
への呼び出しを追加する..同じ結果したがって、ここでの共通のテーマは、私が何をしても同じ結果が得られるということです。私には欠けている非常に明白な解決策がなければなりません、そして誰かがそれを指摘できれば私は本当にそれを感謝するでしょう。
有用なデバッグ情報の最後の部分:
string(222) "SELECT SQL_CALC_FOUND_ROWS wp_posts.ID wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'research' AND(wp_posts.post_status = 'パブリッシュ' OR wp_posts.post_status = 'プライベート' BY BY wp_posts.post_date DESC LIMIT 0、10 "
これは// theloop
の前にecho var_dump($wp_query->request)
を呼び出した結果です。
既存のクエリを変更するのではなく、新しいクエリを作成しています。
pre_get_postsコーデックスページ には、$ query引数が参照渡しであることを説明しているので、直接変更する必要があります。グローバルを宣言したり値を返したりする必要はありません。関数を次のように更新してください。
add_action( 'pre_get_posts', 'only_current' );
function only_current( $query ) {
if ( is_admin() ) {
return;
}
if ( ! $query->is_main_query() ) {
return;
}
if ( ! is_post_type_archive( 'research' ) ) {
return;
}
$tax_query = array(
array(
'taxonomy' => 'status',
'field' => 'slug',
'terms' => 'current',
),
);
$query->set( 'tax_query', $tax_query );
}
pre_get_posts
フィルタは管理者内のクエリにも適用されるので、サイトのフロントエンドにいるかどうかを確認するために別のifステートメントを追加しました。
私たちがresearch
アーカイブページにいることを確認するためのステートメントも追加しました。
上記の関数はあなたのfunctions.php
ファイル、またはサイト固有のプラグインに入れる必要があります。 archive-research.php
ファイルに配置しても、archive-research.php
テンプレートがロードされるまでにクエリが実行されるため、うまくいきません。