ユーザーが検索結果をさまざまなカスタム フィールドで並べ替えられるようにしようとしています。
私は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