嗨,我是wordpress开发的新手,但对编程并不陌生。
我的问题是,我试图在WP_Query
并按自定义元键对其排序,我的查询如下所示
$mp_wp_query = new WP_Query(
array(
\'posts_per_page\' => 10,
\'order_by\' => \'meta_value_num\',
\'order\' => \'DESC\',
\'post_status\' => \'publish\',
\'post_type\' => \'tribe_events\',
\'meta_key\' => \'wpb_post_views_count\',
\'post_parent\' => \'0\'
)
);
echo "Last SQL-Query: {$mp_wp_query->request}";
这将生成一个SQL查询,如下所示
SELECT SQL_CALC_FOUND_ROWS DISTINCT wp_posts.*, MIN(wp_postmeta.meta_value) as EventStartDate, MIN(tribe_event_end_date.meta_value) as EventEndDate FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) LEFT JOIN wp_postmeta as tribe_event_end_date ON ( wp_posts.ID = tribe_event_end_date.post_id AND tribe_event_end_date.meta_key = \'_EventEndDate\' ) WHERE 1=1 AND wp_posts.post_parent = 0 AND ( wp_postmeta.meta_key = \'wpb_post_views_count\' AND ( mt1.meta_key = \'_EventStartDate\' ) ) AND wp_posts.post_type = \'tribe_events\' AND ((wp_posts.post_status = \'publish\')) AND (wp_postmeta.meta_value >= \'2018-05-22 20:15:06\' OR (wp_postmeta.meta_value <= \'2018-05-22 20:15:06\' AND tribe_event_end_date.meta_value >= \'2018-05-22 20:15:06\' )) GROUP BY wp_posts.ID ORDER BY EventStartDate DESC, wp_posts.post_date DESC LIMIT 0, 10
你可以看到最后的订单是
ORDER BY EventStartDate
自定义帖子类型能否以某种方式指定其排序方式,而忽略我的排序?我已经查看了自定义帖子类型的代码
register_post_type
被调用,并且args无法看到任何提示它所做的操作。
SO网友:Tom J Nowell
没有什么错,数据存在的原因是为了处理两篇文章的元键值相同时的排序问题。
ORDER BY EventStartDate DESC, wp_posts.post_date DESC
这里我们看到,post数据并不是它唯一的排序对象,
EventStartDate
是在上订购的内容,这些内容在开头定义:
MIN(wp_postmeta.meta_value) as EventStartDate,
MIN(tribe_event_end_date.meta_value) as EventEndDate
这让我得出结论,这个SQL查询不是
WP_Query
, 但完全是另一个问题。
此外,如果最终结果是您想要的,并且性能良好,那么使用的SQL并不是特别相关。
进一步检查后,您试图按页面视图排序,但使用了post meta作为存储页面视图的一种方法。这会导致一些问题:
每个页面加载都有一个DB写入,这对性能很糟糕,除非用户登录并填写表单或设置内容,否则前端不应该进行DB写入,特别是不是为了简单地查看内容,这是非常不可靠的。更新视图计数不是原子性的,在获取元值和设置元值之间有一段时间。在多个选项卡中打开页面足以导致竞争条件导致计数不足缓存页面是不可能的,这会降低性能、可扩展性,并对SEO造成负面影响。请使用第三方服务或专用软件跟踪此情况,然后轮询其API。E、 g.谷歌分析或Jetpack统计