From 4bab586b6640fcea040a4dfc10ecd9a04e982fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E8=90=BD?= Date: Sun, 2 Feb 2020 11:13:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BE=88=E5=A4=9A=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/gdk.css | 4 +- class/class_load.php | 7 +- class/points/class-points-admin.php | 453 +++++++++++++++++++++++ class/points/class-points-shortcodes.php | 174 +++++++++ class/points/class-points.php | 228 ++++++++++++ class/points/points.php | 59 +++ framework/options-config.php | 119 +++--- framework/plugin-options.php | 3 +- functions/optimization.php | 1 + functions/shortcode.php | 37 ++ gdk_route.php | 2 +- 11 files changed, 1016 insertions(+), 71 deletions(-) create mode 100644 class/points/class-points-admin.php create mode 100644 class/points/class-points-shortcodes.php create mode 100644 class/points/class-points.php create mode 100644 class/points/points.php diff --git a/assets/css/gdk.css b/assets/css/gdk.css index 6e6c4df..e6c2a42 100644 --- a/assets/css/gdk.css +++ b/assets/css/gdk.css @@ -11,5 +11,5 @@ body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fanc /*! Hint.css - v1.3.6 - 2015-10-31 http://kushagragour.in/lab/hint/ Copyright (c) 2015 Kushagra Gour; Licensed MIT */ .hint--bottom:after,.hint--top:after{margin-left:-18px}.hint,[data-hint]{position:relative;display:inline-block}.hint:after,.hint:before,[data-hint]:after,[data-hint]:before{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.hint--always:after,.hint--always:before,.hint:focus:after,.hint:focus:before,.hint:hover:after,.hint:hover:before,[data-hint]:focus:after,[data-hint]:focus:before,[data-hint]:hover:after,[data-hint]:hover:before{opacity:1;visibility:visible}.hint:hover:after,.hint:hover:before,[data-hint]:hover:after,[data-hint]:hover:before{-webkit-transition-delay:100ms;-moz-transition-delay:100ms;transition-delay:100ms}.hint:before,[data-hint]:before{content:'';position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}.hint:after,[data-hint]:after{content:attr(data-hint);background:#383838;color:#fff;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;text-shadow:0 -1px 0 #000;box-shadow:4px 4px 8px rgba(0,0,0,.3)}[data-hint='']:after,[data-hint='']:before{display:none!important}.hint--top:before{border-top-color:#383838;margin-bottom:-12px}.hint--bottom:before{border-bottom-color:#383838;margin-top:-12px}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:focus:after,.hint--top:focus:before,.hint--top:hover:after,.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:focus:after,.hint--bottom:focus:before,.hint--bottom:hover:after,.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-12px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:focus:after,.hint--right:focus:before,.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-12px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:focus:after,.hint--left:focus:before,.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0 #592726}.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0 #6c5328}.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0 #193b4d}.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{background-color:#458746;text-shadow:0 -1px 0 #1a321a}.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always.hint--top:after,.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:after,.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:after,.hint--no-animate:before{-webkit-transition-duration:0ms;-moz-transition-duration:0ms;transition-duration:0ms}.hint--bounce:after,.hint--bounce:before{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)} -/* 其他样式*/ -::selection{background-color:#d73a42;color:#fff}::-moz-selection{background-color:#d73a42;color:#fff}::-webkit-selection{background-color:#d73a42;color:#fff} \ No newline at end of file +/* 鼠标选中样式*/::selection{background-color:#d73a42;color:#fff}::-moz-selection{background-color:#d73a42;color:#fff}::-webkit-selection{background-color:#d73a42;color:#fff} +/*短代码表格样式*/.gdk-table th{background:#7a57d1;border:1px solid #fff;color:#fff;font-weight:700;font-size:1.2pc}.gdk-table tr:nth-child(odd){background:#f4ebf7}.gdk-table td,.gdk-table th{vertical-align:middle}.gdk-table td{border:1px solid #e8daee} \ No newline at end of file diff --git a/class/class_load.php b/class/class_load.php index 9de87b0..fb4ad41 100644 --- a/class/class_load.php +++ b/class/class_load.php @@ -1,7 +1,12 @@ get_columns(); + $hidden = $this->get_hidden_columns(); + $sortable = $this->get_sortable_columns(); + $data = $this->table_data(); + usort( $data, [ &$this, 'sort_data' ] ); + $perPage = 30;//每页30个数据 + $currentPage = $this->get_pagenum(); + $totalItems = count( $data ); + $this->set_pagination_args( [ + 'total_items' => $totalItems, + 'per_page' => $perPage + ] ); + + $data = array_slice( $data, (($currentPage - 1) * $perPage), $perPage ); + + $this->_column_headers = [ + $columns, + $hidden, + $sortable + ]; + $this->items = $data; + } + + /** + * Override the parent columns method. + * Defines the columns to use in your listing table + * + * @return Array + */ + public function get_columns() { + $columns = [ + 'point_id' => 'ID', + 'user_id' => '用户ID', + 'points' => '金币', + 'description' => '描述', + 'datetime' => '日期&时间', + 'status' => '状态', + 'actions' => '操作' + ]; + + return $columns; + } + + /** + * Define which columns are hidden + * + * @return Array + */ + public function get_hidden_columns() { + return []; + } + + /** + * Define the sortable columns + * + * @return Array + */ + public function get_sortable_columns() { + return [ + 'point_id' => [ + 'point_id', + false + ], + 'user_id' => [ + 'user_id', + false + ], + 'points' => [ + 'points', + false + ], + 'description' => [ + 'description', + false + ], + 'datetime' => [ + 'datetime', + false + ], + 'status' => [ + 'status', + false + ] + ]; + } + + /** + * Get the table data + * + * @return Array + */ + private function table_data() { + $data = []; + $data = Points::get_points( null, null, null, ARRAY_A ); + return $data; + } + + /** + * Define what data to show on each column of the table + * + * @param Array $item + * Data + * @param String $column_name + * - Current column name + * + * @return Mixed + */ + public function column_default( $item, $column_name ) { + switch ( $column_name ) { + case 'point_id' : + case 'user_id' : + case 'description' : + case 'points' : + case 'datetime' : + case 'status' : + return $item[$column_name]; + break; + case 'actions': + $actions = [ + 'edit' => sprintf('编辑',$_REQUEST['page'],'edit',$item['point_id']), + 'delete' => sprintf('删除',$_REQUEST['page'],'delete',$item['point_id']), + ]; + + //Return the title contents + return sprintf('%1$s%2$s',$item[$column_name]??"", + $this->row_actions($actions, true) + ); + break; + default : + return print_r( $item, true ); + } + } + + /** + * Allows you to sort the data by the variables set in the $_GET + * + * @return Mixed + */ + private function sort_data( $a, $b ) { + // Set defaults + $orderby = 'point_id'; + $order = 'desc'; + + // If orderby is set, use this as the sort column + if ( !empty( $_GET['orderby'] ) ) { + $orderby = $_GET['orderby']; + } + + // If order is set use this as the order + if ( !empty( $_GET['order'] ) ) { + $order = $_GET['order']; + } + + $result = strnatcmp( $a[$orderby], $b[$orderby] ); + + if ( $order === 'asc' ) { + return $result; + } + + return -$result; + } +} + + +/** + * Points Admin class + */ +class Points_Admin { + + public static function init () { + add_action( 'admin_notices', [ __CLASS__, 'admin_notices' ] ); + add_action( 'admin_menu', [ __CLASS__, 'admin_menu' ], 'manage_options' ); + } + + public static function admin_notices() { + if ( !empty( self::$notices ) ) { + foreach ( self::$notices as $notice ) { + echo $notice; + } + } + } + + /** + * Adds the admin section. + */ + public static function admin_menu() { + $admin_page = add_menu_page('金币','金币','manage_options','points',[ __CLASS__, 'points_menu'],'dashicons-awards'); + } + + public static function points_menu() { + $alert = ""; + if(isset( $_POST['psearch'] )){ + $sdata = trim($_POST['psearch']); + if(preg_match('/E20/', $sdata)){//order id + global $wpdb; + $point_id = $wpdb->get_row("SELECT point_id FROM " . Points_Database::points_get_table( "users" ) . " WHERE description = '{$sdata}'", ARRAY_A )['point_id']; + $points = Points::get_point( $point_id ); + }elseif(filter_var($sdata, FILTER_VALIDATE_EMAIL)){//email + $user = get_user_by( 'email', $sdata ); + $points = Points::get_points_by_user( $user->ID ); + $k[] = '
用户ID:'.$user->ID.'   总金币为:'.Points::get_user_total_points( $user->ID ).'
'; + }else{//userid + $points = Points::get_points_by_user( $sdata ); + $k[] = '
用户ID:'.$sdata.'   总金币为:'.Points::get_user_total_points( $sdata ).'
'; + } + if(is_array($points)){ + foreach ( $points as $point ) { + $k[] = '
金币:'.$point->points.'   描述:'.$point->description.'   日期:'.$point->datetime.'
'; + } + }else{ + $k[] = '
金币:'.$points->points.'   描述:'.$points->description.'   日期:'.$points->datetime.'
'; + } + $alert = implode(" ", $k); + } + + if ( isset( $_POST['save'] ) && isset( $_POST['action'] ) ) { + if ( $_POST['action'] == "edit" ) { + $point_id = isset($_POST['point_id'])?intval( $_POST['point_id'] ) : null; + $points = Points::get_point( $point_id ); + $data = array(); + if ( isset( $_POST['user_mail'] ) ) { + $data['user_mail'] = $_POST['user_mail']; + } + if ( isset( $_POST['user_id'] ) ) { + $data['user_id'] = $_POST['user_id']; + } + if ( isset( $_POST['datetime'] ) ) { + $data['datetime'] = $_POST['datetime']; + } + if ( isset( $_POST['description'] ) ) { + $data['description'] = $_POST['description']; + } + if ( isset( $_POST['status'] ) ) { + $data['status'] = $_POST['status']; + } + if ( isset( $_POST['points'] ) ) { + $data['points'] = $_POST['points']; + } + + if ( $points ) { // 编辑金币 + Points::update_points($point_id, $data); + } else { // 增加金币 + if ( isset( $_POST['user_mail'] ) ) {//如果输入邮箱的话 + $usermail = $data['user_mail']; + $user = get_user_by( 'email', $usermail ); + $userid = $user->ID; + $username = $user->display_name; + } + if ( isset( $_POST['user_id'] ) ) {//如果输入用户ID的话 + $user = get_user_by( 'id', $data['user_id'] ); + $usermail = $user->user_email; + $userid = $data['user_id']; + $username = $user->display_name; + } + Points::set_points($_POST['points'], $userid, $data); + $message = '

金币金额调整通知

尊敬的'.$username.',您好!

您的金币金额被管理员调整,请查收!

您的金币详细情况
用户名'.$username.'
调整金币'.$_POST['points'].'
金币总额'.Points::get_user_total_points($userid, 'accepted' ).'

如果您的金币金额有异常,请您在第一时间和我们取得联系哦,联系邮箱:'.get_bloginfo('admin_email').'

'; + $headers = "Content-Type:text/html;charset=UTF-8\n"; + wp_mail( $usermail , 'Hi,'.$username.',金币账户金额增加通知!', $message ,$headers); + } + } + $alert= "金币已更新"; + } + if ( isset( $_GET["action"] ) ) { + $action = $_GET["action"]; + if ( $action !== null ) { + switch ( $action ) { + case 'edit' : + if ( isset( $_GET['point_id'] ) && ( $_GET['point_id'] !== null ) ) { + return self::points_admin_points_edit( intval( $_GET['point_id'] ) ); + } else { + return self::points_admin_points_edit(); + } + break; + case 'delete' : + if ( $_GET['point_id'] !== null ) { + if ( current_user_can( 'administrator' ) ) { + Points::remove_points( $_GET['point_id'] ); + global $wpdb; + $wcu_sql = "DELETE FROM " . Points_Database::points_get_table( "users" ) . " WHERE status = 'removed'"; + $wpdb->query($wcu_sql); + $alert= "金币已删除"; + } + } + break; + } + } + } + + if ($alert != "") { + echo '
' . $alert . '
'; + } + + $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + $cancel_url = remove_query_arg( 'point_id', remove_query_arg( 'action', $current_url ) ); + $current_url = remove_query_arg( 'point_id', $current_url ); + $current_url = remove_query_arg( 'action', $current_url ); + $exampleListTable = new Points_List_Table(); + $exampleListTable->prepare_items(); + ?> +
+

金币管理

+ + 添加金币 + +
+ +
+ tbody#the-list tr:hover{background:rgba(132,219,162,.61)}';$exampleListTable->display(); ?> +
+ user_id; + $num_points = $points->points; + $description = $points->description; + $datetime = $points->datetime; + $status = $points->status; + } + } else { + $user_id = ""; + $num_points = 0; + $description = "ADD"; + $datetime = ""; + $status = 'accepted'; + } + + if ( empty( $point_id ) ) { + $pointsclass = 'newpoint'; + } else { + $pointsclass = 'editpoint'; + } + $output .= '
'; + $output .= '

'; + if ( empty( $point_id ) ) { + $output .= '新金币'; + } else { + $output .= '编辑金币'; + } + $output .= '

'; + $output .= '
'; + $output .= '
'; + + if ( $point_id ) { + $output .= sprintf( '', intval( $point_id ) ); + } + + $output .= ''; + $output .= '

'; + $output .= ''; + $output .= '

'; + $output .= '

'; + $output .= ''; + $output .= '

'; + $output .= '

'; + $output .= ''; + $output .= '

'; + $output .= '

'; + $output .= ''; + $output .= '

'; + $output .= '

'; + $output .= ''; + $output .= '

'; + $status_descriptions = array( + 'accepted' => '正常', + 'pending' => '待审', + 'rejected' => '驳回', + ); + $output .= '

'; + $output .= ''; + $output .= '

'; + $output .= wp_nonce_field( 'save', 'points-nonce', true, false ); + $output .= sprintf( '', '保存' ); + $output .= ' '; + $output .= sprintf( '%s', $cancel_url, $saved ? '返回' : '取消' ); + $output .= '
'; + $output .= '
'; + $output .= '
'; + echo $output; + } +} \ No newline at end of file diff --git a/class/points/class-points-shortcodes.php b/class/points/class-points-shortcodes.php new file mode 100644 index 0000000..2d65527 --- /dev/null +++ b/class/points/class-points-shortcodes.php @@ -0,0 +1,174 @@ + 10, + 'order_by' => 'points', + 'order' => 'DESC' + ], + $atts + ); + extract( $options ); + $output = ""; + $pointsusers = Points::get_users(); + if ( sizeof( $pointsusers )>0 ) { + foreach ( $pointsusers as $pointsuser ) { + $total = Points::get_user_total_points( $pointsuser ); + $output .='
'; + $output .= ''; + $output .= get_user_meta ( $pointsuser, 'nickname', true ); + $output .= ':'; + $output .= ''; + $output .= " ". $total . " 金币"; + $output .= ''; + $output .= '
'; + } + } else { + $output .= '

No users

'; + } + return $output; + } + public static function points_user_points ( $atts, $content = null ) { + $output = ""; + $options = shortcode_atts(['id' => ""], + $atts + ); + extract( $options ); + if ( $id == "" ) { + $id = get_current_user_id(); + } + if ( $id !== 0 ) { + $points = Points::get_user_total_points( $id, 'accepted' ); + $output .= $points; + } + return $output; + } + + /*付费可见短代码开始*/ + +public static function pay($atts, $content = null) { + global $wpdb; + $user_id = get_current_user_id(); + $description = get_the_ID(); + $result = $wpdb->get_row("SELECT description FROM " . Points_Database::points_get_table("users") . " WHERE user_id=" . $user_id . " AND description=" . $description . " AND status='accepted' LIMIT 0, 3;", ARRAY_A )['description']; //验证是否支付 + extract(shortcode_atts(['point' => "10"], $atts)); + $notice = ''; + $pay_content = get_post_meta($description, 'pay_content', true); + if (!empty($pay_content) && $pay_content != $content) { + update_post_meta($description, 'pay_content', $content, true); + } else { + add_post_meta($description, 'pay_content', $content, true); + } + if (is_user_logged_in()) { + if ($result == $description || current_user_can('administrator')) { + $notice.= '
'; + $notice.= $content; + $notice.= '
'; + } else { + if (Points::get_user_total_points($user_id, 'accepted') < $point) { + $notice.= '
'; + $notice.= '

本段内容需要支付 ' . $point . '金币查看

'; + $notice.= '

您当前拥有 ' . Points::get_user_total_points($user_id, 'accepted') . ' 金币,您的金币不足,请充值

'; + $notice.= '

立即充值

'; + $notice.= '
'; + } else { + $notice.= '
'; + $notice.= '

本段内容需要付费查看,您当前拥有 ' . Points::get_user_total_points($user_id, 'accepted') . ' 金币

'; + $notice.= '

点击购买

'; + $notice.= '
'; + $notice.= '

'; + echo ''; + } + } + } else { + global $wp; + $current_url = home_url(add_query_arg([] , $wp->request)); + $login_uri = '点击登录'; + $notice.= '
'; + $notice.= '

查看本段内容需要支付 ' . $point . ' 金币

'; + $notice.= '

您尚未登录,请 ' . $login_uri . ' 或者 立即注册

'; + $notice.= '
'; + } + return $notice; +} + /*付费可见短代码结束*/ + /** + * Shortcode. 显示用户的金币细节 + */ + public static function points_user_points_details ( $atts, $content = null ) { + $options = shortcode_atts( + [ + 'user_id' => '', + 'order_by' => 'point_id', + 'order' => 'DESC', + 'description' => true + ], + $atts + ); + extract( $options ); + date_default_timezone_set('Asia/Shanghai'); + if ( is_string( $description ) && ( ( $description == '0' ) || ( strtolower( $description ) == 'false' ) ) ) { + $description = false; + } + + $desc_th = ''; + if ( $description ) { + $desc_th = '描述'; + } + global $wp_query; + $curauth = $wp_query->get_queried_object(); + $user_id = $curauth->ID; + $points = Points::get_points_by_user( $user_id ); + $output = '' . + '' . + '' . + '' . + '' . + $desc_th . + ''; + if ( $user_id !== 0 ) { + if ( sizeof( $points ) > 0 ) { + foreach ( $points as $point ) { + $desc_td = ''; + if ( $description ) { + $desc_td = ''; + } + if($point->points > 0){ $leibie = '充值';}elseif($point->points < 0){$leibie = '消费';} + $output .= '' . + '' . + '' . + '' . + '' . + $desc_td . + ''; + } + } + } + + $output .= '
日期时间' . + '金币类别状态
' . $point->description . '
' . $point->datetime . '' . $point->points . '' . $leibie . '' . $point->status . '
'; + + + return $output; + } +} +Points_Shortcodes::init(); \ No newline at end of file diff --git a/class/points/class-points.php b/class/points/class-points.php new file mode 100644 index 0000000..762dea8 --- /dev/null +++ b/class/points/class-points.php @@ -0,0 +1,228 @@ +prefix . self::$prefix . "users"; + break; + } + return $result; + } +} + + +/** + * Points class + */ +class Points { + + public static function get_points_by_user ( $user_id, $limit = null, $order_by = null, $order = null, $output = OBJECT, $offset = 0 ) { + global $wpdb; + + $limit_str = ''; + if ( isset( $limit ) && ( $limit !== null ) ) { + $limit_str = ' LIMIT ' . $offset . ' ,' . $limit; + } + $order_by_str = ""; + if ( isset( $order_by ) && ( $order_by !== null ) ) { + $order_by_str = " ORDER BY " . $order_by; + } + $order_str = ""; + if ( isset( $order ) && ( $order !== null ) ) { + $order_str = " " . $order; + } + + $result = $wpdb->get_results('SELECT * FROM ' . Points_Database::points_get_table( 'users' ) . " WHERE user_id = '$user_id'" . $order_by_str . $order_str . $limit_str, $output ); + + return $result; + } + + public static function get_user_total_points ( $user_id, $status = null ) { + global $wpdb; + + $result = 0; + + $where_status = ''; + if ( $status !== null ) { + $where_status = " AND status = '" . $status . "'"; + } + $points = $wpdb->get_row("SELECT SUM(points) as total FROM " . Points_Database::points_get_table( "users" ) . " WHERE user_id = '$user_id' " . $where_status); + + if ( $points && ( $points->total !== NULL ) ) { + $result = $points->total; + } + return $result; + } + + public static function get_users_total_points ( $limit = null, $order_by = null, $order = null, $status = null ) { + global $wpdb; + + $where_status = ''; + if ( $status !== null ) { + $where_status = " WHERE status = '" . $status . "'"; + } + $points = $wpdb->get_results("SELECT SUM(points) as total, user_id FROM " . Points_Database::points_get_table( "users" ) . $where_status . " GROUP BY user_id"); + + return $points; + } + + /** + * Get users id who have some points + * @param $user_id + * @return array + */ + public static function get_users() { + global $wpdb; + + $users_id = $wpdb->get_results("SELECT user_id FROM " . Points_Database::points_get_table( "users" ) . " GROUP BY user_id"); + + $result = array(); + if ( sizeof( $users_id ) > 0 ) { + foreach ( $users_id as $user_id ) { + $result[] = $user_id->user_id; + } + } + return $result; + } + + public static function set_points ( $points, $user_id, $info = array() ) { + global $wpdb; + + $values = array( 'points' => $points ); + + if ( isset( $info['datetime'] ) && ( $info['datetime'] !== "" ) ) { + $values['datetime'] = $info['datetime']; + } else { + $values['datetime'] = date('Y-m-d H:i:s', time() ); + } + if ( isset( $info['description'] ) ) { + $values['description'] = $info['description']; + } + if ( isset( $info['status'] ) ) { + $values['status'] = $info['status']; + } + if ( isset( $info['type'] ) ) { + $values['type'] = $info['type']; + } + if ( isset( $info['data'] ) ) { + $values['data'] = $info['data']; // yet serialized + } + if ( isset( $info['ip'] ) ) { + $values['ip'] = $info['ip']; + } + if ( isset( $info['ipv6'] ) ) { + $values['ipv6'] = $info['ipv6']; + } + $values['user_id'] = $user_id; + + $rows_affected = $wpdb->insert( Points_Database::points_get_table("users"), $values ); + + return $rows_affected; + } + + /** + * Get a points list. + * @param int $limit + * @param string $order_by + * @param string $order + * @return Ambigous > + */ + public static function get_points ( $limit = null, $order_by = null, $order = null, $output = OBJECT ) { + global $wpdb; + + $where_str = " WHERE status != 'removed'"; + + $limit_str = ""; + if ( isset( $limit ) && ( $limit !== null ) ) { + $limit_str = " LIMIT 0 ," . $limit; + } + $order_by_str = ""; + if ( isset( $order_by ) && ( $order_by !== null ) ) { + $order_by_str = " ORDER BY " . $order_by; + } + $order_str = ""; + if ( isset( $order ) && ( $order !== null ) ) { + $order_str = " " . $order; + } + + $result = $wpdb->get_results("SELECT * FROM " . Points_Database::points_get_table( "users" ) . $where_str . $order_by_str . $order_str . $limit_str, $output ); + + return $result; + } + + public static function get_point ( $point_id = null ) { + global $wpdb; + + $result = null; + + if ( isset( $point_id ) && ( $point_id !== null ) ) { + + $points_id_str = " WHERE point_id = " . (int)$point_id; + $result = $wpdb->get_row("SELECT * FROM " . Points_Database::points_get_table( "users" ) . $points_id_str ); + } + + return $result; + } + + public static function remove_points( $point_id ) { + global $wpdb; + + $values = array(); + $values['status'] = 'removed'; + + $rows_affected = $wpdb->update( Points_Database::points_get_table("users"), $values , array( 'point_id' => $point_id ) ); + + if ( !$rows_affected ) { + $rows_affected = null; + } + return $rows_affected; + } + + public static function update_points( $point_id, $info = array() ) { + global $wpdb; + + $values = array(); + + if ( isset( $info['user_id'] ) ) { + $values['user_id'] = $info['user_id']; + } + if ( isset( $info['datetime'] ) ) { + $values['datetime'] = $info['datetime']; + } + if ( isset( $info['description'] ) ) { + $values['description'] = $info['description']; + } + if ( isset( $info['status'] ) ) { + $values['status'] = $info['status']; + } + if ( isset( $info['points'] ) ) { + $values['points'] = $info['points']; + } + if ( isset( $info['type'] ) ) { + $values['type'] = $info['type']; + } + if ( isset( $info['data'] ) ) { + $values['data'] = $info['data']; // yet serialized + } + if ( isset( $info['ip'] ) ) { + $values['ip'] = $info['ip']; + } + if ( isset( $info['ipv6'] ) ) { + $values['ipv6'] = $info['ipv6']; + } + + $rows_affected = $wpdb->update( Points_Database::points_get_table("users"), $values , array( 'point_id' => $point_id ) ); + + if ( !$rows_affected ) { // insert + $rows_affected = null; + } + return $rows_affected; + } +} diff --git a/class/points/points.php b/class/points/points.php new file mode 100644 index 0000000..8cc778c --- /dev/null +++ b/class/points/points.php @@ -0,0 +1,59 @@ +charset ) ) { + $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset"; + } + if ( ! empty( $wpdb->collate ) ) { + $charset_collate .= " COLLATE $wpdb->collate"; + } + + // create tables + $points_users_table = Points_Database::points_get_table("users"); + if ( $wpdb->get_var( "SHOW TABLES LIKE '$points_users_table'" ) != $points_users_table ) { + $queries[] = "CREATE TABLE $points_users_table ( + point_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + user_id BIGINT(20) UNSIGNED NOT NULL, + points BIGINT(20) DEFAULT 0, + datetime datetime NOT NULL, + description varchar(5000), + ref_id BIGINT(20) DEFAULT null, + ip int(10) unsigned default NULL, + ipv6 decimal(39,0) unsigned default NULL, + data longtext default NULL, + status varchar(10) NOT NULL DEFAULT 'accepted', + type varchar(32) NULL, + PRIMARY KEY (point_id) + ) $charset_collate;"; + } + if ( !empty( $queries ) ) { + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + dbDelta( $queries ); + } + } +} +Points_Class::init(); \ No newline at end of file diff --git a/framework/options-config.php b/framework/options-config.php index 774194d..3f0c120 100644 --- a/framework/options-config.php +++ b/framework/options-config.php @@ -302,7 +302,7 @@ $gdk_options = [ ], [ 'name' => '关键词,IP,邮箱屏蔽', - 'desc' => '开启 【启用后,在WordPress-设置-讨论-黑名单中添加想要屏蔽的关键词,邮箱,网址,IP地址,每行一个】如图设置', + 'desc' => '开启 【启用后,在WordPress-设置-讨论-黑名单中添加想要屏蔽的关键词,邮箱,网址,IP地址,每行一个】点击查看如图设置', 'id' => 'git_spam_keywords', 'type' => 'checkbox' ], @@ -317,82 +317,69 @@ $gdk_options = [ 'desc' => '开启 【启用后,屏蔽含有过长网址(超过50个字符)的评论,当然如果你已经选择了上面的选项的话,就不用选择了】', 'id' => 'git_spam_long', 'type' => 'checkbox' - ], - [ - 'name' => '文章版权声明', - 'desc' => '此处输入的文字将出现在每篇文章最底部,你可以使用:{{title}}表示文章标题,{{link}}表示文章链接', - 'id' => 'git_copyright_b', - 'type' => 'textarea', - 'std' => '极客公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:{{title}}' - ] - ], - '支付设置' => [ - [ - 'title' => '统一支付设置', - 'type' => 'title' - ], - [ - 'name' => '金币和RMB兑换关系', - 'desc' => '请输入兑换关系,比如1RMB=10金币,请慎重选择,一旦设置好后面不能修改的', - 'id' => 'git_payjs_rate', - 'type' => 'number', - 'std' => 10 - ], - [ - 'name' => '选择一个支付方式', - 'desc' => '两种方案选择其中一种,必须选择一个哦', - 'id' => 'git_payjs', - 'type' => 'radio', - 'options' => [ - '0' => '禁用', - '1' => '开启' - ], - 'std' => '1' - ], - [ - 'title' => 'PayJs支付设置   注册PayJs   【微信官方,微信正规渠道,强烈推荐】', - 'type' => 'title' - ], - [ - 'name' => 'PayJs商户号', - 'desc' => '', - 'id' => 'git_payjs_id', - 'type' => 'text', - 'std' => 2333333333 - ], - [ - 'name' => 'PayJs密钥', - 'desc' => '', - 'id' => 'git_payjs_secret', - 'type' => 'text', - 'std' => 444444444 ] ], '高级设置' => [ [ - 'name' => 'jQuery来源设置', - 'desc' => '选择一个适合自己的jQuery公共库来源', - 'id' => 'git_jq', + 'title' => '统一支付设置', + 'type' => 'title' + ], + [ + 'name' => '网站支付功能', + 'desc' => '开启网站支付功能需要HTTPS支持,需要开通Payjs使用,点击注册Payjs', + 'id' => 'gdk_payjs', 'type' => 'radio', 'options' => [ - '1' => '远程jQuery库【底部加载,速度快,兼容差】', - '0' => '本地jQuery库【头部加载,速度慢,兼容好】' + '0' => '禁用', + '1' => '开启' + ], + 'std' => '0' + ], + [ + 'name' => '金币和RMB兑换关系', + 'desc' => '请输入兑换关系,默认1RMB=10金币,请慎重选择,一旦设置好后面不能修改的,本选项仅对会员金币支付生效,游客免登陆支持不受影响', + 'id' => 'gdk_rate', + 'type' => 'number', + 'std' => 10 + ], + [ + 'name' => 'PayJs商户号', + 'desc' => '', + 'id' => 'gdk_payjs_id', + 'type' => 'text', + 'std' => 2333333333 + ], + [ + 'name' => 'PayJs密钥', + 'desc' => '', + 'id' => 'gdk_payjs_key', + 'type' => 'text', + 'std' => 444444444 + ], + [ + 'name' => 'jQuery加载位置设置', + 'desc' => '选择一个适合自己网站的jQuery加载位置,默认是底部加载', + 'id' => 'gdk_jq', + 'type' => 'radio', + 'options' => [ + '1' => '底部加载,速度快', + '0' => '头部加载,兼容好' ], 'std' => '1' ], [ - 'name' => 'HTML代码压缩', - 'desc' => '启用 【开启后,将压缩网页HTML代码,可读性会降低,但是性能略有提升】', - 'id' => 'git_compress', - 'type' => 'checkbox' - ], + 'name' => 'HTML代码压缩', + 'desc' => '启用 【开启后,将压缩网页HTML代码,可读性会降低,但是性能略有提升】', + 'id' => 'gdk_compress', + 'type' => 'checkbox' + ], + [ + 'name' => '图片懒加载', + 'desc' => '启用 【开启后,网站图片将进行懒加载】', + 'id' => 'gdk_lazyload', + 'type' => 'checkbox' + ], [ - 'name' => '图片懒加载', - 'desc' => '启用 【开启后,网站图片将进行懒加载】', - 'id' => 'git_lazyload', - 'type' => 'checkbox' - ], - [ 'name' => '侧边栏缓存', 'desc' => '启用 【开启后,将会自动缓存小工具,如果想禁止缓存某个小工具,可以去小工具页面排除】', 'id' => 'git_sidebar_cache', diff --git a/framework/plugin-options.php b/framework/plugin-options.php index 3112ad6..6c6be01 100644 --- a/framework/plugin-options.php +++ b/framework/plugin-options.php @@ -361,8 +361,9 @@ depend('gdk_lock_login','#row-gdk_failed_login_limit,#row-gdk_lockout_duration') depend('gdk_smtp','#row-gdk_smtp_username,#row-gdk_smtp_host,#row-gdk_smtp_port,#row-gdk_smtp_mail,#row-gdk_smtp_password'); depend('gdk_baidu_push','#row-gdk_baidu_api'); depend('gdk_tag_link','#row-gdk_tag_num'); -depend('gdk_cdn','#row-gdk_cdn_host,#row-gdk_cdn_ext,#row-gdk_cdn_dir,#row-gdk_cdn_style,#row-git_cdn_water'); +depend('gdk_cdn','#row-gdk_cdn_host,#row-gdk_cdn_ext,#row-gdk_cdn_dir,#row-gdk_cdn_style,#row-gdk_cdn_water'); depend('gdk_h5notice','#row-git_notification_title,#row-git_notification_days,#row-git_notification_cookie,#row-git_notification_icon,#row-git_notification_link,#row-git_notification_body'); +depend('gdk_payjs','#row-gdk_rate,#row-git_payjs_rate,#row-gdk_payjs_id,#row-gdk_payjs_key'); }); diff --git a/functions/optimization.php b/functions/optimization.php index 3efc37d..642a10b 100644 --- a/functions/optimization.php +++ b/functions/optimization.php @@ -44,6 +44,7 @@ add_action('login_head', 'gdk_wps_login_error'); add_filter('pre_option_link_manager_enabled', '__return_true'); add_filter('show_admin_bar', '__return_false'); +add_filter('run_wptexturize', '__return_false'); //移除 WP_Head 无关紧要的代码 if(gdk_option('gdk_diasble_head_useless')){ diff --git a/functions/shortcode.php b/functions/shortcode.php index b7f3a56..71cb74f 100644 --- a/functions/shortcode.php +++ b/functions/shortcode.php @@ -261,6 +261,43 @@ function git_list_shortcode_handler($atts, $content = '') { add_shortcode('list', 'git_list_shortcode_handler'); +//表格短代码 +function table_shortcode_handler( $atts, $content='' ) { + extract( shortcode_atts( ['width' => '100%'], $atts ) ); + $output = ''; + $content = trim($content); + $trs = explode("\r\n", $content); + $ths = explode(" ", $trs[0]);//表头数组 + $output .= ''; + //var_dump($ths); + foreach($ths as $th){ + $output .= ''.$th.''; + } + $output .= ''; + $output .= ''; + unset($trs[0]); + foreach($trs as $tr){ + $tr = trim($tr); + if($tr){ + $tds = explode(" ", $tr); + $output .= ''; + foreach($tds as $td){ + $td = trim($td); + if($td){ + $output .= ''.$td.''; + } + } + $output .= ''; + } + } + $output .= ''; + $width = ' width="'.$width.'"'; + $output = ''.$output.'
'; + + return $output; +} +add_shortcode( 'table', 'table_shortcode_handler' ); + //WordPress 段代码按钮集合 function gdk_shortcode_list() { $wpshortcodes = [ diff --git a/gdk_route.php b/gdk_route.php index 471682d..ef7f206 100644 --- a/gdk_route.php +++ b/gdk_route.php @@ -26,7 +26,7 @@ define('GDK_BASE_URL', plugin_dir_url( __FILE__ ) );//插件目录url define('GDK_ROOT_PATH', plugin_dir_path( __FILE__ ) );//插件目录路径 //加载各种资源 -include('class/class_load.php');//加载各种类 include('framework/frame_load.php');//加载后台框架 +include('class/class_load.php');//加载各种类 include('functions/func_load.php');//加载函数 include('assets/assets_load.php');//加载静态资源