Update user meta of author when post content is viewed

I have a value that I’m trying to store as user meta for authors on my site. I need it to update itself every time the content of a post is viewed for that author. Here’s as far as I’ve gotten but it isn’t storing the value. I use this in functions.php.

function user_score() {
    global $bp;
    $author_id = $bp->displayed_user->id; // do stuff to get user ID

    $author_posts = get_posts( array(
      'author' => $author_id,
      'posts_per_page' => -1
    ) );

    $counter = 0;
    foreach ( $author_posts as $post )
    {
      $score = get_post_meta( $post->ID, 'ratings_score', true );
      $counter += $score;
    }
    update_user_meta( $author_id, 'user_score', $counter );
    if ($echo)
      echo $counter;
    return $counter;
}
add_filter('the_content','update_user_score');
function update_user_score($content){
  global $post;
  user_score();
  return $content;
}

Related posts

Leave a Reply

2 comments

  1. untested but should work

       add_filter('the_content','update_user_score');
        function update_user_score($content){
            global $post;
            $counter = 0;
            $score = get_post_meta( $post->ID, 'ratings_score', true );
            $counter += $score;
            update_user_meta( $post->post_author, 'user_score', $counter);
            return $content;
        }
    
  2. I would use the action wp_footer. You could do something like below. You do not need to loop through all posts whenever a post is showing. Just add the current post score to user for the current post.

    add_action('wp_footer', 'wpse55725_update_user_score');
    
    function wpse55725_update_user_score(){
        if( !is_singular('post') )    
            return;    // only run for single post
    
        global $post;
        $current_score = get_user_meta( $post->post_author, 'user_score', true ); // get current score of the user
        $score_points = get_post_meta( $post->ID, 'ratings_score', true ); // score for the post
        $score = $current_score + $score_points; // add the score to users current score
    
        update_user_meta( $post->post_author, 'user_score', $score); // save it
    
    }
    

    Code not tested.