从wp-postmeta表中选择元键的最大值时返回附加字段

时间:2017-08-25 作者:quint

以下代码返回所有post类型为“calibration”的post中的元键“session”的最大值。

我想返回“calibration”post类型中的另外两个字段:“countdown”和“timer”。但是,在SELECT语句第一行末尾附加这些字段。。。选择最大值(强制转换(meta\\u值为无符号))、倒计时、计时器。。。返回NULL。

如何更改函数以返回其他字段?

function getMaxSessionNoAndSettings() {
  global $wpdb;
  $userID = get_current_user_id();

  $lastSessionNumber = $wpdb->get_var( $wpdb->prepare( 
            "   
                SELECT max( cast( meta_value as unsigned) )
                FROM wp_postmeta 
                LEFT JOIN wp_posts ON wp_posts.ID = wp_postmeta.post_id
                WHERE meta_key = \'session\' AND post_status = \'publish\' AND post_type = \'calibration\' AND post_author = $userID
            ", 
            $post_type
        ) );
 // var_dump($lastSessionNumber);
  return $lastSessionNumber;
}
add_action( \'pre_get_posts\', \'getMaxSessionNoAndSettings\');

1 个回复
SO网友:Tom J Nowell

不是这样的pre_get_posts 工作,或者它的用途。

这个pre_get_posts 筛选器,是更改集合或修改WP_Query 对象,然后再从信息中获取帖子。

例如,这里有一个将主页查询修改为仅获取5篇帖子:

function tomjn_fetch_five_posts( \\WP_Query $q ) {
    if ( $q->is_main_query() && $q->is_home() ) {
        $q->set( \'posts_per_page\', 5 );
    }
}
add_action( \'pre_get_posts\', \'tomjn_fetch_five_posts\' );
在你的情况下,还不清楚你想做什么,但假设我们只想用最高的session 元键值,我们可以执行以下操作:

$q->set( \'meta_key\', \'session\');
$q->set( \'meta_value\', $lastSessionNumber );
然而,这两个查询以及您编写的SQL查询都存在着严重的性能和流量缩放问题,这种问题是无法掩盖或优化的

性能缓存和流量缩放问题的症结在于数据存储效率不高。如果您想以一种可以快速查询的方式存储内容以查找帖子,那么必须使用分类法。这就是构建分类法的目的,否则类别和标记将存储在post meta中

元查询包括extremely

在事情开始失控和页面加载时间激增之前,不要期望超过少数人能够同时查看该页面。元查询非常昂贵

也许你可以缓存它们?

你永远不能缓存该页面,因为它会向不同的用户显示不同的内容,如果你开始缓存该页面,它会向所有用户显示相同的内容。

数据存储

如果会话是post ID,则应使用post父级链接它们。

否则,您最好挂接到post save,检查会话是否是最大的数字,并将其存储在用户meta中,以便下次需要它时,您已经找到了它,而且它是简单/快速的get_user_meta 呼叫

结束

相关推荐