1

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;
}
  • Do you have debugging information? – s_ha_dum May 21 '13 at 21:20
  • 3
    For the record, this is a horrible thing to do on every page load. If your site has very low traffic it's fine but as soon as you scale you will choke the database with read/write calls. It's better to parse access logs on a set interval so you can do them in bulk and keep your site up. This will also fail if your site does any caching of page content. – jgraup Nov 6 '16 at 3:53
0

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;
    }
  • that only ads the value of ratings_score. What I need is for it to add the value of 'user_score()' which is the sum of all the 'ratings_scores'. Thats why I'm trying to make it run the function. – Pollux Khafra Jun 19 '12 at 12:02
  • Why would we need the counter? there isn't any loop here.. – Sisir Apr 16 '14 at 4:32
0

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.