5

ユーザーが検索結果をさまざまなカスタム フィールドで並べ替えられるようにしようとしています。

私はpre_get_postsフィルターを使用していますが、1 つのことを除いてすべて正常に動作します。

私が抱えている問題は、カスタム フィールドを使用して並べ替えると、そのカスタム フィールドが設定されている投稿のみが検索に表示されることです。

ユーザーが検索結果の並べ替え方法を変更すると、検索結果の数が変わるため、明らかにこれは受け入れられません。

私が代わりに望むのは、カスタム フィールドを持つ投稿が最初に順番に表示され、次に残りの投稿が日付順に並べ替えられて表示されることです。

私が持っている関連コードは次のとおりです。

<?php
add_filter('pre_get_posts', 'h5b_search_pre_get_posts');

function h5b_search_pre_get_posts ($qry) {
    $validOrders    = array('price', 'date', 'popularity');
    $orderBy        = (isset($_GET['myorder']) and in_array($_GET['myorder'], $validOrders)) ? $_GET['myorder'] : 'price';

    if ($qry->is_main_query() and $qry->query_vars['s'] != '') {
        # This only includes the posts that have "item_price" set
        if ($orderBy == 'price') {
            $qry->set('orderby', 'meta_value_num date');
            $qry->set('order', 'ASC DESC');
            $qry->set('meta_key', 'item_price');
        }
        # This works fine and includes all posts (obviously)
        elseif ($orderBy == 'date') {
            $qry->set('orderby', 'date');
            $qry->set('order', 'DESC');
        }
    }
}

編集: 実際の MySQL クエリは次のようになります。これを変更して、存在する場合はソートするようにするにwp_postmeta.meta_valueはどうすればよいですか?存在しない場合は日付でソートしますか?

SELECT 
    SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM 
    wp_posts 
INNER JOIN 
    wp_postmeta 
ON 
    (wp_posts.ID = wp_postmeta.post_id) 
WHERE 
    1=1 AND 
    ((
        (wp_posts.post_title LIKE '%lorem%') OR 
        (wp_posts.post_content LIKE '%lorem%')
    )) AND 
    wp_posts.post_type IN ('post', 'page', 'attachment', 'items', 'locations') AND 
    (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') AND 
    (wp_postmeta.meta_key = 'item_price' ) 
GROUP BY 
    wp_posts.ID 
ORDER BY 
    wp_postmeta.meta_value+0,wp_posts.post_date DESC LIMIT 0, 6

メソッドを使用して解決することをお勧めしWP_Queryますが、必要に応じて独自の SQL を実行することを検討してください。

Edit2:次のようなものを使用する必要があると感じていIF NOT NULLます-どのようにそれを行いWP_Queryますか? それは可能ですか?

編集(再度):これが同じ質問です(私は:Pだと思います):https://wordpress.stackexchange.com/questions/28409/way-to-include-posts-both-with-without-certain-meta-key- in-args-for-wp-query

4

5 に答える 5