Verwenden von update_user_meta zum Einstufen von Benutzern

Ich verwende ein Plugin, mit dem Nutzer über Posts abstimmen können. Ich möchte jede abgegebene Stimme den Autoren user_meta hinzufügen, damit ich Nutzer auf die gleiche Weise wie Nutzer bewerten kann.

Es gibt ein paar verschiedene functionen im Plugin, die post_meta aktualisieren und speichern.

add_action( 'wp_ajax_nopriv_epicred_vote', 'epicred_vote' ); add_action( 'wp_ajax_epicred_vote', 'epicred_vote' ); function epicred_vote(){ global $wpdb, $current_user; get_currentuserinfo(); $wpdb->myo_ip = $wpdb->prefix . 'epicred'; $option = (int)$_POST['option']; $current = (int)$_POST['current']; //if we are locked via IP set the fid variable to be the IP address, otherwise log the member ID if(get_option('epicred_ip') == 'yes'){ $ipAddr = isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) ? $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] : $_SERVER['REMOTE_ADDR']; $fid = "'" . $ipAddr . "'"; }else{ $fid = $current_user->ID; } $postid = (int)$_POST['poll']; $query = "SELECT epicred_option FROM $wpdb->myo_ip WHERE epicred_ip = $fid AND epicred_id = $postid"; $al = $wpdb->get_var($query); if($al == NULL){ $query = "INSERT INTO $wpdb->myo_ip ( epicred_id , epicred_ip, epicred_option) VALUES ( $postid, $fid, $option)"; $wpdb->query($query); }else{ $query = "UPDATE $wpdb->myo_ip SET epicred_option = $option WHERE epicred_ip = $fid AND epicred_id = $postid"; $wpdb->query($query); } $vote = get_post_meta($postid,'epicredvote',true); if($option == 1){ if($al != 1){ if($al == -1){ $vote = $vote+2; }else{ $vote = $vote+1; } } } if($option == -1){ if($al != -1){ if($al == 1){ $vote = $vote-2; }else{ $vote = $vote-1; } } } update_post_meta($postid,'epicredvote',$vote); $response['poll'] = $postid; $response['vote'] = $vote; echo json_encode($response); // IMPORTANT: don't forget to "exit" exit; } 

Und

 function wpt_save_wpeddit() { global $wp, $wpdb, $post; // unhook this function so it doesn't loop infinitely remove_action('save_post', 'wpt_save_wpeddit'); // Is the user allowed to edit the post or page? if ( !current_user_can( 'edit_post', $post->ID )) return $post->ID; // OK, we're authenticated: we need to find and save the data. Make sure we don't add an image every time the post is // saved as a draft - so keep track of the external URL in a custom field. $vote = get_post_meta($post->ID,'epicredvote',true); $rank = get_post_meta($post->ID,'epicredrank',true); if($vote == ""){ $vote = 0; } if($rank == ""){ $rank = 0; } update_post_meta($post->ID, 'epicredvote', $vote ); update_post_meta($post->ID,'epicredrank',$rank); add_action('save_post', 'wpt_save_wpeddit'); } 

Dann wäre es mein Ziel, so etwas zu verwenden, um die Benutzer zu bewerten:

EDIT: – Schleife, die ich benutze, um Benutzer / Scores auszugeben.

   'epicredvote', 'orderby' => 'meta_value', 'order' => 'DESC', 'number' => 10, ); add_action( 'pre_user_query', 'wpse_149342_pre_user_query' ); $user_query = new WP_User_Query( $args ); // User Loop if ( ! empty( $user_query->results ) ) { foreach ( $user_query->results as $user ) { echo '

' . $user->display_name . '

'; echo '' . $user->epicredvote . ''; } } else { echo 'No users found.'; } ?>

Also eine Stimme für einen Post = eine Stimme für diesen Nutzer im Wesentlichen.

Möglich, oder bin ich hier völlig daneben?

Solutions Collecting From Web of "Verwenden von update_user_meta zum Einstufen von Benutzern"

Es sieht so aus, als ob das Plugin die function update_post_meta verwendet, die wiederum die function update_post_meta verwendet, die die update_metadata update_postmeta und updated_postmeta die unmittelbar vor und nach dem update_postmeta updated_postmeta in der database updated_postmeta werden. Sie könnten sich in eines davon einklinken, um das Benutzer-Meta des Autors des Beitrags zu aktualisieren. Pseudocode:

 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 ); } 

Bearbeiten:

Wie oben erwähnt, berücksichtigt das Obige nicht, ob das Post-Meta-Update eine Abstimmung nach oben oder unten ist. Überarbeiteter Code unten; Wir vergleichen den Wert des Post-Metas, alt gegen neu, um festzustellen, ob das Meta des Benutzers erhöht oder verringert werden sollte.

 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 ); } 

Ein anderer Ansatz, der mir gerade in den Sinn gekommen ist, wäre, nur die Voten des Benutzers zu berechnen, wenn man die Benutzer bewertet, anstatt ihre Stimmen in einem Meta zu speichern. Durchlaufen Sie alle Benutzer von get_users und berechnen get_users für jeden die Gesamtstimmen, speichern Sie jeden Benutzer in einem Array mit der Summe als Schlüssel, sortieren Sie das Array mit ksort mit ksort und durchlaufen Sie das Array, um Ihre Rangliste auszugeben. Running WP_Query für jeden Benutzer kann jedoch ein wenig intensiv sein. Vielleicht gibt es eine einzige SQL-statement, die zusammengestellt werden kann, die tatsächlich alle Benutzer nach ihrer Stimmensumme sortiert zurückgibt – aber ich müsste damit herumspielen, um zu sehen, ob das möglich ist.

Bearbeiten:

Hier ist eine einzelne SQL, die Ihre Benutzer berechnet und rankt. $wpdb dies $wpdb in $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
"; }