| Server IP : 43.141.50.122 / Your IP : 113.219.202.141 Web Server : Apache System : Linux VM-8-5-opencloudos 6.6.34-9.oc9.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 19 19:35:45 CST 2024 x86_64 User : www ( 1000) PHP Version : 8.1.27 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /www/wwwroot/www.ucppt.com/wp-content/plugins/wpcom-member-pro/includes/ |
Upload File : |
<?php
namespace WPCOM\Member;
use WPCOM\Themer\Plugin\Utils;
defined( 'ABSPATH' ) || exit;
class Invitation_Code{
protected static $table = 'wpcom_invitcodes';
function __construct(){
add_action('admin_menu', array($this, 'admin_menu'));
add_action('wpcom_invitcodes_cron', array($this, 'cron') );
add_action('register_form', array($this, 'default_register_form'));
add_action('signup_extra_fields', array($this, 'default_register_form') );
add_action('user_register', array($this, 'user_register') );
add_action('wpmx_social_login_register_form', array($this, 'sl_register'));
add_action('wpcom_themer_maybe_updated', function(){ self::init_database(); });
add_filter('wpcom_member_invitcodes_metas', array($this, 'invitcodes_metas'), 1);
add_filter('wpcom_member_edit_code_metas', array($this, 'edit_code_metas'), 1);
add_filter('registration_errors', array($this, 'registration_errors'));
add_filter('wpmu_validate_user_signup' , array($this, 'registration_errors') );
add_filter('wpcom_register_form_items', array($this, 'wpcom_register_form') );
add_filter('wpcom_register_form_validate', array($this, 'registration_errors'));
add_filter('wpcom_login_field_text', array($this, 'input_notice'), 10, 2);
add_filter('wpmx_social_login_pre_insert_user', array($this, 'registration_errors'));
add_filter('parent_file', array($this, 'parent_file_filter'));
add_filter('submenu_file', array($this, 'submenu_file_filter'));
}
public function admin_menu() {
add_submenu_page('wpcom-member-pro', '邀请码', '邀请码', 'manage_options', 'wpcom-invitation-code', array(&$this, 'codes_list'), 10);
add_submenu_page('wpcom-invitation-code', '生成邀请码', '生成邀请码', 'manage_options', 'wpcom-add-code', array(&$this, 'add_code'), 10);
add_submenu_page('wpcom-invitation-code', '编辑邀请码', '编辑邀请码', 'manage_options', 'wpcom-edit-code', array(&$this, 'edit_code'), 10);
if (!wp_next_scheduled ( 'wpcom_invitcodes_cron' )) wp_schedule_event(time(), 'hourly', 'wpcom_invitcodes_cron');
}
public function parent_file_filter($parent_file) {
global $_wp_real_parent_file, $plugin_page, $_wp_menu_nopriv;
if($plugin_page === 'wpcom-add-code' || $plugin_page === 'wpcom-edit-code'){
$_wp_real_parent_file[$plugin_page] = 'wpcom-member-pro';
$_wp_menu_nopriv[$plugin_page] = 'wpcom-member-pro';
if ($parent_file === 'wpcom-invitation-code') $parent_file = 'wpcom-member-pro';
}
return $parent_file;
}
public function submenu_file_filter($submenu_file) {
global $pagenow;
$screen = get_current_screen();
if ($pagenow == 'admin.php' && ($screen->base == 'admin_page_wpcom-add-code' || $screen->base == 'admin_page_wpcom-edit-code')) {
$submenu_file = 'wpcom-invitation-code';
}
return $submenu_file;
}
public function codes_list() { ?>
<div class="wrap">
<h1 class="wp-heading-inline">邀请码</h1>
<a href="<?php echo admin_url('admin.php?page=wpcom-add-code'); ?>" class="page-title-action">生成邀请码</a>
<form method="post">
<?php
if (!class_exists('Invitation_Code_List')) require_once WPCOM_MP_DIR . '/includes/invitation-code-list.php';
$list = new Invitation_Code_List();
$list->prepare_items();
$list->search_box('搜索邀请码', 'codes');
$list->display();
?>
</form>
</div>
<?php }
public function add_code() {
require_once WPCOM_ADMIN_PATH . 'includes/class-utils.php';
Utils::panel_script();
$data = map_deep($_POST, 'sanitize_text_field');
$res = $data && isset($data['add-code-nonce']) && wp_verify_nonce($data['add-code-nonce'], 'add-code') ? self::generate_code($data) : '';
$base_url = admin_url('admin.php?page=wpcom-invitation-code');
?>
<div class="wrap">
<h1 class="wp-heading-inline">
生成邀请码
<a class="page-title-action" href="<?php echo $base_url; ?>"><span class="dashicons dashicons-arrow-left-alt" style="line-height: inherit;width:1em;height:1em;font-size:inherit;"></span> 返回</a>
</h1>
<?php if (!is_wp_error($res) && !empty($res)) { ?>
<div id="message" class="notice notice-success">
<p><strong>邀请码生成成功。</strong></p>
<p>
<a href="<?php echo $base_url; ?>" style="text-decoration: none;">
<span class="dashicons dashicons-arrow-left-alt" style="line-height: inherit;width:1em;height:1em;font-size:inherit;"></span> 返回“邀请码”页面
</a>
</p>
</div>
<?php } else if (is_wp_error($res)) { ?>
<div id="message" class="notice notice-error">
<p><strong>邀请码生成失败。</strong></p>
<p><?php echo $res->get_error_message(); ?></p>
</div>
<?php } ?>
<?php if (!is_wp_error($res) && !empty($res)) { ?>
<h3>本次生成的邀请码</h3>
<p>多个邀请码则一行一个,可点击下方按钮一键复制</p>
<div class="form-field">
<textarea name="invitation-code" id="invitation-code" cols="30" rows="10"><?php echo implode("\r\n", $res);?></textarea>
</div>
<div class="form-field">
<p class="submit"><input type="submit" name="submit" id="submit" class="button button-primary" value="复制邀请码"></p>
</div>
<script>
if (typeof _plugins_options === 'undefined') _plugins_options = [];
jQuery(function($){
$('#submit').on('click', function(){
if( typeof document.execCommand !== 'undefined' ){
var t = document.querySelector('#invitation-code');
t.select();
document.execCommand('copy');
alert('复制成功');
}else{
alert('浏览器不支持复制,请通过手动全选复制来完成复制操作');
}
})
})
</script>
<?php } else { ?>
<form name="add-code" id="edittag" method="post" action="" class="add-code validate">
<?php wp_nonce_field('add-code', 'add-code-nonce'); ?>
<table class="form-table" role="presentation">
<tr id="wpcom-plugin-panel" class="wpcom-term-wrap">
<td colspan="2">
<term-panel :ready="ready" />
</td>
</tr>
</table>
<input type="submit" class="button button-primary" value="提交" />
</form>
<div style="display: none;"><?php wp_editor('EDITOR', 'WPCOM-EDITOR', Utils::editor_settings(array('textarea_name' => 'EDITOR-NAME'))); ?></div>
<script>
if (typeof _plugins_options === 'undefined') _plugins_options = [];
_plugins_options.push(<?php echo $this->get_invitcodes_metas(); ?>);
</script>
<?php } ?>
</div>
<?php }
public function edit_code(){
require_once WPCOM_ADMIN_PATH . 'includes/class-utils.php';
Utils::panel_script();
$data = map_deep($_POST, 'sanitize_text_field');
$res = $data && isset($data['edit-code-nonce']) && wp_verify_nonce($data['edit-code-nonce'], 'edit-code') ? self::update_code($data) : '';
$id = isset($_GET['id']) ? sanitize_text_field($_GET['id']) : 0;
$base_url = admin_url('admin.php?page=wpcom-invitation-code');
if($id && $code = self::get_code($id, 'ID')){
if($data && $code && $res !== ''){
$code->code = trim($data['wpcom_code']);
$code->expired = Utils::input_time($data['wpcom_expired']);
$code->times = trim($data['wpcom_times']);
$code->disable = $data['wpcom_disable'];
}
?>
<div class="wrap">
<h1 class="wp-heading-inline">
编辑邀请码
<a class="page-title-action" href="<?php echo $base_url; ?>"><span class="dashicons dashicons-arrow-left-alt" style="line-height: inherit;width:1em;height:1em;font-size:inherit;"></span> 返回</a>
</h1>
<?php if (!is_wp_error($res) && !empty($res)) { ?>
<div id="message" class="notice notice-success">
<p><strong>邀请码更新成功。</strong></p>
<p>
<a href="<?php echo $base_url; ?>" style="text-decoration: none;">
<span class="dashicons dashicons-arrow-left-alt" style="line-height: inherit;width:1em;height:1em;font-size:inherit;"></span> 返回“邀请码”页面
</a>
</p>
</div>
<?php } else if (is_wp_error($res)) { ?>
<div id="message" class="notice notice-error">
<p><strong>邀请码更新失败。</strong></p>
<p><?php echo $res->get_error_message(); ?></p>
</div>
<?php } ?>
<form name="edit-code" id="edittag" method="post" action="" class="add-code validate">
<input type="hidden" name="code_id" value="<?php echo esc_attr($id); ?>" />
<?php wp_nonce_field('edit-code', 'edit-code-nonce'); ?>
<table class="form-table" role="presentation">
<tr id="wpcom-plugin-panel" class="wpcom-term-wrap">
<td colspan="2">
<term-panel :ready="ready" />
</td>
</tr>
</table>
<input type="submit" class="button button-primary" value="提交" />
</form>
<div style="display: none;"><?php wp_editor('EDITOR', 'WPCOM-EDITOR', Utils::editor_settings(array('textarea_name' => 'EDITOR-NAME'))); ?></div>
<script>
if (typeof _plugins_options === 'undefined') _plugins_options = [];
_plugins_options.push(<?php echo $this->get_invitcodes_metas($code); ?>);
</script>
</div>
<?php }else{
wp_die('邀请码获取失败');
}
}
function update_code($data){
global $wpdb;
$_code = isset($data['code_id']) ? self::get_code($data['code_id'], 'ID') : '';
if(!$_code) return new \WP_Error('code_error', '获取邀请码信息失败');
$code = array();
$data['wpcom_code'] = isset($data['wpcom_code']) ? trim($data['wpcom_code']) : '';
if($data['wpcom_code'] && preg_match('/^[a-zA-Z0-9_-]{6,64}$/', $data['wpcom_code'])){
$code['code'] = $data['wpcom_code'];
}else{
return new \WP_Error('code_error', '邀请码错误:仅支持字母、数字以及 _ - 符号');
}
require_once WPCOM_ADMIN_PATH . 'includes/class-utils.php';
$expired = isset($data['wpcom_expired']) ? Utils::input_time($data['wpcom_expired']) : '';
if($expired) $code['expired'] = $expired;
$code['times'] = isset($data['wpcom_times']) && is_numeric(trim($data['wpcom_times'])) && trim($data['wpcom_times']) > 0 ? trim($data['wpcom_times']) : 1;
$code['status'] = isset($data['wpcom_disable']) && $data['wpcom_disable'] == '1' ? '-1' : $_code->status;
if(isset($data['wpcom_disable']) && $data['wpcom_disable'] == '1'){
$code['status'] = -1;
}else{
$code['status'] = 0;
$date2 = new \DateTime($expired, wp_timezone());
$expired2 = $date2->format('U');
if($expired && $expired2 > 0 && $expired2 < time()){ // 过期
$code['status'] = 2;
}
if($_code->users && $users = maybe_unserialize($_code->users)){ // 达到次数限制
if(is_array($users) && count($users) >= $code['times']){
$code['status'] = 1;
}
}
}
$table = $wpdb->prefix . self::$table;
return $wpdb->update($table, $code, array('ID' => $_code->ID));
}
public static function generate_code($data){
$prefix = isset($data['wpcom_prefix']) ? trim($data['wpcom_prefix']) : '';
if(!preg_match('/^[a-zA-Z0-9_-]{0,32}$/', $prefix)){
return new \WP_Error('prefix_error', '邀请码前缀错误:仅支持字母、数字以及 _ - 符号');
}
$len = isset($data['wpcom_len']) && is_numeric(trim($data['wpcom_len'])) && trim($data['wpcom_len']) >= 6 && trim($data['wpcom_len']) <= 64 ? trim($data['wpcom_len']) : 32;
$times = isset($data['wpcom_times']) && is_numeric(trim($data['wpcom_times'])) && trim($data['wpcom_times']) > 0 ? trim($data['wpcom_times']) : 1;
require_once WPCOM_ADMIN_PATH . 'includes/class-utils.php';
$expired = isset($data['wpcom_expired']) ? Utils::input_time($data['wpcom_expired']) : '';
$num = isset($data['wpcom_num']) && is_numeric(trim($data['wpcom_num'])) && trim($data['wpcom_num']) > 0 ? (int) trim($data['wpcom_num']) : 1;
$num = $num > 100 ? 100 : $num;
$codes = array();
$i=0; $x = 0;
while ( $i < $num && $x < 200 ){
$code = $prefix . wp_generate_password($len, false);
$res = self::insert_code($code, $times, $expired);
if($res) {
$codes[] = $code;
$i++;
}
$x++;
}
return $codes;
}
public static function insert_code($code, $times, $expired){
global $wpdb;
$table = $wpdb->prefix . self::$table;
$sql = $wpdb->prepare("INSERT IGNORE INTO $table ( code, times, users, expired, status ) VALUES( %s, %s, '', %s, 0 )", $code, $times, $expired);
return $wpdb->query($sql);
}
public static function get_code($val, $by = 'code'){
global $wpdb;
$table = $wpdb->prefix . self::$table;
$by = esc_sql($by);
$code = $wpdb->get_row($wpdb->prepare("SELECT * FROM `$table` WHERE `$by` = %s", $val));
if ($code && $code->ID) return $code;
}
private function get_invitcodes_metas($code = null) {
$res = array('type' => 'taxonomy', 'tax' => 'invitcodes', 'options' => array());
if($code && isset($code->ID)){
$res['options'] = $code;
if($code->status == '-1') $res['options']->disable = 1;
}
$plugin = $GLOBALS['wpcom_mp']->info;
$res['filters'] = apply_filters($code ? 'wpcom_member_edit_code_metas' : 'wpcom_member_invitcodes_metas', array());
$res['ver'] = $plugin['ver'];
$res['plugin-id'] = $plugin['plugin_id'];
$res['plugin-slug'] = $plugin['slug'];
$res['framework_ver'] = Utils::framework_version($plugin['slug']);
return wp_json_encode($res);
}
function default_register_form($errors){
$options = $GLOBALS['wpmx_options'];
$invitation_code = '';
if ( isset( $_POST['invitation_code'] ) && is_string( $_POST['invitation_code'] ) ) {
$invitation_code = wp_unslash( sanitize_text_field($_POST['invitation_code']) );
}
$action = current_filter();
if($action === 'register_form'){
?>
<p>
<label for="invitation_code">邀请码</label>
<input type="text" name="invitation_code" id="invitation_code" class="input" value="<?php echo esc_attr( $invitation_code ); ?>" size="100" autocomplete="off" />
</p>
<?php
if(isset($options['invitcode_input']) && $options['invitcode_input']){
echo '<p style="margin:-12px 6px 16px 0;">' . wp_kses($options['invitcode_input'], wpmx_allowed_html()) . '</p>';
}
} else if($action === 'signup_extra_fields'){ ?>
<label for="invitation_code">邀请码</label>
<?php if ( $errmsg = $errors->get_error_message( 'invitation_code_error' ) ) : ?>
<p class="error"><?php echo $errmsg; ?></p>
<?php endif; ?>
<input style="width: 100%; font-size: 24px; margin: 5px 0;" type="text" name="invitation_code" id="invitation_code" class="input" value="<?php echo esc_attr( $invitation_code ); ?>" size="100" autocomplete="off" />
<?php
if(isset($options['invitcode_input']) && $options['invitcode_input']){
echo '<br />' . wp_kses($options['invitcode_input'], wpmx_allowed_html());
}
?>
<?php }
}
function sl_register(){
$options = $GLOBALS['wpmx_options'];?>
<div class="sl-input-item">
<label>邀请码</label>
<div class="sl-input">
<input class="require" type="text" name="invitation_code" placeholder="请输入邀请码">
</div>
<?php if(isset($options['invitcode_input']) && $options['invitcode_input']){ ?>
<div class="form-input-desc"><?php echo wp_kses($options['invitcode_input'], wpmx_allowed_html());?></div>
<?php } ?>
</div>
<?php }
function wpcom_register_form($items){
$item = array(
'type' => 'text',
'label' => '邀请码',
'icon' => 'shield-keyhole',
'name' => 'invitation_code',
'require' => true,
'placeholder' => '请输入邀请码',
);
if(is_wpcom_enable_phone()) {
$items += array(
45 => $item
);
}else{
$items += array(
35 => $item
);
}
return $items;
}
function registration_errors($res){
$action = current_filter();
$err = '';
if ( empty( $_POST['invitation_code'] ) ) {
$err = '请填写邀请码';
}else{
$invitation_code = sanitize_text_field( $_POST['invitation_code'] );
$status = self::get_code_status($invitation_code);
if($status === false){
$err = '请填写正确的邀请码';
}else if($status !== 0){
$err = '邀请码不可用';
}
}
if($action === 'wpcom_register_form_validate' && $res['result'] == 1 && $err){
$res['result'] = 0;
$res['error'] = $err;
}else if($action === 'wpmx_social_login_pre_insert_user' && $err){
return new \WP_Error( 'invitation_code_error', $err );
}else if($err){
$errors = $action === 'registration_errors' ? $res : $res['errors'];
$errors->add( 'invitation_code_error', $err );
if($action === 'registration_errors'){
$res = $errors;
}else{
$res['errors'] = $errors;
}
}
return $res;
}
function user_register($user_id){
if(!$user_id) return false;
if ( !empty( $_POST['invitation_code'] ) && sanitize_text_field( $_POST['invitation_code'] ) !== '' ) {
$code = sanitize_text_field( $_POST['invitation_code'] );
$this->update_for_user_register($user_id, $code);
}
}
function update_for_user_register($user_id, $code){
global $wpdb;
$table = $wpdb->prefix . self::$table;
$result = self::get_code($code);
if($result && isset($result->ID)){
$users = maybe_unserialize($result->users);
$users = $users ?: array();
$users[] = $user_id;
$users = array_filter($users);
$status = $result->status;
if(count($users) >= $result->times){
$status = 1;
}
$_code = array(
'users' => maybe_serialize($users),
'status' => $status
);
add_user_meta( $user_id, 'invitation_code', $result->code, true );
return $wpdb->update($table, $_code, array('ID' => $result->ID));
}
}
public static function get_code_status($invitation_code){
$code = self::get_code($invitation_code);
if($code && isset($code->ID)){
if($code->status == '0'){
if($code->expired && $code->expired != '0000-00-00 00:00:00' ){ // 过期
$date = new \DateTime($code->expired, wp_timezone());
$expired = $date->format('U');
if($expired < time()) $code->status = 2;
}
if($code->users && $users = maybe_unserialize($code->users)){
if(is_array($users) && $count = count($users)){
if($count >= $code->times) $code->status = 1;
}
}
}
return (int) $code->status;
}
return false;
}
public function invitcodes_metas($metas) {
$metas['invitcodes'] = array(
array(
'n' => 'prefix',
'l' => '邀请码前缀',
'd' => '可选,不设置则无前缀'
),
array(
'n' => 'len',
'l' => '邀请码长度',
's' => 32,
'd' => '字符长度,最少6,最大64,不包含前缀,不设置或者长度不符则为默认 32'
),
array(
'n' => 'times',
'l' => '使用次数',
's' => 1,
'd' => '可选,邀请码可使用的次数限制,不设置默认为1次'
),
array(
'n' => 'expired',
'l' => '过期时间',
't' => 'dp',
'time' => 1,
'd' => '可选,不设置则无时间限制'
),
array(
'n' => 'num',
'l' => '生成数量',
's' => 1,
'd' => '可批量生成多个,不设置默认仅生成1个,同时为避免误输入导致性能问题,每次生成数量上限为100'
),
);
return $metas;
}
public function edit_code_metas($metas) {
$metas['invitcodes'] = array(
array(
'n' => 'code',
'l' => '邀请码',
'd' => '长度最少6,最大64'
),
array(
'n' => 'times',
'l' => '使用次数',
's' => 1,
'd' => '可选,邀请码可使用的次数限制,不设置默认为1次'
),
array(
'n' => 'expired',
'l' => '过期时间',
't' => 'dp',
'time' => 1,
'd' => '可选,不设置则无时间限制'
),
array(
'n' => 'disable',
'l' => '停用此邀请码',
't' => 't',
'd' => '开启后邀请码无法使用,关闭后将根据过期时间、可用次数进行判断'
)
);
return $metas;
}
public function input_notice($html, $args){
if(isset($args['name']) && $args['name'] === 'invitation_code'){
$options = $GLOBALS['wpmx_options'];
if(isset($options['invitcode_input']) && $options['invitcode_input']){
$html .= '<div class="form-input-desc">'.wp_kses($options['invitcode_input'], wpmx_allowed_html()).'</div>';
}
}
return $html;
}
private static function init_database(){
global $wpdb;
$table = $wpdb->prefix . self::$table;
if( $wpdb->get_var("SHOW TABLES LIKE '$table'") != $table ){
$charset_collate = $wpdb->get_charset_collate();
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$create_sql = "CREATE TABLE $table (".
"ID BIGINT(20) NOT NULL auto_increment,".
"code varchar(100) NOT NULL,".
"times INT NOT NULL,".
"users text,".
"expired datetime,".
"status varchar(20),".
"PRIMARY KEY (ID),".
"UNIQUE KEY (code)) $charset_collate;";
dbDelta( $create_sql );
}
}
public static function cron(){
global $wpdb;
$table = $wpdb->prefix . self::$table;
if( $wpdb->get_var("SHOW TABLES LIKE '$table'") == $table ) {
$temps = $wpdb->get_results($wpdb->prepare("SELECT * FROM `$table` WHERE expired > '1900-00-00 00:00:00' AND expired < %s AND status='0'", current_time('mysql')));
if ($temps) {
foreach ($temps as $temp) {
$wpdb->update($table, array('status' => 2), array('ID' => $temp->ID));
}
}
}
}
}
new Invitation_Code();