HEX
Server: nginx/1.18.0
System: Linux iZj6c1ieg2jrpk1z5tzi19Z 6.3.9-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 21 22:18:40 EDT 2023 x86_64
User: www (1001)
PHP: 8.2.4
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/www.cytocare.cn/wp-content/plugins/wpjam-basic/public/wpjam-route.php
<?php
function wpjam_load($hooks, $callback, $priority=10){
	if(!$callback || !is_callable($callback)){
		return;
	}

	$hooks	= array_filter((array)$hooks, fn($hook)=> !did_action($hook));

	if(!$hooks){
		$callback();
	}elseif(count($hooks) == 1){
		add_action(reset($hooks), $callback, $priority);
	}else{
		array_walk($hooks, fn($hook)=> add_action($hook, fn()=> array_all($hooks, 'did_action') ? $callback() : null, $priority));
	}
}

function wpjam_init($callback){
	wpjam_load('init', $callback);
}

function wpjam_include($hooks, $include, $priority=10){
	wpjam_load($hooks, fn()=> array_map(fn($inc)=> include $inc, (array)$include), $priority);
}

function wpjam_loaded($action, ...$args){
	wpjam_load('wp_loaded', fn()=> do_action($action, ...$args));
}

function wpjam_hooks($hooks){
	$hooks	= ($hooks && is_callable($hooks)) ? $hooks() : $hooks;

	if($hooks && is_array($hooks)){
		if(wp_is_numeric_array(reset($hooks))){
			array_walk($hooks, fn($args)=> add_filter(...$args));
		}else{
			add_filter(...$hooks);
		}
	}
}

function wpjam_call($callback, ...$args){
	if(is_array($callback) && !is_object($callback[0])){
		return wpjam_call_method($callback[0], $callback[1], ...$args);
	}else{
		return $callback(...$args);
	}
}

function wpjam_call_array($callback, $args){
	return wpjam_call($callback, ...$args);
}

function wpjam_try($callback, ...$args){
	try{
		return wpjam_throw_if_error(wpjam_call(wpjam_throw_if_error($callback), ...$args));
	}catch(Throwable $e){
		throw $e;
	}
}

function wpjam_try_array($callback, $args){
	return wpjam_try($callback, ...$args);
}

function wpjam_catch($callback, ...$args){
	try{
		if(is_a($callback, 'WPJAM_Exception')){
			return $callback->get_wp_error();
		}elseif(is_a($callback, 'Exception')){
			return new WP_Error($callback->getCode(), $callback->getMessage());
		}else{
			return wpjam_call($callback, ...$args);
		}
	}catch(Exception $e){
		return wpjam_catch($e);
	}
}

function wpjam_catch_array($callback, $args){
	return wpjam_catch($callback, ...$args);
}

function wpjam_throw($errcode, $errmsg=''){
	throw new WPJAM_Exception(...(is_wp_error($errcode) ? [$errcode] : [$errmsg, $errcode]));
}

function wpjam_call_for_blog($blog_id, $callback, ...$args){
	try{
		$switched	= (is_multisite() && $blog_id && $blog_id != get_current_blog_id()) ? switch_to_blog($blog_id) : false;

		return $callback(...$args);
	}finally{
		if($switched){
			restore_current_blog();
		}
	}
}

function wpjam_ob_get_contents($callback, ...$args){
	ob_start();

	$callback(...$args);

	return ob_get_clean();
}

function wpjam_transient($name, $callback, $expire=86400, $global=false){
	$fix	= ($global ? 'site_' : '').'transient';
	$data	= call_user_func('get_'.$fix, $name);

	if($data === false || is_numeric($callback)){
		if(is_numeric($callback)){
			$max	= $callback;
			$data	= $max && (int)$data >= $max ? 0 : (int)$data;
			$update	= $data+1;
		}else{
			$update	= $data	= $callback();
		}

		if(!is_wp_error($data)){
			call_user_func('set_'.$fix, $name, $update, $expire);
		} 
	}

	return $data;
}

function wpjam_increment($name, $max=0, $expire=86400, $global=false){
	return wpjam_transient($name, $max, $expire, $global);
}

function wpjam_counts($name, $callback){
	$counts	= wp_cache_get($name, 'counts');

	if($counts === false){
		$counts	= $callback();

		if(!is_wp_error($counts)){
			wp_cache_set($name, $counts, 'counts');
		}
	}

	return $counts;
}

function wpjam_lock($name, $expire=10, $group=false){
	$group	= WPJAM_Cache::parse_group($group);
	$locked	= wp_cache_get($name, $group, true);

	if($locked === false){
		wp_cache_set($name, 1, $group, $expire);
	}

	return $locked;
}

function wpjam_is_over($name, $max, $time, $group=false, $action='increment'){
	$group	= WPJAM_Cache::parse_group($group);
	$times	= wp_cache_get($name, $group) ?: 0;

	if($times > $max){
		return true;
	}

	if($action == 'increment'){
		wp_cache_set($name, $times+1, $group, ($max == $times && $time > 60) ? $time : 60);
	}

	return false;
}

function wpjam_db_transaction($callback, ...$args){
	$GLOBALS['wpdb']->query("START TRANSACTION;");

	try{
		$result	= $callback(...$args);

		if($GLOBALS['wpdb']->last_error){
			wpjam_throw('error', $GLOBALS['wpdb']->last_error);
		}

		$GLOBALS['wpdb']->query("COMMIT;");

		return $result;
	}catch(Exception $e){
		$GLOBALS['wpdb']->query("ROLLBACK;");

		return false;
	}
}

function wpjam_value_callback($callback, $name, $id){
	if(is_array($callback) && !is_object($callback[0])){
		$args	= [$id, $name];
		$parsed	= wpjam_parse_method($callback[0], $callback[1], $args);

		if(is_wp_error($parsed)){
			return null;
		}elseif(is_object($parsed[0])){
			return $parsed(...$args);
		}
	}

	return $callback($name, $id);
}

function wpjam_verify_callback($callback, $verify){
	$reflection	= wpjam_get_reflection($callback);

	return $verify($reflection->getParameters(), $reflection);
}

function wpjam_get_callback_parameters($callback){
	return wpjam_get_reflection($callback)->getParameters();
}

function wpjam_build_callback_unique_id($callback){
	return _wp_filter_build_unique_id(null, $callback, null);
}

function wpjam_get_reflection($callback){
	$id	= wpjam_build_callback_unique_id($callback);

	return wpjam_get_instance('reflection', $id, fn()=> is_array($callback) ? new ReflectionMethod(...$callback) : new ReflectionFunction($callback));
}

function wpjam_parse_method($class, $method, &$args=[]){
	if(is_object($class)){
		$object	= $class;
		$class	= get_class($class);
	}else{
		if(!class_exists($class)){
			return new WP_Error('invalid_model', [$class]);
		}
	}

	$cb	= [$class, $method];

	if(!method_exists(...$cb)){
		if(method_exists($class, '__callStatic')){
			$is_public = true;
			$is_static = true;
		}elseif(method_exists($class, '__call')){
			$is_public = true;
			$is_static = false;
		}else{
			return new WP_Error('undefined_method', implode('::', $cb));
		}
	}else{
		$reflection	= wpjam_get_reflection($cb);
		$is_public	= $reflection->isPublic();
		$is_static	= $reflection->isStatic();
	}

	if($is_static){
		return $is_public ? $cb : $reflection->getClosure();
	}

	if(!isset($object)){
		$fn	= [$class, 'get_instance'];

		if(!method_exists(...$fn)){
			return new WP_Error('undefined_method', implode('::', $fn));
		}

		$number	= wpjam_get_reflection($fn)->getNumberOfRequiredParameters();
		$number	= $number > 1 ? $number : 1;

		if(count($args) < $number){
			return new WP_Error('instance_required', '实例方法对象才能调用');
		}

		$object	= $fn(...array_slice($args, 0, $number));

		if(!$object){
			return new WP_Error('invalid_id', [$class]);
		}

		$args	= array_slice($args, $number);
	}

	$cb[0]	= $object;

	return $is_public ? $cb : $reflection->getClosure($cb[0]);
}

function wpjam_call_method($class, $method, ...$args){
	$parsed	= wpjam_parse_method($class, $method, $args);

	return is_wp_error($parsed) ? $parsed : $parsed(...$args);
}

function wpjam_timer($callback, ...$args){
	try{
		$timestart	= microtime(true);

		return $callback(...$args);
	}finally{
		$log	= "Callback: ".var_export($callback, true)."\n";
		$log	.= "Time: ".number_format(microtime(true)-$timestart, 5)."\n";

		if(is_closure($callback)){
			$reflection = wpjam_get_reflection($callback);

			$log	.= "File: ".$reflection->getFileName(). "\n";
			$log	.= "Line: ".$reflection->getStartLine() . "\n";
		}

		trigger_error($log."\n\n");
	}
}

function wpjam_timer_hook($value){
	$name	= current_filter();
	$object	= $GLOBALS['wp_filter'][$name] ?? null;

	if($object){
		foreach($object->callbacks as &$hooks){
			foreach($hooks as &$hook){
				$hook['function']	= fn(...$args)=> wpjam_timer($hook['function'], ...$args);
			}
		}
	}

	return $value;
}

function wpjam_die_if_error($result){
	if(is_wp_error($result)){
		wp_die($result);
	}

	return $result;
}

function wpjam_throw_if_error($result){
	if(is_wp_error($result)){
		wpjam_throw($result);
	}

	return $result;
}

// Var
function wpjam_var($name=null, ...$args){
	static $object;

	$object	= $object ?? new WPJAM_Args(wpjam_parse_user_agent());

	if(!$name){
		return $object;
	}

	if($args){
		$value	= $args[0];

		if(is_closure($value)){
			if(is_null($object->$name)){
				$value	= $value($name);

				if(!is_null($value) && !is_wp_error($value)){
					$object->$name	= $value;
				}
			}
		}else{
			$object->$name = $value;
		}
	}

	return $object->$name;
}

function wpjam_get_current_var($name){
	return wpjam_var($name);
}

function wpjam_set_current_var($name, $value){
	return wpjam_var($name, $value);
}

function wpjam_get_current_user($required=false){
	$value	= wpjam_var('user');

	if(!isset($value)){
		$value	= apply_filters('wpjam_current_user', null);

		if(!is_null($value) && !is_wp_error($value)){
			wpjam_var('user', $value);
		}
	}

	if($required){
		return is_null($value) ? new WP_Error('bad_authentication') : $value;
	}else{
		return is_wp_error($value) ? null : $value;
	}
}

function wpjam_current_supports($feature){
	$object	= wpjam_var();

	if($feature == 'webp'){
		return $object->browser == 'chrome' || $object->os == 'Android' || ($object->os == 'iOS' && version_compare($object->os_version, 14) >= 0);
	}
}

function wpjam_get_device(){
	return wpjam_var('device');
}

function wpjam_get_os(){
	return wpjam_var('os');
}

function wpjam_get_app(){
	return wpjam_var('app');
}

function wpjam_get_browser(){
	return wpjam_var('browser');
}

function wpjam_get_version($key){
	return wpjam_var($key.'_version');
}

function is_ipad(){
	return wpjam_get_device() == 'iPad';
}

function is_iphone(){
	return wpjam_get_device() == 'iPone';
}

function is_ios(){
	return wpjam_get_os() == 'iOS';
}

function is_macintosh(){
	return wpjam_get_os() == 'Macintosh';
}

function is_android(){
	return wpjam_get_os() == 'Android';
}

function is_weixin(){
	if(isset($_GET['weixin_appid'])){
		return true;
	}

	return wpjam_get_app() == 'weixin';
}

function is_weapp(){
	if(isset($_GET['appid'])){
		return true;
	}

	return wpjam_get_app() == 'weapp';
}

function is_bytedance(){
	if(isset($_GET['bytedance_appid'])){
		return true;
	}

	return wpjam_get_app() == 'bytedance';
}

// Parameter
function wpjam_get_parameter($name='', $args=[], $method=''){
	return WPJAM_API::get_parameter($name, array_merge($args, $method ? compact('method') : []));
}

function wpjam_get_post_parameter($name='', $args=[]){
	return wpjam_get_parameter($name, $args, 'POST');
}

function wpjam_get_request_parameter($name='', $args=[]){
	return wpjam_get_parameter($name, $args, 'REQUEST');
}

function wpjam_get_data_parameter($name='', $args=[]){
	return wpjam_get_parameter($name, $args, 'data');
}

function wpjam_method_allow($method){
	return WPJAM_API::method_allow($method);
}

// Request
function wpjam_remote_request($url='', $args=[], $err=[]){
	$throw	= wpjam_pull($args, 'throw');
	$field	= wpjam_pull($args, 'field') ?? 'body';
	$result	= WPJAM_API::request($url, $args, $err);

	if(is_wp_error($result)){
		return $throw ? wpjam_throw($result) : $result;
	}

	return $field ? wpjam_get($result, $field) : $result;
}

// Error
function wpjam_parse_error($data){
	if($data === true){
		return ['errcode'=>0];
	}

	if($data === false || is_null($data)){
		return ['errcode'=>'-1', 'errmsg'=>'系统数据错误或者回调函数返回错误'];
	}

	if(is_array($data)){
		if(!$data || !wp_is_numeric_array($data)){
			$data	+= ['errcode'=>0];
		}
	}elseif(is_wp_error($data)){
		$errdata	= $data->get_error_data();
		$data		= [
			'errcode'	=> $data->get_error_code(),
			'errmsg'	=> $data->get_error_message(),
		];

		if($errdata){
			$errdata	= is_array($errdata) ? $errdata : ['errdata'=>$errdata];
			$data 		= $data + $errdata;
		}
	}else{
		return $data;
	}

	return empty($data['errcode']) ? $data : WPJAM_Error::filter($data);
}

function wpjam_register_error_setting($code, $message='', $modal=[]){
	return WPJAM_Error::add_setting($code, $message, $modal);
}

// Route
function wpjam_register_route($module, $args){
	WPJAM_Route::add($module, $args);
}

function wpjam_get_query_var($key, $wp=null){
	$wp	= $wp ?: $GLOBALS['wp'];

	return $wp->query_vars[$key] ?? null;
}

// JSON
function wpjam_json_encode($data){
	return WPJAM_JSON::encode($data, JSON_UNESCAPED_UNICODE);
}

function wpjam_json_decode($json, $assoc=true){
	return WPJAM_JSON::decode($json, $assoc);
}

function wpjam_send_json($data=[], $status_code=null){
	WPJAM_JSON::send($data, $status_code);
}

function wpjam_register_json($name, $args=[]){
	return WPJAM_JSON::register($name, $args);
}

function wpjam_register_api($name, $args=[]){
	return wpjam_register_json($name, $args);
}

function wpjam_get_json_object($name){
	return WPJAM_JSON::get($name);
}

function wpjam_add_json_module_parser($type, $callback){
	return WPJAM_JSON::add_module_parser($type, $callback);
}

function wpjam_parse_json_module($module){
	return WPJAM_JSON::parse_module($module);
}

function wpjam_get_current_json($output='name'){
	return WPJAM_JSON::get_current($output);
}

function wpjam_is_json_request(){
	if(get_option('permalink_structure')){
		return (bool)preg_match("/\/api\/.*\.json/", $_SERVER['REQUEST_URI']);
	}else{
		return isset($_GET['module']) && $_GET['module'] == 'json';
	}
}

function wpjam_register_activation($callback, $hook='wp_loaded'){
	WPJAM_API::activation('add', $hook, $callback);
}

function wpjam_register_source($name, $callback, $query_args=['source_id']){
	if($name && $name == wpjam_get_parameter('source')){
		add_filter('wpjam_pre_json', fn($pre)=> $callback(wpjam_get_parameter($query_args)) ?? $pre);
	}
}

// wpjam_register_config($key, $value)
// wpjam_register_config($name, $args)
// wpjam_register_config($args)
// wpjam_register_config($name, $callback])
// wpjam_register_config($callback])
function wpjam_register_config(...$args){
	$group	= count($args) >= 3 ? array_shift($args) : '';
	$args	= array_filter($args, fn($v)=> isset($v));

	if($args){
		if(is_array($args[0]) || count($args) == 1){
			$args	= is_callable($args[0]) ? ['callback'=>$args[0]] : (is_array($args[0]) ? $args[0] : [$args[0]=> null]);
		}else{
			$args	= is_callable($args[1]) ? ['name'=>$args[0], 'callback'=>$args[1]] : [$args[0]=>$args[1]];
		}

		wpjam_add_item('config', null, $args, $group);
	}
}

function wpjam_get_config($group=null){
	$group	= is_array($group) ? array_get($group, 'group') : $group;
	$items	= wpjam_get_items('config', $group) ?: [];

	return array_reduce($items, function($config, $item){
		if(!empty($item['callback'])){
			$name	= $item['name'] ?? '';
			$args	= $item['args'] ?? [];
			$args	= $args ?: ($name ? [$name] : []);
			$value	= $item['callback'](...$args);
			$item	= $name ? [$name=> $value] : (is_array($value) ? $value : []);
		}

		return array_merge($config, $item);
	}, []);
}

// Extend
function wpjam_load_extends($dir, ...$args){
	WPJAM_Extend::create($dir, ...$args);
}

function wpjam_get_file_summary($file){
	return WPJAM_Extend::get_file_summay($file);
}

function wpjam_get_extend_summary($file){
	return WPJAM_Extend::get_file_summay($file);
}

if(is_admin()){
	if(!function_exists('get_screen_option')){
		function get_screen_option($option, $key=false){
			$screen	= did_action('current_screen') ? get_current_screen() : null;

			if($screen){
				if(in_array($option, ['post_type', 'taxonomy'])){
					return $screen->$option;
				}

				$value	= $screen->get_option($option);

				return $key ? ($value ? wpjam_get($value, $key) : null) : $value;
			}
		}
	}

	function wpjam_add_admin_ajax($action, $args=[]){
		if(isset($_POST['action']) && $_POST['action'] == $action){
			wpjam_var('admin_ajax', $args);

			add_action('wp_ajax_'.$action, function(){
				add_filter('wp_die_ajax_handler', fn()=> ['WPJAM_Error', 'wp_die_handler']);

				$args	= wpjam_var('admin_ajax');
				$args	= wpjam_is_assoc_array($args) ? $args : ['callback'=>$args];
				$fields	= $args['fields'] ?? [];
				$data	= wpjam_catch('wpjam_get_fields_parameter', $fields, 'POST');
				$result	= is_wp_error($data) ? $data : wpjam_catch($args['callback'], $data);

				wpjam_send_json($result);
			});
		}
	}

	function wpjam_add_admin_error($msg='', $type='success'){
		if(is_wp_error($msg)){
			$msg	= $msg->get_error_message();
			$type	= 'error';
		}

		if($msg && $type){
			add_action('all_admin_notices',	fn()=> wpjam_echo(wpjam_tag('div', ['is-dismissible', 'notice', 'notice-'.$type], ['p', [], $msg])));
		}
	}

	function wpjam_add_admin_load($args){
		if(wp_is_numeric_array($args)){
			array_walk($args, 'wpjam_add_admin_load');
		}else{
			$type	= wpjam_pull($args, 'type') ?: array_find(['base'=>'builtin_page', 'plugin_page'=>'plugin_page'], fn($v, $k)=> isset($args[$k]));

			if($type && in_array($type, ['builtin_page', 'plugin_page'])){
				$score	= wpjam_get($args, 'order', 10);

				wpjam_add_item($type.'_load', $args, fn($v)=> $score > wpjam_get($v, 'order', 10));
			}
		}
	}

	function wpjam_admin_load($type, ...$args){
		if($type == 'plugin_page'){
			$filter	= function($load, $page, $tab){
				if(!empty($load['plugin_page'])){
					if(is_callable($load['plugin_page'])){
						return $load['plugin_page']($page, $tab);
					}

					if(!wpjam_compare($page, $load['plugin_page'])){
						return false;
					}
				}

				if(!empty($load['current_tab'])){
					return $tab && wpjam_compare($tab, $load['current_tab']);
				}

				return !$tab;
			};
		}else{
			$filter	= function($load, $screen){
				if(!empty($load['screen']) && is_callable($load['screen']) && !$load['screen']($screen)){
					return false;
				}

				if(array_any(['base', 'post_type', 'taxonomy'], fn($k)=> !empty($load[$k]) && !wpjam_compare($screen->$k, $load[$k]))){
					return false;
				}

				return true;
			};
		}

		foreach(wpjam_get_items($type.'_load') as $load){
			if(!$filter($load, ...$args)){
				continue;
			}

			if(!empty($load['page_file'])){
				wpjam_map((array)$load['page_file'], fn($file)=> is_file($file) ? include $file : null);
			}

			$cb	= $load['callback'] ?? '';

			if(!$cb && !empty($load['model'])){
				$method	= array_find(['load', $type.'_load'], fn($method)=> method_exists($load['model'], $method));
				$cb		= $method ? [$load['model'], $method] : '';
			}

			if($cb && is_callable($cb)){
				$cb(...$args);
			}
		}
	}

	function wpjam_admin_tooltip($text, $tooltip){
		return $text ? '<span class="tooltip" data-tooltip="'.esc_attr($tooltip).'">'.$text.'</span>' : '<span class="dashicons dashicons-editor-help tooltip" data-tooltip="'.esc_attr($tooltip).'"></span>';
	}

	function wpjam_get_referer(){
		$referer	= wp_get_original_referer() ?: wp_get_referer();
		$removable	= [...wp_removable_query_args(), '_wp_http_referer', 'action', 'action2', '_wpnonce'];

		return remove_query_arg($removable, $referer);
	}

	function wpjam_get_admin_post_id(){
		return (int)($_GET['post'] ?? ($_POST['post_ID'] ?? 0));
	}

	function wpjam_register_page_action($name, $args){
		return WPJAM_Page_Action::register($name, $args);
	}

	function wpjam_get_page_button($name, $args=[]){
		$object	= WPJAM_Page_Action::get($name);

		return $object ? $object->get_button($args) : '';
	}

	function wpjam_register_list_table_action($name, $args){
		return WPJAM_List_Table::register($name, $args, 'action');
	}

	function wpjam_unregister_list_table_action($name, $args=[]){
		WPJAM_List_Table::unregister($name, $args, 'action');
	}

	function wpjam_register_list_table_column($name, $field){
		return WPJAM_List_Table::register($name, $field, 'column');
	}

	function wpjam_unregister_list_table_column($name, $field=[]){
		WPJAM_List_Table::unregister($name, $field, 'column');
	}

	function wpjam_register_list_table_view($name, $view=[]){
		return WPJAM_List_Table::register($name, $view, 'view');
	}

	function wpjam_register_dashboard_widget($name, $args){
		WPJAM_Dashboard::add_widget($name, $args);
	}

	function wpjam_get_plugin_page_setting($key='', $tab=false){
		$object	= WPJAM_Plugin_Page::get_current();

		if($object){
			return $object->get_setting($key, $tab);
		}
	}

	function wpjam_get_current_tab_setting($key=''){
		return wpjam_get_plugin_page_setting($key, true);
	}

	function wpjam_chart($type, $data, $args){
	}

	function wpjam_line_chart($data, $labels, $args=[]){
		echo WPJAM_Chart::line(array_merge($args, ['labels'=>$labels, 'data'=>$data]));
	}

	function wpjam_bar_chart($data, $labels, $args=[]){
		echo WPJAM_Chart::line(array_merge($args, ['labels'=>$labels, 'data'=>$data]), 'Bar');
	}

	function wpjam_donut_chart($data, ...$args){
		$args	= count($args) >= 2 ? array_merge($args[1], ['labels'=> $args[0]]) : ($args[0] ?? []);

		echo WPJAM_Chart::donut(array_merge($args, ['data'=>$data]));
	}

	function wpjam_get_chart_parameter($key){
		return (WPJAM_Chart::get_instance())->get_parameter($key);
	}

	function wpjam_render_callback($callback){
		if(is_array($callback)){
			$callback	= (is_object($callback[0]) ? get_class($callback[0]).'->' : $callback[0].'::').(string)$callback[1];
		}elseif(is_object($callback)){
			$callback	= get_class($callback);
		}

		return wpautop($callback);
	}
}

wpjam_load_extends(dirname(__DIR__).'/components');
wpjam_load_extends(dirname(__DIR__).'/extends', [
	'option'	=> 'wpjam-extends',
	'sitewide'	=> true,
	'title'		=> '扩展管理',
	'hook'		=> 'plugins_loaded',
	'priority'	=> 1,
	'menu_page'	=> [
		'parent'	=> 'wpjam-basic',
		'order'		=> 3,
		'function'	=> 'tab',
		'tabs'		=> ['extends'=>['order'=>20, 'title'=>'扩展管理', 'function'=>'option', 'option_name'=>'wpjam-extends']]
	]
]);

wpjam_load_extends([
	'dir'		=> fn()=> get_template_directory().'/extends',
	'hook'		=> 'plugins_loaded',
	'priority'	=> 0,
]);

wpjam_style('remixicon', [
	'src'		=> fn()=> wpjam_get_static_cdn().'/remixicon/4.2.0/remixicon.min.css',
	'method'	=> 'register',
	'priority'	=> 1
]);

wpjam_add_pattern('key', [
	'pattern'			=> '^[a-zA-Z][a-zA-Z0-9_\-]*$',
	'custom_validity'	=> '请输入英文字母、数字和 _ -,并以字母开头!'
]);

wpjam_add_pattern('slug', [
	'pattern'			=> '[a-z0-9_\\-]+',
	'custom_validity'	=> '请输入小写英文字母、数字和 _ -!'
]);

wpjam_add_static_cdn([
	'https://cdnjs.cloudflare.com/ajax/libs',
	'https://lib.baomitu.com',
	'https://cdnjs.loli.net/ajax/libs',
]);

wpjam_register_error_setting([
	['bad_authentication',	'无权限'],
	['access_denied',		'操作受限'],
	['incorrect_password',	'密码错误'],
	['undefined_method',	fn($args)=> sprintf('「%s」'.(count($args) >= 2 ? '%s' : '').'未定义', ...$args)],
	['quota_exceeded',		fn($args)=> sprintf('%s超过上限'.(count($args) >= 2 ? '「%s」' : ''), ...$args)],
]);

wpjam_register_route('json',	['model'=>'WPJAM_JSON']);
wpjam_register_route('txt',		['model'=>'WPJAM_Verify_TXT']);

add_action('plugins_loaded',	['WPJAM_API', 'on_plugins_loaded'], 0);

if(is_admin()){
	add_action('plugins_loaded',	['WPJAM_Admin', 'on_plugins_loaded']);
}

if(wpjam_is_json_request()){
	ini_set('display_errors', 0);

	remove_filter('the_title', 'convert_chars');

	remove_action('init', 'wp_widgets_init', 1);
	remove_action('init', 'maybe_add_existing_user_to_blog');
	// remove_action('init', 'check_theme_switched', 99);

	remove_action('plugins_loaded', 'wp_maybe_load_widgets', 0);
	remove_action('plugins_loaded', 'wp_maybe_load_embeds', 0);
	remove_action('plugins_loaded', '_wp_customize_include');
	remove_action('plugins_loaded', '_wp_theme_json_webfonts_handler');

	remove_action('wp_loaded', '_custom_header_background_just_in_time');
	remove_action('wp_loaded', '_add_template_loader_filters');
}