HEX
Server: nginx/1.22.1
System: Linux VM-16-9-centos 3.10.0-1160.99.1.el7.x86_64 #1 SMP Wed Sep 13 14:19:20 UTC 2023 x86_64
User: www (1001)
PHP: 7.3.31
Disabled: 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
Upload Files
File: /www/wwwroot/softfox.com.cn/wp-content/plugins/wpjam-basic/components/wpjam-custom.php
<?php
/*
Name: 样式定制
URI: https://mp.weixin.qq.com/s/Hpu1vz7zPUKEeHTF3wqyWw
Description: 对网站的前后台和登录界面的样式进行个性化设置。
Version: 2.0
*/
class WPJAM_Custom extends WPJAM_Option_Model{
	public static function get_sections(){
		return [
			'wpjam-custom'	=> ['title'=>'前台定制',	'fields'=>[
				'head'		=> ['title'=>'前台 Head 代码',	'type'=>'textarea',	'class'=>''],
				'footer'	=> ['title'=>'前台 Footer 代码',	'type'=>'textarea',	'class'=>''],
			]],
			'admin-custom'	=> ['title'=>'后台定制',	'fields'=>[
				'admin_logo'	=> ['title'=>'工具栏左上角 Logo',	'type'=>'img',	'item_type'=>'url',	'description'=>'建议大小:20x20。如果前台也显示工具栏,也会被修改。'],
				'admin_head'	=> ['title'=>'后台 Head 代码 ',	'type'=>'textarea',	'class'=>''],
				'admin_footer'	=> ['title'=>'后台 Footer 代码',	'type'=>'textarea',	'class'=>'']
			]],
			'login-custom'	=> ['title'=>'登录界面', 	'fields'=>[
				'login_head'		=> ['title'=>'登录界面 Head 代码',		'type'=>'textarea',	'class'=>''],
				'login_footer'		=> ['title'=>'登录界面 Footer 代码',	'type'=>'textarea',	'class'=>''],
				'login_redirect'	=> ['title'=>'登录之后跳转的页面',		'type'=>'text'],
				'disable_language_switcher'	=> ['title'=>'登录界面语言切换器',		'type'=>'checkbox',	'description'=>'屏蔽登录界面语言切换器'],
			]]
		];
	}

	public static function get_menu_page(){
		$menu_page	= [
			'parent'		=> 'wpjam-basic',
			'menu_slug'		=> 'wpjam-custom',
			'function'		=> 'option',
			'position'		=> 1,
			'summary'		=> __FILE__,
		];

		if(wpjam_get_user_signups(['bind'=>true])){
			return [$menu_page, [
				'parent'		=> 'users',
				'menu_slug'		=> 'wpjam-bind',
				'menu_title'	=> '账号绑定',
				'order'			=> 20,
				'capability'	=> 'read',
				'function'		=> 'tab',
				'tabs'			=> [self::class, 'get_tabs']
			]];
		}

		return $menu_page;
	}

	public static function get_admin_load(){
		if(wpjam_get_user_signups()){
			return [
				'base'	=> 'users',
				'model'	=> self::class
			];
		}
	}

	public static function ajax_callback($data, $name){
		$action	= $data['action'] ?? '';
		$type	= $action ? $data['action'].'_type' : null;
		$object	= $type ? wpjam_get_user_signup_object($data[$type]) : null;

		if(!$object){
			wp_die('无效的类型');
		}

		if($name == 'get-signup'){
			$attr	= wpjam_throw_if_error($object->get_attr($data['action']));

			$attr['fields']	= wpjam_fields($attr['fields'])->render(['wrap_tag'=>'p']);

			return array_merge(wpjam_get_ajax_data_attr('signup')->to_array(), $attr);
		}else{
			if($action == 'bind'){
				$result	= $object->bind($data);
			}elseif($action == 'unbind'){
				$result	= $object->unbind();
			}else{
				$result	= $object->signup($data);
			}

			wpjam_throw_if_error($result);

			return true;
		}
	}

	public static function on_admin_bar_menu($wp_admin_bar){
		remove_action('admin_bar_menu',	'wp_admin_bar_wp_menu', 10);

		$logo	= self::get_setting('admin_logo');
		$logo	= $logo ? wpjam_get_thumbnail($logo, 40, 40) : '';
		$title	= $logo ? wpjam_tag('img', ['src'=>$logo, 'style'=>'height:20px; padding:6px 0;']) : wpjam_tag('span', ['ab-icon']);

		$wp_admin_bar->add_menu([
			'id'    => 'wp-logo',
			'title' => $title,
			'href'  => is_admin() ? self_admin_url() : site_url(),
			'meta'  => ['title'=>get_bloginfo('name')]
		]);
	}

	public static function filter_admin_title($admin_title){
		return str_replace(' &#8212; WordPress', '', $admin_title);
	}

	public static function filter_admin_footer_text($text){
		return self::get_setting('admin_footer') ?: '<span id="footer-thankyou">感谢使用<a href="https://wordpress.org/" target="_blank">WordPress</a>进行创作。</span> | <a href="https://wpjam.com/" title="WordPress JAM" target="_blank">WordPress JAM</a>';
	}

	public static function filter_login_headerurl(){
		return home_url();
	}

	public static function filter_login_redirect($redirect_to, $request){
		return $request ?: (self::get_setting('login_redirect') ?: $redirect_to);
	}

	public static function on_custom(){
		$name	= current_action();

		if(in_array($name, ['wp_head', 'wp_footer'])){
			$name	= wpjam_remove_prefix($name, 'wp_');
		}

		echo self::get_setting($name);

		if($name == 'footer' && wpjam_basic_get_setting('optimized_by_wpjam')){
			echo '<p id="optimized_by_wpjam_basic">Optimized by <a href="https://blog.wpjam.com/project/wpjam-basic/">WPJAM Basic</a>。</p>';
		}
	}

	public static function on_login_init(){
		$action	= wpjam_get_request_parameter('action', ['default'=>'login']);

		wpjam_set_current_var('login_form_action', $action);

		if(in_array($action, ['login', 'bind'])){
			$objects	= wpjam_get_user_signups([$action=>true]);

			if($objects){
				add_action('login_form_'.$action,	[self::class, 'on_login_action']);
				add_action('login_form',			[self::class, 'on_login_form']);
				add_action('login_footer',			[self::class, 'on_login_footer'], 999);

				$action_type	= wpjam_get_request_parameter($action.'_type');

				if($action == 'login'){
					$action_type	= $action_type ?: apply_filters('wpjam_default_login_type', 'login');

					if(!$action_type && $_SERVER['REQUEST_METHOD'] == 'POST'){
						$action_type == 'login';
					}
				}

				if($action_type != 'login' && (!$action_type || !isset($objects[$action_type]))){
					$action_type	= array_key_first($objects);
				}

				wpjam_set_current_var($action.'_type', $action_type);
			}
		}

		wp_enqueue_script('wpjam-ajax');

		wp_add_inline_style('login', join("\n", [
			'.login .message, .login #login_error{margin-bottom: 0;}',
			'.code_wrap label:last-child{display:flex;}',
			'.code_wrap input.button{margin-bottom:10px;}',
			'.login form .input, .login input[type=password], .login input[type=text]{font-size:20px; margin-bottom:10px;}',

			'p.login-types,p.bind-types{line-height:2; float:left; clear:left; margin-top:10px;}',
			'p.login-types a,p.bind-types a{text-decoration: none; display:block;}',
			'div.login-fields, div.bind-fields{margin-bottom:10px;}',
		]));
	}

	public static function on_login_action(){
		$action	= wpjam_get_current_var('login_form_action');

		if($action == 'login'){
			$action_type	= wpjam_get_current_var($action.'_type');
			$object			= wpjam_get_user_signup_object($action_type);

			if($object && $object->login_action && is_callable($object->login_action)){
				call_user_func($object->login_action);
			}

			if(empty($_COOKIE[TEST_COOKIE])){
				$_COOKIE[TEST_COOKIE]	= 'WP Cookie check';
			}
		}else{
			if(!is_user_logged_in()){
				wp_die('登录之后才能执行绑定操作!');
			}

			add_filter('login_display_language_dropdown', '__return_false');
		}
	}

	public static function on_login_form(){
		$action	= wpjam_get_current_var('login_form_action');

		echo '<p class="'.$action.'-types">';

		foreach(wpjam_get_user_signups([$action=>true]) as $name => $object){
			$type	= $action.'_type';
			$data	= wpjam_get_ajax_data_attr('get-signup')->update_args([
				$type	=> $name,
				'data'	=> ['action'=>$action, $type=>$name],
			]);

			$title	= $action == 'bind' ? '绑定'.$object->title : $object->login_title;

			echo wpjam_tag('a', ['class'=>$action.'-type '.$name, 'data'=>$data], $title);

			add_action('login_footer',	[$object, $action.'_script'], 1000);
		}

		if($action == 'login'){
			echo '<a class="login-type login" href="javascript:;" data-login_type="login">使用账号和密码登录</a>';
		}

		echo '</p>';
	}

	public static function on_login_footer(){
		$action	= wpjam_get_current_var('login_form_action');

		?>
		<script type="text/javascript">
		jQuery(function($){
			let action	= <?php echo wpjam_json_encode($action); ?>;

			$('body').on('submit', '#loginform', function(e){
				if($(this).data('action')){
					e.preventDefault();

					$('div#login_error').remove();
					$(this).removeClass('shake');

					$(this).wpjam_submit(function(data){
						if(data.errcode){
							$('h1').after('<div id="login_error">'+data.errmsg+'</div>');
							$(this).addClass('shake');
						}else{
							if(action == 'bind'){
								window.location.reload();
							}else{
								if($('body').hasClass('interim-login')){
									$('body').addClass('interim-login-success');
									$(window.parent.document).find('.wp-auth-check-close').click();
								}else{
									window.location.href	= $.trim($('input[name="redirect_to"]').val());
								}
							}
						}
					});
				}
			});

			$('body').on('click', '.'+action+'-type', function(e){
				e.preventDefault();

				$('div#login_error').remove();

				$('#loginform').removeClass('shake').hide();

				if(action == 'login' && $(this).data(action+'_type') == 'login'){
					$('p#nav').show();

					$('div.'+action+'-fields').html(login_fields);
					$('#loginform').data('action', '').slideDown(300);

					$('a.login-type').show();
					$(this).hide();
				}else{
					$('p#nav').hide();

					$(this).wpjam_action(function(data){
						if(data.errcode != 0){
							alert(data.errmsg);
						}else{
							$('div.'+action+'-fields').html(data.fields);
							$('#loginform').data('action', data.action).data('nonce', data.nonce).slideDown(300);

							if(action == 'bind'){
								$('input#wp-submit').val(data.submit_text);
							}

							$('a.'+action+'-type').show();
							$(this).hide();
						}
					});
				}

				window.history.replaceState(null, null, action_url+action+'_type='+$(this).data(action+'_type'));

				return true;
			});

			$('p.'+action+'-types').insertBefore('p.submit');

			$('<div class="'+action+'-fields">').prependTo('#loginform');

			if(action == 'bind'){
				$('title').html('绑定');
				$('input#user_login').parent().remove();
				$('div.user-pass-wrap, p.forgetmenot').remove();
			}else{
				$('input#user_login').parent().appendTo('div.login-fields');
				$('div.user-pass-wrap, p.forgetmenot').appendTo('div.login-fields');
			}

			let login_fields	= $('div.'+action+'-fields').html();
			let action_type		= <?php echo wpjam_json_encode(wpjam_get_current_var($action.'_type')); ?>;
			let action_url		= <?php echo wpjam_json_encode(remove_query_arg([$action.'_type'], wpjam_get_current_page_url())); ?>;

			action_url	+= action_url.indexOf('?') >= 0 ? '&' : '?';

			if(action == 'login'){
				$('#loginform').prop('action', '<?php echo wp_login_url(); ?>?login_type=login');
			}

			if(action == 'login' && action_type == 'login'){
				$('body a.'+action+'-type.'+action_type).hide();
			}else{
				$('body a.'+action+'-type.'+action_type).click();
			}
		});
		</script>
		<?php
	}

	public static function get_tabs(){
		$tabs	= [];

		foreach(wpjam_get_user_signups(['bind'=>true]) as $name => $object){
			$tabs[$name]	= [
				'title'			=> $object->title,
				'capability'	=> 'read',
				'function'		=> 'form',
				'form_name'		=> $name.'_bind',
				'form'			=> [self::class, 'get_bind_form']
			];
		}

		return $tabs;
	}

	public static function get_bind_form(){
		$name	= $GLOBALS['current_tab'];
		$object	= wpjam_get_user_signup_object($name);

		if(!wp_doing_ajax() && method_exists($object, 'bind_script')){
			add_action('admin_footer', [$object, 'bind_script']);
		}

		return array_merge($object->get_attr('bind', 'admin'), [
			'callback'		=> [self::class, 'ajax_callback'],
			'capability'	=> 'read',
			'validate'		=> true,
			'response'		=> 'redirect'
		]);
	}

	public static function builtin_page_load(){
		wpjam_register_list_table_column('openid', [
			'title'		=> '绑定账号',
			'order'		=> 20,
			'callback'	=> [self::class, 'openid_column_callback']
		]);
	}

	public static function openid_column_callback($user_id){
		$values	= [];

		foreach(wpjam_get_user_signups() as $object){
			$openid = $object->get_openid($user_id);

			if($openid){
				$values[]	= $object->title.':<br />'.$openid;
			}
		}

		return $values ? implode('<br /><br />', $values) : '';
	}

	public static function init(){
		wpjam_register_bind('phone', '', ['domain'=>'@phone.sms']);

		wpjam_register_ajax('get-signup', [
			'nopriv'	=> true,
			'verify'	=> false,
			'callback'	=> [self::class, 'ajax_callback']
		]);

		wpjam_register_ajax('signup', [
			'nopriv'	=> true,
			'callback'	=> [self::class, 'ajax_callback']
		]);
	}

	public static function add_hooks(){
		add_action('admin_bar_menu',	[self::class, 'on_admin_bar_menu'], 1);

		if(is_admin()){
			add_action('admin_head',		[self::class, 'on_custom']);
			add_filter('admin_title', 		[self::class, 'filter_admin_title']);
			add_filter('admin_footer_text',	[self::class, 'filter_admin_footer_text']);
		}elseif(wpjam_is_login()){
			add_filter('login_headerurl',	[self::class, 'filter_login_headerurl']);
			add_filter('login_headertext',	'get_bloginfo');

			add_action('login_head', 		[self::class, 'on_custom']);
			add_action('login_footer',		[self::class, 'on_custom']);
			add_filter('login_redirect',	[self::class, 'filter_login_redirect'], 10, 2);

			if(wp_using_ext_object_cache()){
				add_action('login_init',	[self::class, 'on_login_init']);
			}

			if(self::get_setting('disable_language_switcher')){
				add_filter('login_display_language_dropdown',	'__return_false');
			}
		}else{
			add_action('wp_head',	[self::class, 'on_custom'], 1);
			add_action('wp_footer', [self::class, 'on_custom'], 99);
		}
	}
}

wpjam_register_option('wpjam-custom', [
	'title'			=> '样式定制',
	'site_default'	=> true,
	'model'			=> 'WPJAM_Custom',
]);