web-dev-qa-db-ja.com

最大価格メタ値を取得するための新しいWP_Queryが機能しない

だから、私はすべての「プロパティ」(カスタム投稿タイプ)の最大価格を取得しようとしています。

$max_price_query = new WP_query(array(
    'posts_per_page' => -1,
    'post_status' => 'publish',
    'post_type' => 'properties',
    'nopaging' => true,
    'orderby' => 'meta_value_num',
    'meta_key' => '_price',
    'order' => 'DESC',
));

if ($max_price_query->have_posts()) {
    while ($max_price_query->have_posts()) : $max_price_query->the_post();
        $pid = $post->ID;
        $price_max = get_post_meta($pid, '_price', true);
        echo '<pre>' . $pid . '</pre>';
    endwhile;
    wp_reset_postdata();
}

最初の問題は、価格ではなくID順に並べられていることです。プロパティはプロパティ1、プロパティ2などと呼ばれます。この場合、ID順==タイトル順==日付順になっています。

2つ目の問題は、ID順に並べる前に、実際には_featured_propという別のmeta_value(0または1)の順に並んでいることです。まあこれは私が次のものを持っているからです。

 function set_query_parameters($query) {
    if( !is_admin() &&  is_main_query() && is_post_type_archive( 'properties' ) ) {
        $query->set('meta_key', '_featured_prop');
        return $query;
    }
      add_action( 'pre_get_posts', 'set_query_parameters' );

Ifステートメントで 'is_main_query()'を指定しているので、なぜこのpre_get_postsが私の新しいWP_Queryに影響を与えているのか理解できません。私はsecondary_queryには影響しないと思いました。

IDをエコーすると、基本的に26、24、20、27、25、23、22、21、19が得られます。ここで、26、24、20は、_featured_prop = 1です。

違いがある場合、最初のコードスニペットは、archive-properties.phpに呼び出されているsidebar.phpファイルで呼び出されています。他の場所では、関数ファイルの2番目のコードスニペットでfunctionを呼び出しています(アーカイブページをロードする前にpre_get_postsのadd_actionを実行できないため)。

誰かが私に手助けをしてくれる?

1
Joel M

@ Milo が提案し、それも文書化しているように is_main_query Under_the_Hood

この関数はメソッドWP_Query::is_main_query()のエイリアスです。 WP_Queryなどのpre_get_postsオブジェクトを渡されるフィルタまたはアクションフックコールバックでは、この関数を呼び出すのは循環的です。代わりに、渡されたオブジェクトのメソッドを直接呼び出します。たとえば、フィルタコールバックで、渡されたWP_Queryオブジェクトを$queryに割り当てる場合は、次のようにメソッドを呼び出します。$query->is_main_query()

に導いたら変えなければならない

function set_query_parameters($query) {
    if( !is_admin() &&  $query->is_main_query() && is_post_type_archive( 'properties' ) ) {
        $query->set('meta_key', '_featured_prop');
    }
}
add_action( 'pre_get_posts', 'set_query_parameters' );

クエリを返す必要はありません。そして、WordPressがこのように_doing_it_wrong()を使用するとis_main_query()をトリガーするので、なぜあなたがあなたが通知を受け取らないのか本当に疑問に思います!

1
Sumit