看起来插件正在使用update_post_meta
函数,该函数反过来使用update_metadata
包含动作挂钩的函数update_postmeta
和updated_postmeta
在post元数据存储到数据库之前和之后立即触发。您可以挂接其中一个来更新文章作者的用户元。伪代码:
add_action( \'update_postmeta\', \'wpse155265_update_user_vote\', 10, 4 );
function wpse155265_update_user_vote( $meta_id, $object_id, $meta_key, $meta_value ) {
$post = get_post( $object_id );
$user_id = $post->post_author;
$votes = (int) get_user_meta( $user_id, \'epicredvote\', true );
$votes++;
update_user_meta( $user_id, \'epicredvote\', $votes );
}
编辑:
如上所述,上面没有考虑后元更新是赞成票还是反对票。以下修订代码;我们将比较post meta的值,新旧的,以确定用户的meta应该增加还是减少。
add_action( \'update_postmeta\', \'wpse155265_update_user_vote\', 10, 4 );
function wpse155265_update_user_vote( $meta_id, $object_id, $meta_key, $meta_value ) {
$post = get_post( $object_id );
$user_id = $post->post_author;
$meta_value_old = get_post_meta( $object_id, \'epicredvote\', true );
$votes = (int) get_user_meta( $user_id, \'epicredvote\', true );
( $meta_value > $meta_value_old ) ? $votes++ : $votes--;
update_user_meta( $user_id, \'epicredvote\', $votes );
}
我刚才想到的另一种方法是,在对用户进行排名时,只计算用户的投票,而不是将他们的投票存储在meta中。循环遍历来自的所有用户
get_users
对于每个用户,计算他们的总投票数,将每个用户存储到一个数组中,以他们的总投票数为关键字,使用
ksort
然后在数组中循环以输出您的排名列表。不过,为每个用户运行WP\\u查询可能有点紧张。也许有一条SQL语句可以组合在一起,它将实际返回按投票总数排序的所有用户,但我不得不修改它,看看这是否可行。
编辑:
这里有一个SQL,可以计算用户并对其进行排名。将此插入$wpdb
根据需要:
global $wpdb;
$results = $wpdb->get_results(
"
SELECT u.display_name as name,
( SELECT SUM(pm.meta_value)
FROM wp_posts p, wp_postmeta pm
WHERE p.post_author = u.ID
AND p.post_status LIKE \'publish\'
AND pm.meta_key = \'epicredvote\'
AND p.ID = pm.post_id ) as votes
FROM wp_users u
ORDER BY votes DESC
"
);
foreach ( $results as $result ) {
echo "{$result->name}: {$result->votes} votes<br>";
}