settings = get_settings(); /** * WordPress.Org API 替换 */ if ( is_admin() || wp_doing_cron() ) { if ( $this->settings['store'] != 'off' ) { add_filter( 'pre_http_request', [ $this, 'filter_wordpress_org' ], 100, 3 ); } } /** * 添加「文派茶馆」小组件 */ if ( is_admin() ) { add_action( 'wp_dashboard_setup', function () { global $wp_meta_boxes; unset( $wp_meta_boxes['dashboard']['side']['core']['dashboard_primary'] ); wp_add_dashboard_widget( 'wenpai_tea', '文派茶馆', function () { echo <<
HTML; wp_widget_rss_output( 'https://wptea.com/feed/', [ 'items' => 5, 'show_summary' => 1, ] ); echo <<
HTML; } ); } ); add_action( 'wp_network_dashboard_setup', function () { global $wp_meta_boxes; unset( $wp_meta_boxes['dashboard-network']['side']['core']['dashboard_primary'] ); wp_add_dashboard_widget( 'wenpai_tea', '文派茶馆', function () { echo <<
HTML; wp_widget_rss_output( 'https://wptea.com/feed/', [ 'items' => 5, 'show_summary' => 1, ] ); echo <<
HTML; } ); } ); } /** * WordPress 核心静态文件链接替换 */ if ( is_admin() && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { if ( in_array( 'admin', (array) $this->settings['admincdn'] ) && ! stristr( $GLOBALS['wp_version'], 'alpha' ) && ! stristr( $GLOBALS['wp_version'], 'beta' ) && ! stristr( $GLOBALS['wp_version'], 'RC' ) ) { // 禁用合并加载,以便于使用公共资源节点 global $concatenate_scripts; $concatenate_scripts = false; $this->page_str_replace( 'init', 'preg_replace', [ '~' . home_url( '/' ) . '(wp-admin|wp-includes)/(css|js)/~', sprintf( 'https://wpstatic.admincdn.com/%s/$1/$2/', $GLOBALS['wp_version'] ) ] ); } } /** * adminCDN */ if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { $this->load_admincdn(); } /** * 初认头像 */ if ( ! empty( $this->settings['cravatar'] ) ) { add_filter( 'user_profile_picture_description', [ $this, 'set_user_profile_picture_for_cravatar' ], 1 ); add_filter( 'avatar_defaults', [ $this, 'set_defaults_for_cravatar' ], 1 ); add_filter( 'um_user_avatar_url_filter', [ $this, 'get_cravatar_url' ], 1 ); add_filter( 'bp_gravatar_url', [ $this, 'get_cravatar_url' ], 1 ); add_filter( 'get_avatar_url', [ $this, 'get_cravatar_url' ], 1 ); } /** * 文风字体 */ if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] != 'off' ) { $this->load_typography(); } if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'optimize' ) { add_action( 'init', function () { wp_enqueue_style( 'windfonts-optimize', CHINA_YES_PLUGIN_URL . 'assets/css/fonts.css', [], CHINA_YES_VERSION ); } ); } if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'on' ) { add_action( 'wp_head', [ $this, 'load_windfonts' ] ); add_action( 'admin_head', [ $this, 'load_windfonts' ] ); } if ( ! empty( $this->settings['windfonts'] ) && $this->settings['windfonts'] == 'frontend' ) { add_action( 'wp_head', [ $this, 'load_windfonts' ] ); } } /** * 广告拦截 */ if ( ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { if ( ! empty( $this->settings['adblock'] ) && $this->settings['adblock'] == 'on' ) { add_action( 'admin_head', [ $this, 'load_adblock' ] ); } } /** * 飞行模式 */ if ( ! empty( $this->settings['plane'] ) && $this->settings['plane'] == 'on' ) { $this->load_plane(); } } /** * 加载 adminCDN */ public function load_admincdn() { /** * 前台静态加速 */ if ( in_array( 'frontend', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'template_redirect', 'preg_replace', [ '#(?<=[(\"\'])(?:' . quotemeta( home_url() ) . ')?/(?:((?:wp-content|wp-includes)[^\"\')]+\.(css|js)[^\"\')]+))(?=[\"\')])#', 'https://public.admincdn.com/$0' ] ); } /** * Google 字体替换 */ if ( in_array( 'googlefonts', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'fonts.googleapis.com', 'googlefonts.admincdn.com' ] ); } /** * Google 前端公共库替换 */ if ( in_array( 'googleajax', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'ajax.googleapis.com', 'googleajax.admincdn.com' ] ); } /** * CDNJS 前端公共库替换 */ if ( in_array( 'cdnjs', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'cdnjs.cloudflare.com/ajax/libs', 'cdnjs.admincdn.com' ] ); } /** * jsDelivr 前端公共库替换 */ if ( in_array( 'jsdelivr', (array) $this->settings['admincdn'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'jsd.admincdn.com', 'jsd.admincdn.com' ] ); } } /** * 加载文风字体 */ public function load_windfonts() { echo << HTML; $loaded = []; foreach ( (array) $this->settings['windfonts_list'] as $font ) { if ( empty( $font['enable'] ) ) { continue; } if ( empty( $font['family'] ) ) { continue; } if ( in_array( $font['css'], $loaded ) ) { continue; } echo sprintf( << HTML , $font['css'], htmlspecialchars_decode( $font['selector'] ), $font['style'], $font['weight'], $font['family'] ); $loaded[] = $font['css']; } } /** * 加载排印优化 */ public function load_typography() { // code from corner-bracket-lover plugin if ( in_array( 'corner', (array) $this->settings['windfonts_typography'] ) ) { $this->page_str_replace( 'init', 'str_replace', [ 'n’t', 'n’t' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’s', '’s' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’m', '’m' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’re', '’re' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’ve', '’ve' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’d', '’d' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’ll', '’ll' ] ); $this->page_str_replace( 'init', 'str_replace', [ '“', '「' ] ); $this->page_str_replace( 'init', 'str_replace', [ '”', '」' ] ); $this->page_str_replace( 'init', 'str_replace', [ '‘', '『' ] ); $this->page_str_replace( 'init', 'str_replace', [ '’', '』' ] ); } // code from space-lover plugin if ( in_array( 'space', (array) $this->settings['windfonts_typography'] ) ) { $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~(\p{Han})([a-zA-Z0-9\p{Ps}\p{Pi}])(?![^<]*>)~u', '\1 \2' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~([a-zA-Z0-9\p{Pe}\p{Pf}])(\p{Han})(?![^<]*>)~u', '\1 \2' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~([!?‽:;,.%])(\p{Han})~u', '\1 \2' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~(\p{Han})([@$#])~u', '\1 \2' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~(&?(?:amp)?;) (\p{Han})(?![^<]*>)~u', '\1\2' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~(\p{Han})(<(?!ruby)[a-zA-Z]+?[^>]*?>)([a-zA-Z0-9\p{Ps}\p{Pi}@$#])~u', '\1 \2\3' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~(\p{Han})(<\/(?!ruby)[a-zA-Z]+>)([a-zA-Z0-9])~u', '\1\2 \3' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~([a-zA-Z0-9\p{Pe}\p{Pf}!?‽:;,.%])(<(?!ruby)[a-zA-Z]+?[^>]*?>)(\p{Han})~u', '\1 \2\3' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~([a-zA-Z0-9\p{Ps}\p{Pi}!?‽:;,.%])(<\/(?!ruby)[a-zA-Z]+>)(\p{Han})~u', '\1\2 \3' ] ); $this->page_str_replace( 'template_redirect', 'preg_replace', [ '~[ ]*([「」『』()〈〉《》【】〔〕〖〗〘〙〚〛])[ ]*~u', '\1' ] ); } // code from quotmarks-replacer plugin if ( in_array( 'punctuation', (array) $this->settings['windfonts_typography'] ) ) { $qmr_work_tags = array( 'the_title', // http://codex.wordpress.org/Function_Reference/the_title 'the_content', // http://codex.wordpress.org/Function_Reference/the_content 'the_excerpt', // http://codex.wordpress.org/Function_Reference/the_excerpt // 'list_cats', Deprecated. http://codex.wordpress.org/Function_Reference/list_cats 'single_post_title', // http://codex.wordpress.org/Function_Reference/single_post_title 'comment_author', // http://codex.wordpress.org/Function_Reference/comment_author 'comment_text', // http://codex.wordpress.org/Function_Reference/comment_text // 'link_name', Deprecated. // 'link_notes', Deprecated. 'link_description', // Deprecated, but still widely used. 'bloginfo', // http://codex.wordpress.org/Function_Reference/bloginfo 'wp_title', // http://codex.wordpress.org/Function_Reference/wp_title 'term_description', // http://codex.wordpress.org/Function_Reference/term_description 'category_description', // http://codex.wordpress.org/Function_Reference/category_description 'widget_title', // Used by all widgets in themes 'widget_text' // Used by all widgets in themes ); foreach ( $qmr_work_tags as $qmr_work_tag ) { remove_filter( $qmr_work_tag, 'wptexturize' ); } } } /** * 加载广告拦截 */ public function load_adblock() { foreach ( (array) $this->settings['adblock_rule'] as $rule ) { if ( empty( $rule['enable'] ) ) { continue; } if ( empty( $rule['selector'] ) ) { continue; } echo sprintf( << %s { display: none!important; } HTML , htmlspecialchars_decode( $rule['selector'] ) ); } } /** * 加载飞行模式 */ public function load_plane() { add_filter( 'pre_http_request', function ( $preempt, $parsed_args, $url ) { foreach ( (array) $this->settings['plane_rule'] as $rule ) { if ( empty( $rule['enable'] ) ) { continue; } if ( empty( $rule['url'] ) ) { continue; } if ( strpos( $url, $rule['url'] ) !== false ) { return new WP_Error( 'http_request_not_executed', '无用 URL 已屏蔽访问' ); } } return $preempt; }, PHP_INT_MAX, 3 ); } /** * WordPress.Org 替换 */ public function filter_wordpress_org( $preempt, $args, $url ) { if ( $preempt || isset( $args['_wp_china_yes'] ) ) { return $preempt; } if ( ( ! strpos( $url, 'api.wordpress.org' ) && ! strpos( $url, 'downloads.wordpress.org' ) ) ) { return $preempt; } if ( $this->settings['store'] == 'wenpai' ) { $url = str_replace( 'api.wordpress.org', 'api.wenpai.net', $url ); } else { $url = str_replace( 'api.wordpress.org', 'api.wpmirror.com', $url ); } $url = str_replace( 'downloads.wordpress.org', 'downloads.wenpai.net', $url ); $curl_version = '1.0.0'; if ( function_exists( 'curl_version' ) ) { $curl_version_array = curl_version(); if ( is_array( $curl_version_array ) && key_exists( 'version', $curl_version_array ) ) { $curl_version = $curl_version_array['version']; } } if ( version_compare( $curl_version, '7.15.0', '<' ) ) { $url = str_replace( 'https://', 'http://', $url ); } $args['_wp_china_yes'] = true; return wp_remote_request( $url, $args ); } /** * 初认头像替换 */ public function get_cravatar_url( $url ) { switch ( $this->settings['cravatar'] ) { case 'cn': return $this->replace_avatar_url( $url, 'cn.cravatar.com' ); case 'global': return $this->replace_avatar_url( $url, 'en.cravatar.com' ); case 'weavatar': return $this->replace_avatar_url( $url, 'weavatar.com' ); default: return $url; } } /** * 头像 URL 替换 */ public function replace_avatar_url( $url, $domain ) { $sources = array( 'www.gravatar.com', '0.gravatar.com', '1.gravatar.com', '2.gravatar.com', 's.gravatar.com', 'secure.gravatar.com', 'cn.gravatar.com', 'en.gravatar.com', 'gravatar.com', 'sdn.geekzu.org', 'gravatar.duoshuo.com', 'gravatar.loli.net', 'dn-qiniu-avatar.qbox.me' ); return str_replace( $sources, $domain, $url ); } /** * WordPress 讨论设置中的默认 LOGO 名称替换 */ public function set_defaults_for_cravatar( $avatar_defaults ) { if ( $this->settings['cravatar'] == 'weavatar' ) { $avatar_defaults['gravatar_default'] = 'WeAvatar'; } else { $avatar_defaults['gravatar_default'] = '初认头像'; } return $avatar_defaults; } /** * 个人资料卡中的头像上传地址替换 */ public function set_user_profile_picture_for_cravatar() { if ( $this->settings['cravatar'] == 'weavatar' ) { return '您可以在 WeAvatar 修改您的资料图片'; } else { return '您可以在初认头像修改您的资料图片'; } } /** * 页面替换 * * @param $replace_func string 要调用的字符串关键字替换函数 * @param $param array 传递给字符串替换函数的参数 */ private function page_str_replace( $hook, $replace_func, $param ) { // CLI 下返回,防止影响缓冲区 if ( php_sapi_name() == 'cli' ) { return; } add_action( $hook, function () use ( $replace_func, $param ) { ob_start( function ( $buffer ) use ( $replace_func, $param ) { $param[] = $buffer; return call_user_func_array( $replace_func, $param ); } ); }, PHP_INT_MAX ); } }