所以我可以按用户单独完成,但我不知道如何将其放入foreach循环中。
我要做的是输出如下内容:
作者,迈尔斯
其中miles是包含与该作者关联的自定义字段miles的每个帖子的总和。然后从最大到最小列出它们。
当用户查看自己的里程数时,我的代码如下所示:
<?php
//get current user
global $current_user;
get_currentuserinfo();
// build query of ids by user
$userPosts = get_posts(array(\'author\' => $current_user->ID, \'post_type\'=> \'miles\')); //change this
// loop to create array of ids by user
foreach ($userPosts as $post) {
setup_postdata($post);
$ids[] = get_the_ID();
}
$idList = implode(",", $ids); //tun this crap into a list
$meta_key = \'miles\';//set this to your custom field meta key
$allmiles = $wpdb->get_col($wpdb->prepare("
SELECT meta_value
FROM $wpdb->postmeta
WHERE meta_key = %s
AND post_id in (" . $idList . ")", $meta_key));
echo \'<p>You\\\'ve completed \' . array_sum( $allmiles) . \'</p>\'; ?>
我不知道如何复制这个,所以每个作者都会这样,以列表格式。。。想法??
最合适的回答,由SO网友:engelen 整理而成
出于性能原因,您最好编写自己的SQL查询。另一种选择是将里程分别存储在每个用户的自定义字段中。至于编写自己的SQL查询:您可以查询所有用户,然后加入他们的帖子,然后加入Posteta表。
之后,您可以使用SQLSUM
-函数可获取每个用户在Posteta表中的英里数字段之和。
这将导致这样的查询(使用$wpdb
):
global $wpdb;
$results = $wpdb->get_results( "
SELECT
us.ID,
us.user_login,
SUM( pm.meta_value ) AS mileage
FROM
{$wpdb->users} us
JOIN
{$wpdb->posts} po
ON
us.ID = po.post_author
JOIN
{$wpdb->postmeta} pm
ON
po.ID = pm.post_id
WHERE
pm.meta_key = \'miles\'
AND
po.post_status = \'publish\'
GROUP BY
us.ID
" );
我们开始从用户表中进行选择。在这之后,我们
JOIN
所有帖子。通过使用
GROUP BY
然后加入Post和Posteta,我们检索每个用户的所有miles Posteta条目。这允许我们使用
SUM( pm.meta_value )
在选择列时,我们可以得到每个用户的总里程数。