gpt4 book ai didi

php - WordPress - 如果存在则按元值排序,否则按日期排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:55 24 4
gpt4 key购买 nike

我试图让我的用户根据我拥有的不同自定义字段对搜索结果进行排序。

我正在使用 pre_get_posts 过滤器,除一件事外一切正常。

我遇到的问题是,当使用自定义字段进行排序时,只有设置了该自定义字段的帖子才会显示在搜索中

显然,这是 Not Acceptable ,因为当用户更改搜索结果的排序方式时,搜索结果的数量也会发生变化。

我想要的是首先按顺序显示具有自定义字段的帖子,然后按日期排序显示其余帖子。

这是我的相关代码:

<?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

最佳答案

它不会很漂亮(或优化),但我认为您可以在此处使用 IFCASE:

ORDER BY 
CASE wp_postmeta.meta_value WHEN IS NOT NULL THEN wp_postmeta.meta_value END ASC,
CASE wp_postmeta.meta_value WHEN IS NULL THEN wp_posts.post_date END DESC

注意:我没有亲自尝试过,所以可能存在语法错误,但理论上应该可以工作

进一步阅读: Can you add an if statement in ORDER BY?

关于php - WordPress - 如果存在则按元值排序,否则按日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17016770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com