web-dev-qa-db-ja.com

値が返されない場合のmeta_valueによる検索結果ページの並べ替え残りの結果

自分のサイトの検索結果ページを特定のmeta_keyで並べ替えようとしています。 meta_keyに値がない場合でも、すべての結果を返す必要があります。

投稿はイベントであるカスタム投稿タイプです。

結果は、これを使用して特定のカスタム投稿タイプのセットに既にソートされています。

function SearchFilter($query) {
    if (!is_admin() && $query->is_search() ) {
        $query->set('post_type', array( 'event', 'university', 'organization'));
    }
    return $query;
}

add_action('pre_get_posts','SearchFilter', 9999);

通過したイベント、または "off"のカスタムフィールドに設定されているイベントを除外するために、他にもいくつかのフィルタリングが行われています。必要に応じて、それを実行するためのコードを投稿することもできます。

基本的に、私は使うことができます

$query->set('meta_key', 'wpcf-start-date');
$query->set('orderby', array('meta_value' => 'ASC'));

イベントをイベントの日付順に並べるこれはうまく機能しますが、''フィールドにwpcf-start-date(私が仮定しているものはnull)を持つ結果を返しません。

私はこの質問に答えを使ってみました:

カスタムフィールドで投稿を注文し、カスタムフィールドが空の場合は残りの投稿を返す

しかし、私は自分の用途に合わせてそれをカスタマイズするのに十分なことが行われているのかわからないか、あるいは私にはうまくいかない。

私は要求に応じてどんな追加情報も提供することができます。

任意の助けは大歓迎です!


更新:

私が参照しているもう1つのStackの質問をもう一度見ていました。私はこれがうまくいっているのです。

function sortResults( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    $query->set( 'meta_key', 'wpcf-start-date' );
    $query->set( 'orderby', 'meta_value');
    $query->set( 'order', 'DESC');

    add_filter( 'get_meta_sql', 'filterResults' );
}
add_action( 'pre_get_posts', 'sortResults' );

function filterResults( $clauses ) {
    remove_filter( 'get_meta_sql', 'filterResults' );

    // Change the inner join to a left join,
    // and change the where so it is applied to the join, not the results of the query.
    $clauses['join']  = str_replace( 'INNER JOIN', 'LEFT JOIN', $clauses['join'] ) . $clauses['where'];
    $clauses['where'] = '';

    return $clauses;
}

しかし他の質問のように、これは日付のないイベントを一番上に、日付のあるイベントを一番下に置く。他の質問は2つのループを使用することを提案します。私のサイトでは2つのループが機能しているようには見えません。検索結果ページは高度にカスタマイズされています。

5
Nick Taylor

これを実現するには、複数のメタクエリを使用します。

$query->set( 'meta_query', [
  'relation' => 'OR',
  'wpcf-start-date' => [
    'key' => 'wpcf-start-date',
    'compare' => 'EXISTS',
  ],
 'no-start-date' => [
    'key' => 'wpcf-start-date',
    'compare' => 'NOT EXISTS'
  ],
] );
$query->set( 'orderby', 'wpcf-start-date' );
$query->set( 'order', 'ASC' );

これはWPに、キーを持っているかどうか、LEFT JOINとして設定しているかどうかにかかわらず、すべての投稿にマッチするクエリを作成するように指示します。値.

1