WordPress 纯代码实现用户积分系统

去年开发了一款站长社区的 WordPress 主题,主题君用纯代码做了 WordPres 用户积分系统,答应过宁总要把教程写出来的,今天算是有时间整理了。

首先声明:核心代码搬运了 ashuwp 的教程,然后自己集成了一些自己的代码,代码比较复杂,没有一定基础的朋友不要轻易尝试。

整理思路:

1. 需要准备两个数据表。

(1) 积分动态表,用来记录所有用户的积分增减情况。

(2) 用户积分总表,用来记录用户的积分总量,当然用户积分总数可以记录到 usermeta 数据表中,所以这个表不是必须的。

2. 后台需要 3 个页面。

(1) 积分动态,从“积分动态表”中获取数据,展示用户积分动态。

(2) 用户积分,从“用户积分表”中获取数据,方便查看用户的积分总量。

(3) 积分增减页面,用于给用户增减积分。

下面教程开始吧:

一、新建数据表

1. 积分动态表 points_activity 中的字段有 id,用户 id,积分(异动数),描述,余额,时间。

2. 用户积分表 points 中的字段就两个:用户 id,积分数。

  1. //在第一次启用主题时执行。
  2. function ashuwp_load_theme() {
  3. global $pagenow;
  4. if ( is_admin() && 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){
  5. ashuwp_points_install();
  6. }
  7. }
  8. add_action( 'load-themes.php', 'ashuwp_load_theme' );
  9. //新建数据表points_activity和points
  10. function ashuwp_points_install(){
  11. global $wpdb;
  12. $table_name = $wpdb->prefix . 'points_activity'; //积分动态表
  13. $table_name2 = $wpdb->prefix . 'points'; //积分汇总表
  14. $charset_collate = $wpdb->get_charset_collate();
  15. if( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name ) :
  16. $sql = " CREATE TABLE `".$table_name."` (
  17. `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  18. `user_id` BIGINT(40),
  19. `points` INT NOT NULL,
  20. `description` longtext,
  21. `balance` INT NOT NULL,
  22. `date` DATETIME NOT NULL
  23. ) $charset_collate;";
  24. require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  25. dbDelta($sql);
  26. endif;
  27. if( $wpdb->get_var("SHOW TABLES LIKE '$table_name2'") != $table_name2 ) :
  28. $sql2 = " CREATE TABLE `".$table_name2."` (
  29. `user_id` BIGINT(40) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  30. `points` INT NOT NULL
  31. ) $charset_collate;";
  32. dbDelta($sql2);
  33. endif;
  34. }

二、数据库操作函数

  1. //根据用户id获取某个用户的积分数
  2. function ashuwp_get_user_points($user_id){
  3. global $wpdb;
  4. $user = get_user_by('ID', $user_id);
  5. if(!$user){
  6. return 0;
  7. }
  8. $points_table = $wpdb->prefix . 'points';
  9. $sql = "select points from ".$points_table." where user_id={$user_id}";
  10. $result = $wpdb->get_var($sql);
  11. if(!$result){
  12. return 0;
  13. }else{
  14. return $result;
  15. }
  16. }
  17. //更新(新增)用户积分.
  18. function ashuwp_update_user_points($user_id, $new_points){
  19. global $wpdb;
  20. $user = get_user_by('ID', $user_id);
  21. if(!$user){
  22. $msg = array(
  23. 'state' => 'error',
  24. 'msg' => 'User Error',
  25. );
  26. return $msg;
  27. }
  28. if( !is_numeric($new_points)|| $new_points<0){
  29. $msg = array(
  30. 'state' => 'error',
  31. 'msg' => 'Points not number or points error',
  32. );
  33. return $msg;
  34. }
  35. $points_table = $wpdb->prefix . 'points';
  36. $points_exist = $wpdb->get_var( "select count(*) from {$points_table} where user_id='{$user_id}'" );
  37. if($points_exist){
  38. $sql = "update {$points_table} set points='{$new_points}' where user_id='{$user_id}'";
  39. }else{
  40. $sql = "insert into {$points_table} ( user_id, points ) values( '{$user_id}', '{$new_points}' )";;
  41. }
  42. $result = $wpdb->query($sql);
  43. if($result){
  44. $msg = array(
  45. 'state' => 'succeed',
  46. 'msg' => 'Points Updated.',
  47. );
  48. return $msg;
  49. }else{
  50. $msg = array(
  51. 'state' => 'error',
  52. 'msg' => 'Points update failed.',
  53. );
  54. return $msg;
  55. }
  56. }
  57. //从用户积分表获取数据,后台积分汇总页面需要获取数据。
  58. function ashuwp_get_points( $args=array() ){
  59. global $wpdb;
  60. $defaults = array(
  61. 'per_page' => '50',
  62. 'paged' => '1',
  63. );
  64. $args = wp_parse_args( $args, $defaults );
  65. $page = (int)$args['paged'];
  66. $per_page = (int)$args['per_page'];
  67. if(!$page){
  68. $page = 1;
  69. }
  70. if(!$per_page){
  71. $per_page = 50;
  72. }
  73. $begin = $per_page*($page-1);
  74. $end = $per_page*$page;
  75. $points_table = $wpdb->prefix . 'points';
  76. $sql = "select * from $points_table order by user_id asc limit $begin,$end";
  77. $results = $wpdb->get_results($sql,'ARRAY_A');
  78. return $results;
  79. }
  80. //统计数据条数,后台积分汇总页面需要获取数据。
  81. function ashuwp_count_points(){
  82. global $wpdb;
  83. $points_table = $wpdb->prefix . 'points';
  84. $sql = "select count(*) from $points_table";
  85. $results = $wpdb->get_var($sql);
  86. return $results;
  87. }

然后是对积分动态表的操作仅需要增加即可,不需要删除。

  1. /*增加入一条积分动态*/
  2. function ashuwp_add_points_activity( $args=array() ){
  3. global $wpdb;
  4. $defaults = array(
  5. 'user_id' => '',
  6. 'action' => '',
  7. 'points' => '',
  8. 'description' => '',
  9. 'date' => ''
  10. );
  11. $args = wp_parse_args( $args, $defaults );
  12. //判断用户id是否合法
  13. $user = get_user_by('ID', $args['user_id']);
  14. if(!$user){
  15. $msg = array(
  16. 'state' => 'error',
  17. 'msg' => 'User Error',
  18. );
  19. return $msg;
  20. }
  21. //仅增加和减少两种操作。
  22. if( !in_array( $args['action'], array( 'add', 'reduce' ) )){
  23. $msg = array(
  24. 'state' => 'error',
  25. 'msg' => 'Operate Error',
  26. );
  27. return $msg;
  28. }
  29. //检测积分异动数是否合法
  30. if( !is_int($args['points']) ){
  31. $msg = array(
  32. 'state' => 'error',
  33. 'msg' => 'Points Error',
  34. );
  35. return $msg;
  36. }
  37. //处理描述
  38. $args['description'] = sanitize_text_field($args['description']);
  39. //处理异动数,和计算余额
  40. $old_points = (int)ashuwp_get_user_points($args['user_id']);
  41. if($args['action']=='add'){
  42. $balance = $old_points+$args['points'];
  43. $change = $args['points'];
  44. if($balance!=$old_points){
  45. //将新余额更新到用户积分表。
  46. $update = ashuwp_update_user_points($args['user_id'],$balance);
  47. }
  48. }
  49. if($args['action']=='reduce'){
  50. $balance = $old_points-$args['points'];
  51. $change = -$args['points']; //若是减少,数据库中保存为负数。
  52. if($balance!=$old_points){
  53. $update = ashuwp_update_user_points($args['user_id'],$balance);
  54. }
  55. }
  56. if( ($balance!=$old_points) && $update['state'] != 'succeed' ){
  57. $msg = array(
  58. 'state' => 'error',
  59. 'msg' => $update['msg'],
  60. );
  61. return $msg;
  62. }
  63. $table_name = $wpdb->prefix . 'points_activity';
  64. //插入数据
  65. $args['date'] = date( "Y-m-d H:i:s", time());
  66. $sql = "insert into $table_name ( user_id, points, description, balance, date ) values( '{$args['user_id']}', '{$change}', '{$args['description']}', '{$balance}', '{$args['date']}' )";
  67. $result = $wpdb->query($sql);
  68. if($result){
  69. $msg = array(
  70. 'state' => 'succeed',
  71. 'msg' => 'succeed!',
  72. );
  73. return $msg;
  74. }else{
  75. //若动态插入失败,将用户积分表回滚。
  76. ashuwp_update_user_points($args['user_id'],$old_points);
  77. $msg = array(
  78. 'state' => 'error',
  79. 'msg' => 'Insert Error',
  80. );
  81. return $msg;
  82. }
  83. }
  84. /*从积分动态表中获取数据,后台页面中需要。
  85. * 需支持条件查询方便后台管理。
  86. */
  87. function ashuwp_get_points_activity( $args=array() ){
  88. global $wpdb;
  89. $defaults = array(
  90. 'user_id' => '',
  91. 'per_page' => '50',
  92. 'paged' => '1',
  93. 'action' => ''
  94. );
  95. $args = wp_parse_args( $args, $defaults );
  96. //处理页码
  97. $page = (int)$args['paged'];
  98. $per_page = (int)$args['per_page'];
  99. if(!$page){
  100. $page = 1;
  101. }
  102. if(!$per_page){
  103. $per_page = 50;
  104. }
  105. $begin = $per_page*($page-1);
  106. $end = $per_page*$page;
  107. $table_name = $wpdb->prefix . 'points_activity';
  108. $sql = "select * from $table_name where 1=1 ";
  109. //查询用户id
  110. if($args['user_id']!=''){
  111. $user_id = (int)$args['user_id'];
  112. $sql .= "and user_id='{$user_id}' ";
  113. }
  114. //查询操作种类
  115. if( in_array( $args['action'], array( 'add', 'reduce', 'remain' ) ) ){
  116. if($args['action']=='add'){
  117. $sql .= "and points>0 ";
  118. }
  119. if($args['action']=='reduce'){
  120. $sql .= "and points<0 ";
  121. }
  122. if($args['action']=='remain'){
  123. $sql .= "and points=0 ";
  124. }
  125. }
  126. $sql .= "order by id desc limit $begin,$end";
  127. $results = $wpdb->get_results($sql,'ARRAY_A');
  128. return $results;
  129. }
  130. /*统计积分动态的记录数
  131. * 加入统计条件方便后台管理
  132. */
  133. function ashuwp_count_points_activity( $args=array() ){
  134. global $wpdb;
  135. $defaults = array(
  136. 'user_id' => '',
  137. 'action' => ''
  138. );
  139. $args = wp_parse_args( $args, $defaults );
  140. $table_name = $wpdb->prefix . 'points_activity';
  141. $sql = "select count(*) from $table_name where 1=1 ";
  142. //统计用户
  143. if($args['user_id']!=''){
  144. $user_id = (int)$args['user_id'];
  145. $sql .= "and user_id='{$user_id}' ";
  146. }
  147. //统计操作
  148. if( in_array( $args['action'], array( 'add', 'reduce', 'remain' ) ) ){
  149. if($args['action']=='add'){
  150. $sql .= "and points>0 ";
  151. }
  152. if($args['action']=='reduce'){
  153. $sql .= "and points<0 ";
  154. }
  155. if($args['action']=='remain'){
  156. $sql .= "and points=0 ";
  157. }
  158. }
  159. $results = $wpdb->get_var($sql);
  160. return $results;
  161. }

三、新建后台积分页面

1. 积分动态页面。

后台页面设计到 class-wp-list-table 类的应用,就不一一加注释了。

  1. if(!class_exists('WP_List_Table')) {
  2. require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
  3. }
  4. class Ashuwp_Points_Activity_Table extends WP_List_Table {
  5. function __construct(){
  6. parent::__construct( array(
  7. 'singular' => 'Points Activity',
  8. 'plural' => 'Points Activity',
  9. 'ajax' => false
  10. ) );
  11. }
  12. function column_default( $item, $column_name ) {
  13. switch ( $column_name ){
  14. case 'id':
  15. case 'user':
  16. case 'points':
  17. case 'balance':
  18. case 'description':
  19. case 'date':
  20. return $item[ $column_name ];
  21. default:
  22. return print_r($item,true);
  23. }
  24. }
  25. function get_columns() {
  26. $columns = array(
  27. 'id' => 'ID',
  28. 'user' => 'User',
  29. 'points' => 'Points',
  30. 'balance' => 'Balance',
  31. 'description' => 'Description',
  32. 'date' => 'Date',
  33. );
  34. return $columns;
  35. }
  36. function format_activity( $datas ) {
  37. $return_datas = array();
  38. foreach( $datas as $data ){
  39. $user = get_user_by('id', $data['user_id']);
  40. $item_array = array();
  41. $item_array['id'] = $data['id'];
  42. $item_array['user'] = $user->user_login;
  43. if($data['points']<0){
  44. $item_array['points'] = '<span class="reduce">'.$data['points'].'</span>';
  45. }elseif($data['points']>0){
  46. $item_array['points'] = '<span class="add">+'.$data['points'].'</span>';
  47. }else{
  48. $item_array['points'] = '<span class="remain">'.$data['points'].'</span>';
  49. }
  50. $item_array['description'] = $data['description'];
  51. $item_array['balance'] = $data['balance'];
  52. $item_array['date'] = $data['date'];
  53. $return_datas[] = $item_array;
  54. }
  55. return $return_datas;
  56. }
  57. function prepare_items() {
  58. $this->_column_headers = $this->get_column_info();
  59. $per_page = $this->get_items_per_page( 'customers_per_page', 50 );
  60. $current_page = $this->get_pagenum();
  61. $total_items = 0;
  62. $args = array(
  63. 'per_page' => $per_page,
  64. 'paged' => $current_page,
  65. );
  66. if( isset( $_GET['user_name'] ) && !empty( trim($_GET['user_name']) ) ){
  67. $user = get_user_by( 'login', trim($_GET['user_name']) );
  68. if( !empty($user)){
  69. $args['user_id'] = $user->ID;
  70. }
  71. }
  72. if( isset( $_GET['action_name'] ) && !empty( trim($_GET['action_name']) ) ){
  73. if( in_array( $_GET['action_name'], array( 'add', 'reduce', 'remain' ) ) ){
  74. $args['action'] = $_GET['action_name'];
  75. }
  76. }
  77. $total_items = ashuwp_count_points_activity($args);
  78. $datas = ashuwp_get_points_activity($args);
  79. $this->items = $this->format_activity($datas);
  80. $this->set_pagination_args( array(
  81. 'total_items' => $total_items,
  82. 'per_page' => $per_page,
  83. 'total_pages' => ceil($total_items/$per_page)
  84. ) );
  85. }
  86. }
  87. class ashuwp_points_activity_admin {
  88. static public $instance;
  89. public $points_activity_obj;
  90. private function __construct(){
  91. add_filter( 'set-screen-option', array( $this, 'set_screen' ), 10, 3 );
  92. add_action( 'admin_menu', array( $this, 'ashuwp_points_activity_menu') );
  93. }
  94. private function __clone() {
  95. }
  96. function ashuwp_points_activity_menu() {
  97. //svg图
  98. $dollor_ico = '';
  99. //建立积分动态页面
  100. $hook = add_menu_page( 'Points Activity', 'Points Activity', 'manage_options', 'points_activity', array(&$this, 'points_activity_list'),'data:image/svg+xml;base64,'.$dollor_ico, 9);
  101. add_action( "load-$hook", array( $this, 'screen_option' ) );
  102. }
  103. function set_screen( $status, $option, $value ) {
  104. return $value;
  105. }
  106. function screen_option() {
  107. $option = 'per_page';
  108. $args = array(
  109. 'label' => 'Customers',
  110. 'default' => 30,
  111. 'option' => 'customers_per_page'
  112. );
  113. add_screen_option( $option, $args );
  114. $this->points_activity_obj = new Ashuwp_Points_Activity_Table();
  115. }
  116. function points_activity_list(){
  117. $all = ashuwp_count_points_activity();
  118. $points_add = ashuwp_count_points_activity( array( 'action'=>'add' ) );
  119. $points_reduce = ashuwp_count_points_activity( array( 'action'=>'reduce' ) );
  120. $points_remain = ashuwp_count_points_activity( array( 'action'=>'remain' ) );
  121. ?>
  122. <div class="wrap">
  123. <h1 class="wp-heading-inline">Points Activity</h1>
  124. <a href="<?php echo admin_url( 'admin.php?page=points_activity_add' ); ?>" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="page-title-action">Add/Reduce</a>
  125. <?php
  126. if ( ! empty( $_GET['user_name'] ) ) {
  127. printf( '<span class="subtitle">' . __('Search results for “%s”') . '</span>', esc_HTML( $_GET['user_name'] ) );
  128. }
  129. ?>
  130. <hr class="wp-header-end">
  131. <ul class="subsubsub">
  132. <?php
  133. if( !empty( $_GET['action_name'] ) && in_array( trim($_GET['action_name']), array( 'add', 'reduce', 'remain' ) ) ){
  134. $now = trim($_GET['action_name']);
  135. }else{
  136. $now = 'all';
  137. }
  138. $current = 'class="current"';
  139. ?>
  140. <li class="all"><a <?php if($now=='all'){ echo $current; } ?> href="<?php echo admin_url( 'admin.php?page=points_activity' ); ?>" rel="external nofollow" >All<span class="count">(<?php echo $all; ?>)</span></a> |</li>
  141. <li class="add"><a <?php if($now=='add'){ echo $current; } ?> href="<?php echo admin_url( 'admin.php?page=points_activity&action_name=add' ); ?>" rel="external nofollow" >Add<span class="count">(<?php echo $points_add; ?>)</span></a> |</li>
  142. <li class="reduce"><a <?php if($now=='reduce'){ echo $current; } ?> href="<?php echo admin_url( 'admin.php?page=points_activity&action_name=reduce' ); ?>" rel="external nofollow" >Reduce<span class="count">(<?php echo $points_reduce; ?>)</span></a> |</li>
  143. <li class="remain"><a <?php if($now=='remain'){ echo $current; } ?> href="<?php echo admin_url( 'admin.php?page=points_activity&action_name=remain' ); ?>" rel="external nofollow" >Remain<span class="count">(<?php echo $points_remain; ?>)</span></a></li>
  144. </ul>
  145. <form id="points-activity-filter" method="get" action="">
  146. <style>
  147. th.column-id,
  148. td.column-id,
  149. th.column-user,
  150. td.column-user,
  151. th.column-points,
  152. td.column-points,
  153. th.column-balance,
  154. td.column-balance {
  155. width:10%;
  156. }
  157. .column-points .add {
  158. color:#46b450;
  159. }
  160. .column-points .reduce {
  161. color:#e74c3c;
  162. }
  163. </style>
  164. <p class="search-box">
  165. <label class="screen-reader-text" for="code-search-input">User Search</label>
  166. <input type="search" id="code-search-input" name="user_name" value="" />
  167. <?php submit_button( 'Search', 'button', false, false, array('id' => 'search-submit') ); ?>
  168. <input type="hidden" name="page" value="points_activity" />
  169. </p>
  170. <?php
  171. $this->points_activity_obj->prepare_items();
  172. $this->points_activity_obj->display();
  173. ?>
  174. </form>
  175. </div>
  176. <?php
  177. }
  178. public static function get_instance() {
  179. if ( ! isset( self::$instance ) ) {
  180. self::$instance = new self();
  181. }
  182. return self::$instance;
  183. }
  184. }
  185. ashuwp_points_activity_admin::get_instance();

2. 用户积分页面

与积分动态页面类似,用户积分页面也需要用表格展示,也不一一注释。

  1. if(!class_exists('WP_List_Table')) {
  2. require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
  3. }
  4. class Ashuwp_User_Points_Table extends WP_List_Table {
  5. function __construct(){
  6. parent::__construct( array(
  7. 'singular' => 'User Points',
  8. 'plural' => 'User Points',
  9. 'ajax' => false
  10. ) );
  11. }
  12. function column_default( $item, $column_name ) {
  13. switch ( $column_name ){
  14. case 'user_id':
  15. case 'user_login':
  16. case 'points':
  17. return $item[ $column_name ];
  18. default:
  19. return print_r($item,true);
  20. }
  21. }
  22. function get_columns() {
  23. $columns = array(
  24. 'user_id' => 'User ID',
  25. 'user_login' => 'User Name',
  26. 'points' => 'Points',
  27. );
  28. return $columns;
  29. }
  30. function format_datas( $datas ) {
  31. $return_datas = array();
  32. foreach( $datas as $data ){
  33. $user = get_user_by('id', $data['user_id']);
  34. $item_array = array();
  35. $item_array['user_id'] = $data['user_id'];
  36. $item_array['user_login'] = $user->user_login;
  37. $item_array['points'] = $data['points'];
  38. $return_datas[] = $item_array;
  39. }
  40. return $return_datas;
  41. }
  42. function prepare_items() {
  43. $this->_column_headers = $this->get_column_info();
  44. $per_page = $this->get_items_per_page( 'customers_per_page', 50 );
  45. $current_page = $this->get_pagenum();
  46. $total_items = 0;
  47. $args = array(
  48. 'per_page' => $per_page,
  49. 'paged' => $current_page,
  50. );
  51. $total_items = ashuwp_count_points();
  52. $datas = ashuwp_get_points($args);
  53. $this->items = $this->format_datas($datas);
  54. $this->set_pagination_args( array(
  55. 'total_items' => $total_items,
  56. 'per_page' => $per_page,
  57. 'total_pages' => ceil($total_items/$per_page)
  58. ) );
  59. }
  60. }
  61. class ashuwp_user_points_admin {
  62. static public $instance;
  63. public $user_points_obj;
  64. private function __construct(){
  65. add_filter( 'set-screen-option', array( $this, 'set_screen' ), 10, 3 );
  66. add_action( 'admin_menu', array( $this, 'ashuwp_user_points_menu') );
  67. }
  68. private function __clone() {
  69. }
  70. function ashuwp_user_points_menu() {
  71. $hook = add_submenu_page('points_activity', 'User Points', 'User Points', 'manage_options', 'user_points', array(&$this, 'user_points'));
  72. add_action( "load-$hook", array( $this, 'screen_option' ) );
  73. }
  74. function set_screen( $status, $option, $value ) {
  75. return $value;
  76. }
  77. function screen_option() {
  78. $option = 'per_page';
  79. $args = array(
  80. 'label' => 'Customers',
  81. 'default' => 30,
  82. 'option' => 'customers_per_page'
  83. );
  84. add_screen_option( $option, $args );
  85. $this->user_points_obj = new Ashuwp_User_Points_Table();
  86. }
  87. function user_points(){
  88. $all = ashuwp_count_points();
  89. ?>
  90. <div class="wrap">
  91. <h1 class="wp-heading-inline">User Points</h1>
  92. <a href="<?php echo admin_url( 'admin.php?page=points_activity_add' ); ?>" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="page-title-action">Add/Reduce</a>
  93. <hr class="wp-header-end">
  94. <ul class="subsubsub">
  95. <li class="all"><a class="current" href="<?php echo admin_url( 'admin.php?page=user_points' ); ?>" rel="external nofollow" rel="external nofollow" >All<span class="count">(<?php echo $all; ?>)</span></a></li>
  96. </ul>
  97. <form id="points-activity-filter" method="get">
  98. <?php
  99. $this->user_points_obj->prepare_items();
  100. $this->user_points_obj->display();
  101. ?>
  102. </form>
  103. </div>
  104. <?php
  105. }
  106. public static function get_instance() {
  107. if ( ! isset( self::$instance ) ) {
  108. self::$instance = new self();
  109. }
  110. return self::$instance;
  111. }
  112. }
  113. ashuwp_user_points_admin::get_instance();

3. 积分增减页面

  1. if(!class_exists('WP_List_Table')) {
  2. require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
  3. }
  4. class Ashuwp_User_Points_Table extends WP_List_Table {
  5. function __construct(){
  6. parent::__construct( array(
  7. 'singular' => 'User Points',
  8. 'plural' => 'User Points',
  9. 'ajax' => false
  10. ) );
  11. }
  12. function column_default( $item, $column_name ) {
  13. switch ( $column_name ){
  14. case 'user_id':
  15. case 'user_login':
  16. case 'points':
  17. return $item[ $column_name ];
  18. default:
  19. return print_r($item,true);
  20. }
  21. }
  22. function get_columns() {
  23. $columns = array(
  24. 'user_id' => 'User ID',
  25. 'user_login' => 'User Name',
  26. 'points' => 'Points',
  27. );
  28. return $columns;
  29. }
  30. function format_datas( $datas ) {
  31. $return_datas = array();
  32. foreach( $datas as $data ){
  33. $user = get_user_by('id', $data['user_id']);
  34. $item_array = array();
  35. $item_array['user_id'] = $data['user_id'];
  36. $item_array['user_login'] = $user->user_login;
  37. $item_array['points'] = $data['points'];
  38. $return_datas[] = $item_array;
  39. }
  40. return $return_datas;
  41. }
  42. function prepare_items() {
  43. $this->_column_headers = $this->get_column_info();
  44. $per_page = $this->get_items_per_page( 'customers_per_page', 50 );
  45. $current_page = $this->get_pagenum();
  46. $total_items = 0;
  47. $args = array(
  48. 'per_page' => $per_page,
  49. 'paged' => $current_page,
  50. );
  51. $total_items = ashuwp_count_points();
  52. $datas = ashuwp_get_points($args);
  53. $this->items = $this->format_datas($datas);
  54. $this->set_pagination_args( array(
  55. 'total_items' => $total_items,
  56. 'per_page' => $per_page,
  57. 'total_pages' => ceil($total_items/$per_page)
  58. ) );
  59. }
  60. }
  61. class ashuwp_user_points_admin {
  62. static public $instance;
  63. public $user_points_obj;
  64. private function __construct(){
  65. add_filter( 'set-screen-option', array( $this, 'set_screen' ), 10, 3 );
  66. add_action( 'admin_menu', array( $this, 'ashuwp_user_points_menu') );
  67. }
  68. private function __clone() {
  69. }
  70. function ashuwp_user_points_menu() {
  71. $hook = add_submenu_page('points_activity', 'User Points', 'User Points', 'manage_options', 'user_points', array(&$this, 'user_points'));
  72. add_action( "load-$hook", array( $this, 'screen_option' ) );
  73. }
  74. function set_screen( $status, $option, $value ) {
  75. return $value;
  76. }
  77. function screen_option() {
  78. $option = 'per_page';
  79. $args = array(
  80. 'label' => 'Customers',
  81. 'default' => 30,
  82. 'option' => 'customers_per_page'
  83. );
  84. add_screen_option( $option, $args );
  85. $this->user_points_obj = new Ashuwp_User_Points_Table();
  86. }
  87. function user_points(){
  88. $all = ashuwp_count_points();
  89. ?>
  90. <div class="wrap">
  91. <h1 class="wp-heading-inline">User Points</h1>
  92. <a href="<?php echo admin_url( 'admin.php?page=points_activity_add' ); ?>" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="page-title-action">Add/Reduce</a>
  93. <hr class="wp-header-end">
  94. <ul class="subsubsub">
  95. <li class="all"><a class="current" href="<?php echo admin_url( 'admin.php?page=user_points' ); ?>" rel="external nofollow" rel="external nofollow" >All<span class="count">(<?php echo $all; ?>)</span></a></li>
  96. </ul>
  97. <form id="points-activity-filter" method="get">
  98. <?php
  99. $this->user_points_obj->prepare_items();
  100. $this->user_points_obj->display();
  101. ?>
  102. </form>
  103. </div>
  104. <?php
  105. }
  106. public static function get_instance() {
  107. if ( ! isset( self::$instance ) ) {
  108. self::$instance = new self();
  109. }
  110. return self::$instance;
  111. }
  112. }
  113. ashuwp_user_points_admin::get_instance();

在遇到某个操作比如:充值成功、购买成功、发表评论,执行 ashuwp_add_points_activity 函数即可。

范例一:充值成功增加积分。

  1. //准备参数
  2. $user_id = 1; //用户id
  3. $points = 10; //积分数
  4. $desc = '充值:'.$points;
  5. $args = array(
  6. 'user_id' => $user_id,
  7. 'action' => 'add', //增加
  8. 'points' => $points,
  9. 'description' => $desc,
  10. );
  11. $chognzhi = ashuwp_add_points_activity($args);

四、结语

本教程的思路、代码仅供参考,代码为阿树从实际项目中剥离而来,在代码处理过程中,不敢保证不出错,特别是如果遇到有两个连续的 empty 请自行删除一个。

给TA打赏
共{{data.count}}人
人已打赏
WordPress教程

WordPress 怎么把网站设置成站点维护模式中

2022-9-16 5:00:15

WordPress教程

修改the_excerpt()函数摘要末尾默认省略号[…]为更多

2022-9-20 13:59:06

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索