额外的SQL字段从何而来?

时间:2018-05-22 作者:squareborg

嗨,我是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无法看到任何提示它所做的操作。

1 个回复
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写入,特别是不是为了简单地查看内容,这是非常不可靠的。更新视图计数不是原子性的,在获取元值和设置元值之间有一段时间。在多个选项卡中打开页面足以导致竞争条件导致计数不足

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post