web-dev-qa-db-ja.com

Post_metaによる検索と分類法での投稿の順序

これを正しいやり方でやるかどうかはよくわからないが、テンプレートでの問い合わせから関数へのやり方がまったく異なるため、どちらのルートに進むのかわからない.

私は投稿をフィーチャーしたカスタム投稿タイプ(business)を持っています。これらの各投稿には "featured_listing" post_metaがあります。検索結果とカテゴリで、他のすべての投稿の上に空のpost_meta値がない投稿を表示します。

**値に_ではなく - を使用してください。

これは私がうまくいくかもしれないと思ったものですが、私は間違った木に吠えていると思っています。

// Order posts by meta data
function custom_special_sort( $query ) {
    //is this the main query and is this post type of post
    if ( $query->is_main_query() && $query->is_post_type( 'business' ) ) {
        //Do a meta query
        $query->get_post_meta(get_the_ID(), "featured_listing", TRUE);

        //sort by a meta value
        $query->set( 'orderby', 'featured_listing' );
        $query->set( 'order', 'ASC' );
    }
}
add_action( 'pre_get_posts', 'custom_special_sort' );

私はまた、わずかに違うやり方でやってみました。しかし、それがなぜうまくいかないのか、あるいは正しく実行しているのであれば、何らかのガイダンスを出すこともできます。

    function custom_special_sort( $query ) {
    // Check this is main query and other conditionals as needed
    if ( $query->is_main_query() && $query->is_post_type( 'business' ) ) {
        $query->set( 
          'meta_query', 
          array( 
            array(
              'key' => 'featured_listing',
              'value' => 'featured-listing',
              'orderby' => 'featured_listing',
              'order' => 'DESC'  
            )
          )
        );
    }
  }
add_action( 'pre_get_posts' , 'custom_special_sort' );
1
Randomer11

あなたが試みているコードにはいくつかの問題があります。

問い合わせをチェックするにはあなたのCPTアーカイブ用です$query->is_post_type()を使っていますが、うまくいきません(私の知る限り、関数でさえありません)。 )代わりに次のどちらかを使用できます。

if (is_post_type_archive('business')) {...}

または(アーカイブページだけではない場合)

if ($query->get('post_type') == 'business') {...}

pre_get_postsのメタ値で並べるには、orderby(およびオプションでorder)と同様にmeta_keyを設定する必要があります。


完全な関数:これらを "custom_special_sort"関数に適用すると、次のようになります。

function custom_special_sort( $query ) {

    // if is this the main query and is this post type of business
    if ( $query->is_main_query() && is_post_type_archive( 'business' ) ) {

        // order results by the meta_key 'featured_listing'
        $query->set( 'meta_key', 'featured_listing' );
        $query->set( 'orderby', 'featured_listing' );
        $query->set( 'order', 'DESC' );
    }
}
add_action( 'pre_get_posts', 'custom_special_sort' );
1
FluffyKitten

上記のFluffykittensの回答を正しい回答としてマークしました。私は答えを広げたいと思いました(うまくいけばそれは他の誰かに役立つでしょう)。

Fluffykittenからの回答で、私は自分の特定のテーマで、アーカイブとカスタム分類法に異なるループを使用しているため、検索アーカイブでis_post_type_archiveが正しいものになっている投稿の並べ替えが発生しました。しかし、私の分類法では、並べ替えが行われていないことが記録されているので、クエリをis_taxを含むように変更するとうまくいきました。

それがphp初心者としてクエリに追加するのが最善の方法であるかどうかわからないが、それは動作します。誰かが修正/改善することを歓迎します:)

function custom_special_sort( $query ) {

    // if is this the main query and is this post type of business

    if ( ($query->is_main_query() && is_post_type_archive('business')) || (is_main_query() && is_tax ('location')) ) {

        // order results by the meta_key 'featured_listing'
       $query->set( 'meta_key', 'featured_listing' );
        $query->set( 'orderby', 'featured_listing' );
        $query->set( 'order', 'DESC' );
    }
}
add_action( 'pre_get_posts', 'custom_special_sort' );
0
Randomer11