. */ /** * WP Chinese Switcher Plugin main file * * 為Wordpress增加中文繁簡轉換功能. 轉換過程在服務器端完成. 使用的繁簡字符映射表來源于Mediawiki. * 本插件比较耗费资源. 因为对页面内容繁简转换时载入了一个几百KB的转换表(ZhConversion.php), 编译后占用内存超过1.5MB * 如果可能, 建议安装xcache/ eAccelerator之类PHP缓存扩展. 可以有效提高速度并降低CPU使用,在生产环境下测试效果非常显著. * * @package WPCS * @version see wpcs_VERSION constant below * @TODO 用OO方式重寫全部代碼, 計劃1.2版本實現. * @link http://wordpress.org/plugins/wp-chinese-switcher Plugin Page on wordpress.org, including guides and docs. * @link https://oogami.name/project/wpcs/ Plugin Homepage * */ //define('wpcs_DEBUG', true); $wpcs_deubg_data = array(); //uncomment this line to enable debug define('wpcs_DIR_URL', WP_PLUGIN_URL . '/' . str_replace(basename(__FILE__), "", plugin_basename(__FILE__))); define('wpcs_VERSION', '1.0'); $wpcs_options = get_option('wpcs_options'); // /********************** //初始化所有全局變量.其实不初始化也没关系,主要是防止某些古董php版本register_globals打开可能造成意想不到问题. $wpcs_admin = false; $wpcs_noconversion_url = false; $wpcs_redirect_to = false; $wpcs_direct_conversion_flag = false; $wpcs_langs_urls = array(); $wpcs_target_lang = false; // ***************************/ //您可以更改提示文字,如"简体中文","繁体中文".但是不要改动其它. //不要改键值的语言代码zh-xx, 本插件一些地方使用了硬编码的语言代码. $wpcs_langs = array( 'zh-cn' => array('zhconversion_cn', 'cntip', '简体中文', 'zh-CN'), 'zh-tw' => array('zhconversion_tw', 'twtip', '繁體中文', 'zh-TW'), /* 'zh-hans' => array('zhconversion_hans', 'hanstip', '简体中文','zh-Hans'), 'zh-hant' => array('zhconversion_hant', 'hanttip', '繁體中文','zh-Hant'), 'zh-hk' => array('zhconversion_hk', 'hktip', '港澳繁體','zh-HK'), 'zh-mo' => array('zhconversion_hk', 'motip', '澳門繁體','zh-MO'), 'zh-sg' => array('zhconversion_sg', 'sgtip', '马新简体','zh-SG'), 'zh-my' => array('zhconversion_sg', 'mytip', '马来西亚简体','zh-MY'), */ ); //容错处理. if ($wpcs_options != false && is_array($wpcs_options) && is_array($wpcs_options['wpcs_used_langs'])) { add_action('widgets_init', function () { return register_widget('wpcs_Widget'); }, 1); add_filter('query_vars', 'wpcs_insert_query_vars');//修改query_vars钩子,增加一个'variant'公共变量. add_action('init', 'wpcs_init');//插件初始化 if ( WP_DEBUG || (defined('wpcs_DEBUG') && wpcs_DEBUG == true) ) { add_action('init', function () { global $wp_rewrite; $wp_rewrite->flush_rules(); }); add_action('wp_footer', 'wpcs_debug'); } } add_action('admin_menu', 'wpcs_admin_init');//插件后台菜单钩子 /* 全局代码END; 下面的全是函数定义 */ /** * 插件初始化 * * 本函数做了下面事情: * A. 调用wpcs_get_noconversion_url函数设置 $wpcs_noconversion_url全局变量 * A. 调用wpcs_get_lang_url函数设置 $wpcs_langs_urls全局(数组)变量 * B. 如果当前为POST方式提交评论请求, 直接调用wpcs_do_conversion * B. 否则, 加载parse_request接口 */ function wpcs_init() { global $wpcs_options, $wp_rewrite; if ($wpcs_options['wpcs_use_permalink'] != 0 && empty($wp_rewrite->permalink_structure)) { $wpcs_options['wpcs_use_permalink'] = 0; update_option('wpcs_options', $wpcs_options); } if ($wpcs_options['wpcs_use_permalink'] != 0) { add_filter('rewrite_rules_array', 'wpcs_rewrite_rules'); } if ((strpos($_SERVER['PHP_SELF'], 'wp-comments-post.php') !== false || strpos($_SERVER['PHP_SELF'], 'ajax-comments.php') !== false || strpos($_SERVER['PHP_SELF'], 'comments-ajax.php') !== false ) && $_SERVER["REQUEST_METHOD"] == "POST" && ! empty($_POST['variant']) && in_array($_POST['variant'], $wpcs_options['wpcs_used_langs']) ) { global $wpcs_target_lang; $wpcs_target_lang = $_POST['variant']; wpcs_do_conversion(); return; } if ('page' == get_option('show_on_front') && get_option('page_on_front')) { add_action('parse_query', 'wpcs_parse_query_fix'); } add_action('parse_request', 'wpcs_parse_query'); add_action('template_redirect', 'wpcs_template_redirect', - 100);//本插件核心代码. } /** * 修复首页显示Page时繁简转换页仍然显示最新posts的问题 * dirty but should works * based on wp 3.5 * @since 1.1.13 * @see wp-include/query.php * */ function wpcs_parse_query_fix($this_WP_Query) { //copied and modified from wp-includes/query.php $qv = &$this_WP_Query->query_vars; // Correct is_* for page_on_front and page_for_posts if ($this_WP_Query->is_home && 'page' == get_option('show_on_front') && get_option('page_on_front')) { $_query = wp_parse_args($this_WP_Query->query); // pagename can be set and empty depending on matched rewrite rules. Ignore an empty pagename. if (isset($_query['pagename']) && '' == $_query['pagename']) { unset($_query['pagename']); } if (empty($_query) || ! array_diff(array_keys($_query), array( 'preview', 'page', 'paged', 'cpage', 'variant' ))) { $this_WP_Query->is_page = true; $this_WP_Query->is_home = false; $qv['page_id'] = get_option('page_on_front'); // Correct for page_on_front if ( ! empty($qv['paged'])) { $qv['page'] = $qv['paged']; unset($qv['paged']); } } } if ('' != $qv['pagename']) { $this_WP_Query->queried_object = get_page_by_path($qv['pagename']); if ( ! empty($this_WP_Query->queried_object)) { $this_WP_Query->queried_object_id = (int) $this_WP_Query->queried_object->ID; } else { unset($this_WP_Query->queried_object); } if ('page' == get_option('show_on_front') && isset($this_WP_Query->queried_object_id) && $this_WP_Query->queried_object_id == get_option('page_for_posts')) { $this_WP_Query->is_page = false; $this_WP_Query->is_home = true; $this_WP_Query->is_posts_page = true; } } if ($qv['page_id']) { if ('page' == get_option('show_on_front') && $qv['page_id'] == get_option('page_for_posts')) { $this_WP_Query->is_page = false; $this_WP_Query->is_home = true; $this_WP_Query->is_posts_page = true; } } if ( ! empty($qv['post_type'])) { if (is_array($qv['post_type'])) { $qv['post_type'] = array_map('sanitize_key', $qv['post_type']); } else { $qv['post_type'] = sanitize_key($qv['post_type']); } } if ( ! empty($qv['post_status'])) { if (is_array($qv['post_status'])) { $qv['post_status'] = array_map('sanitize_key', $qv['post_status']); } else { $qv['post_status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['post_status']); } } if ($this_WP_Query->is_posts_page && ( ! isset($qv['withcomments']) || ! $qv['withcomments'])) { $this_WP_Query->is_comment_feed = false; } $this_WP_Query->is_singular = $this_WP_Query->is_single || $this_WP_Query->is_page || $this_WP_Query->is_attachment; // Done correcting is_* for page_on_front and page_for_posts /* if ( '404' == $qv['error'] ) $this_WP_Query->set_404(); $this_WP_Query->query_vars_hash = md5( serialize( $this_WP_Query->query_vars ) ); $this_WP_Query->query_vars_changed = false; */ } //开发中功能, 发表文章时进行繁简转换 /* add_filter('content_save_pre', $wpcs_langs['zh-tw'][0]); add_filter('title_save_pre', $wpcs_langs['zh-tw'][0]); add_action('admin_menu', 'wpcs_ep'); function wpcs_ep() { add_meta_box('chinese-conversion', 'Chinese Switcher', 'wpcs_edit_post', 'post'); add_meta_box('chinese-conversion', 'Chinese Switcher', 'wpcs_edit_post', 'page'); } function wpcs_edit_post() { echo '111'; } */ /** * 输出Header信息 * * 在繁简转换页
部分输出一些JS和noindex的meta信息. * noindex的meta头是为了防止搜索引擎索引重复内容; * * JS信息是为了客户端一些应用和功能保留的. * 举例, 当访客在一个繁简转换页面提交搜索时, 本插件载入的JS脚本会在GET请求里附加一个variant变量, * 如 /?s=test&variant=zh-tw * 这样服务器端能够获取用户当前中文语言, 并显示对应语言的搜索结果页 * */ function wpcs_header() { global $wpcs_target_lang, $wpcs_langs_urls, $wpcs_noconversion_url, $wpcs_direct_conversion_flag; echo "\n" . ''; echo "'; if ( ! $wpcs_direct_conversion_flag) { wp_enqueue_script('wpcs-search-js', wpcs_DIR_URL . 'assets/js/search-variant.min.js', array(), '1.1', false); } //echo ''; if ($wpcs_direct_conversion_flag || ((class_exists('All_in_One_SEO_Pack') || class_exists('Platinum_SEO_Pack')) && ! is_single() && ! is_home() && ! is_page() && ! is_search()) ) { return; } else { echo ''; } } /* * 设置url. 包括当前页面原始URL和各个语言版本URL * @since 1.1.7 * */ function wpcs_template_redirect() { global $wpcs_noconversion_url, $wpcs_langs_urls, $wpcs_options, $wpcs_target_lang, $wpcs_redirect_to; if ($wpcs_noconversion_url == get_option('home') . '/' && $wpcs_options['wpcs_use_permalink']) { foreach ($wpcs_options['wpcs_used_langs'] as $value) { $wpcs_langs_urls[$value] = $wpcs_noconversion_url . $value . '/'; } } else { foreach ($wpcs_options['wpcs_used_langs'] as $value) { $wpcs_langs_urls[$value] = wpcs_link_conversion($wpcs_noconversion_url, $value); } } if ( ! is_404() && $wpcs_redirect_to) { setcookie('wpcs_is_redirect_' . COOKIEHASH, '1', 0, COOKIEPATH, COOKIE_DOMAIN); wp_redirect($wpcs_langs_urls[$wpcs_redirect_to], 302); } if ( ! $wpcs_target_lang) { return; } add_action('comment_form', 'wpcs_modify_comment_form'); function wpcs_modify_comment_form() { global $wpcs_target_lang; echo ''; } wpcs_do_conversion(); } /** * 在Wordpress的query vars里增加一个variant变量. * */ function wpcs_insert_query_vars($vars) { array_push($vars, 'variant'); return $vars; } /** * Widget Class * @since 1.1.8 * */ class wpcs_Widget extends WP_Widget { function __construct() { parent::__construct('widget_wpcs', 'Chinese Switcher', array( 'classname' => 'widget_wpcs', 'description' => 'Chinese Switcher Widget' )); } function widget($args, $instance) { extract($args); $title = apply_filters('widget_title', $instance['title']); echo $before_widget; if ($title) { echo $before_title . $title . $after_title; } wpcs_output_navi(isset($instance['args']) ? $instance['args'] : ''); echo $after_widget; } function update($new_instance, $old_instance) { return $new_instance; } function form($instance) { $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; $args = isset($instance['args']) ? esc_attr($instance['args']) : ''; ?>

and . global $wpcs_options, $wpcs_langs; if ($variant === null) { $variant = $GLOBALS['wpcs_target_lang']; } if ($variant == false) { return $str; } return limit_zhconversion($str, $wpcs_langs[$variant][0]); } $_wpcs_id = 1000; /** * get a unique id number */ function wpcs_id() { global $_wpcs_id; return $_wpcs_id ++; } /** * filter the content * @since 1.1.14 * */ function wpcs_no_conversion_filter($str) { global $wpcs_options; $html = str_get_html($str); $query = ''; if ( ! empty($wpcs_options['wpcs_no_conversion_ja'])) { $query .= '*[lang="ja"]'; } if ( ! empty($wpcs_options['wpcs_no_conversion_tag'])) { if ($query != '') { $query .= ','; } if (preg_match('/^[a-z1-9|]+$/', $wpcs_options['wpcs_no_conversion_tag'])) { $query .= str_replace('|', ',', $wpcs_options['wpcs_no_conversion_tag']); } // backward compatability else { $query .= $wpcs_options['wpcs_no_conversion_tag']; } } $elements = $html->find($query); if (count($elements) == 0) { return $str; } foreach ($elements as $element) { $id = wpcs_id(); $element->innertext = '' . $element->innertext . ''; } return (string) $html; } /** * 安全转换字符串到当前请求的中文语言 * * @param string $str string inputed * @param string $variant optional, Default to null, chinese language code you want string to be converted, if null( default), will use $GLOBALS['wpcs_target_lang'] * * @return converted string * * 与zhconversion函数不同的是本函数首先确保载入繁简转换表, 因为多了一次判断, 不可避免多耗费资源. * */ function zhconversion_safe($str, $variant = null) { wpcs_load_conversion_table(); return zhconversion($str, $variant); } /** * 转换字符到多种中文语言,返回数组 * * @param string $str string to be converted * @param array $langs Optional, Default to array('zh-tw', 'zh-cn'). array of chinese languages codes you want string to be converted to * * @return array converted strings array * * Example: zhconversion('網絡'); * Return: array('網路', '网络'); * */ function zhconversion_all($str, $langs = array('zh-tw', 'zh-cn', 'zh-hk', 'zh-sg', 'zh-hans', 'zh-hant')) { global $wpcs_langs; $return = array(); foreach ($langs as $value) { $tmp = $wpcs_langs[$value][0] ($str); if ($tmp != $str) { $return[] = $tmp; } } return array_unique($return); } /** * 递归的对数组中元素用zhconversion函数转换, 返回处理后数组. * */ function zhconversion_deep($value) { $value = is_array($value) ? array_map('zhconversion_deep', $value) : zhconversion($value); return $value; } /** * 对输入字符串进行有限中文转换. 不转换之間的中文 * * @param string $str string inputed * @param string $function conversion function for current requested chinese language * * @return converted string * */ function limit_zhconversion($str, $function) { if ($m = preg_split('/()(.*?)()/s', $str, - 1, PREG_SPLIT_DELIM_CAPTURE)) { $r = ''; $count = 0; foreach ($m as $v) { $count ++; if ($count % 5 == 1) { $r .= $function ($v); } else if ($count % 5 == 4) { $r .= $v; } } return $r; } else { return $function($str); } } /** * 中文轉換函數. (zhconversion_hans轉換字符串為簡體中文, zhconversion_hant轉換字符串為繁體中文, zhconversion_tw轉換字符串為臺灣正體, 依次類推) * * @param string $str string to be converted * * @return string converted chinese string * * 对于zh-hans和zh-hant以外中文语言(如zh-tw),Mediawiki里的做法是 先array_merge($zh2Hans, $zh2TW),再做一次strtr. 但这里考虑到内存需求和CPU资源,采用两次strtr方法.其中$zh2TW先做,因为其中项目可能覆盖zh2Hant里的项目 * * 注意: 如果您想在其他地方(如Theme)里使用下面中文轉換函數, 請保證首先調用一次wpcs_load_conversion_table(); , 因為出于節省內存需求, 本插件僅在繁簡轉換頁面才會載入中文轉換表. * */ function zhconversion_hant($str) { global $zh2Hant; return strtr($str, $zh2Hant); } function zhconversion_hans($str) { global $zh2Hans; return strtr($str, $zh2Hans); } function zhconversion_cn($str) { global $zh2Hans, $zh2CN; return strtr(strtr($str, $zh2CN), $zh2Hans); } function zhconversion_tw($str) { global $zh2Hant, $zh2TW; return strtr(strtr($str, $zh2TW), $zh2Hant); } function zhconversion_sg($str) { global $zh2Hans, $zh2SG; return strtr(strtr($str, $zh2SG), $zh2Hans); } function zhconversion_hk($str) { global $zh2Hant, $zh2HK; return strtr(strtr($str, $zh2HK), $zh2Hant); } /** * 不推荐, 为向后兼容保留的函数 * 为模板预留的函数, 把链接安全转换为当前中文语言版本的, 您可以在模板中调用其转换硬编码的链接. * 例如, 您可以在您的footer.php里显示博客About页链接: About * 如果用户请求一个繁简转换页面, 则输出为该页的对应繁简转换版本链接,如 http://domain.tld/about/zh-tw/ * * @param string $link URL to be converted * * @return string converted URL * * @deprecated Use wpcs_link_conversion($link) */ function wpcs_link_safe_conversion($link) { return wpcs_link_conversion($link); } /** * 取消WP错误的重定向 * * @param string $redirect_to 'redirect_canonical' filter's first argument * @param string $redirect_from 'redirect_canonical' filter's second argument * * @return string|false * * 因为Wordpress canonical url机制, 有时会把繁简转换页重定向到错误URL * 本函数检测并取消这种重定向(通过返回false) * */ function wpcs_cancel_incorrect_redirect($redirect_to, $redirect_from) { global $wp_rewrite; if (preg_match('/^.*\/(zh-tw|zh-cn|zh-sg|zh-hant|zh-hans|zh-my|zh-mo|zh-hk|zh|zh-reset)\/?.+$/', $redirect_to)) { if (($wp_rewrite->use_trailing_slashes && substr($redirect_from, - 1) != '/') || ( ! $wp_rewrite->use_trailing_slashes && substr($redirect_from, - 1) == '/') ) { return user_trailingslashit($redirect_from); } return false; } return $redirect_to; } /** * 修改WP Rewrite规则数组, 增加本插件添加的Rewrite规则 * * @param array $rules 'rewrite_rules_array' filter's argument , WP rewrite rules array * * @return array processed rewrite rules array * * * 基本上, 本函数对WP的Rewrite规则数组这样处理: * * 对 '..../?$' => 'index.php?var1=$matches[1]..&varN=$matches[N]' 这样一条规则, * 如果规则体部分 '.../?$' 含有 'trackback', 'attachment', 'print', 不做处理 * 否则, 增加一条 '.../zh-tw|zh-hant|...|zh-hans|zh|zh-reset/?$' => 'index.php?var1=$matches[1]..&varN=$matches[N]&variant=$matches[N+1]'的新规则 * 1.1.6版本后, 因为增加了/zh-tw/original/permalink/这种URL形式, 情况更加复杂 * */ function wpcs_rewrite_rules($rules) { global $wpcs_options; $reg = implode('|', $wpcs_options['wpcs_used_langs']); $rules2 = array(); if ($wpcs_options['wpcs_use_permalink'] == 1) { foreach ($rules as $key => $value) { if (strpos($key, 'trackback') !== false || strpos($key, 'print') !== false || strpos($value, 'lang=') !== false) { continue; } if (substr($key, - 3) == '/?$') { if ( ! preg_match_all('/\$matches\[(\d+)\]/', $value, $matches, PREG_PATTERN_ORDER)) { continue; } $number = count($matches[0]) + 1; $rules2[substr($key, 0, - 3) . '/(' . $reg . '|zh|zh-reset)/?$'] = $value . '&variant=$matches[' . $number . ']'; } } } else { // $wpcs_options['wpcs_use_permalink'] == 2 foreach ($rules as $key => $value) { if (strpos($key, 'trackback') !== false || strpos($key, 'print') !== false || strpos($value, 'lang=') !== false) { continue; } if (substr($key, - 3) == '/?$') { $rules2['(' . $reg . '|zh|zh-reset)/' . $key] = preg_replace_callback('/\$matches\[(\d+)\]/', '_wpcs_permalink_preg_callback', $value) . '&variant=$matches[1]'; } } } $rules2['^(' . $reg . '|zh|zh-reset)/?$'] = 'index.php?variant=$matches[1]';//首页的繁简转换版本rewrite规则 $return = array_merge($rules2, $rules); return $return; } function _wpcs_permalink_preg_callback($matches) { return '$matches[' . (intval($matches[1]) + 1) . ']'; } /** * 修改繁簡轉換頁面WP內部鏈接 * * @param string $link URL to be converted * * @return string converted URL * * 如果訪客請求一個繁簡轉換頁面, 本函數把該頁的所有鏈接轉換為對應中文語言版本的 * 例如把分類頁鏈接轉換為 /category/cat-name/zh-xx/, 把Tag頁鏈接轉換為 /tag/tag-name/zh-xx/ * */ function wpcs_link_conversion($link, $variant = null) { global $wpcs_options; static $wpcs_wp_home; if (empty($wpcs_wp_home)) { $wpcs_wp_home = home_url(); } if ($variant === null) { $variant = $GLOBALS['wpcs_target_lang']; } if ($variant == false) { return $link; } if (strpos($link, '?') !== false || ! $wpcs_options['wpcs_use_permalink']) { return add_query_arg('variant', $variant, $link); } if ($wpcs_options['wpcs_use_permalink'] == 1) { return user_trailingslashit(trailingslashit($link) . $variant); } return preg_replace('#^(http(s?)://[^/]+' . $wpcs_wp_home . ')#', '\\1' . $variant . '/', $link); } /** * don't convert a link in "direct_conversion" mode; * @since 1.1.14.2 */ function wpcs_link_conversion_auto($link, $variant = null) { global $wpcs_target_lang, $wpcs_direct_conversion_flag, $wpcs_options; if ($link == home_url('')) { $link .= '/'; } if ( ! $wpcs_target_lang || $wpcs_direct_conversion_flag) { return $link; } else { if ($link == home_url('/') && ! empty($wpcs_options['wpcs_use_permalink'])) { return trailingslashit(wpcs_link_conversion($link)); } return wpcs_link_conversion($link); } } /** * 獲取當前頁面原始URL * @return original permalink of current page * * 本函數返回當前請求頁面"原始版本" URL. * 即如果當前URL是 /YYYY/mm/sample-post/zh-tw/ 形式的臺灣正體版本, * 會返回 /YYYY/mm/sample-post/ 的原始(不進行中文轉換)版本鏈接. * */ function wpcs_get_noconversion_url() { global $wpcs_options; $reg = implode('|', $wpcs_options['wpcs_used_langs']); $tmp = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $tmp = trim(strtolower(remove_query_arg('variant', $tmp))); if (preg_match('/^(.*)\/(' . $reg . '|zh|zh-reset)(\/.*)?$/', $tmp, $matches)) { $tmp = user_trailingslashit(trailingslashit($matches[1]) . ltrim($matches[3], '/')); //为什么这样写代码? 是有原因的- -(众人: 废话!) if ($tmp == get_option('home')) { $tmp .= '/'; } } return $tmp; } /** * 修復繁簡轉換頁分頁鏈接 * * @param string $link URL to be fixed * * @return string Fixed URL * * 本函數修復繁簡轉換頁面 /.../page/N 形式的分頁鏈接為正確形式. 具體說明略. * * 您可以在本函數內第一行加上 'return $link;' 然后訪問您博客首頁或存檔頁的繁體或簡體版本, * 會發現"上一頁"(previous posts page)和"下一頁"(next posts page)的鏈接URL是錯誤的. * 本函数算法极为愚蠢- -, 但是没有其它办法, 因为wordpress对于分页链接的生成策略非常死板且无法更多地通过filter控制 * */ function wpcs_pagenum_link_fix($link) { global $wpcs_target_lang, $wpcs_options; global $paged; if ($wpcs_options['wpcs_use_permalink'] != 1) { return $link; } if (preg_match('/^(.*)\/page\/\d+\/' . $wpcs_target_lang . '\/page\/(\d+)\/?$/', $link, $tmp) || preg_match('/^(.*)\/' . $wpcs_target_lang . '\/page\/(\d+)\/?$/', $link, $tmp)) { return user_trailingslashit($tmp[1] . '/page/' . $tmp[2] . '/' . $wpcs_target_lang); } else if (preg_match('/^(.*)\/page\/(\d+)\/' . $wpcs_target_lang . '\/?$/', $link, $tmp) && $tmp[2] == 2 && $paged == 2) { if ($tmp[1] == get_option('home')) { return $tmp[1] . '/' . $wpcs_target_lang . '/'; } return user_trailingslashit($tmp[1] . '/' . $wpcs_target_lang); } return $link; } /** * 修复繁简转换后页面部分内部链接. * * @param string $link URL to be fixed * * @return string Fixed URL * * 本插件会添加 post_link钩子, 从而修改繁简转换页单篇文章页永久链接, 但WP的很多内部链接生成依赖这个permalink. * (为什么加载在post_link钩子上而不是the_permalink钩子上? 有很多原因,这里不说了.) * * 举例而言, 本插件把 繁简转换页的文章permalink修改为 /YYYY/mm/sample-post/zh-tw/ (如果您原来的Permalink是/YYYY/mm/sample-post/) * 那么WP生成的该篇文章评论Feed链接是 /YYYY/mm/sample-post/zh-tw/feed/, 出错 * 本函数把这个链接修复为 /YYYY/mm/sample-post/feed/zh-tw/ 的正确形式. * */ function wpcs_fix_link_conversion($link) { global $wpcs_options; if ($wpcs_options['wpcs_use_permalink'] == 1) { if ($flag = strstr($link, '#')) { $link = substr($link, 0, - strlen($flag)); } if (preg_match('/^(.*\/)(zh-tw|zh-cn|zh-sg|zh-hant|zh-hans|zh-my|zh-mo|zh-hk|zh|zh-reset)\/(.+)$/', $link, $tmp)) { return user_trailingslashit($tmp[1] . trailingslashit($tmp[3]) . $tmp[2]) . $flag; } return $link . $flag; } else if ($wpcs_options['wpcs_use_permalink'] == 0) { if (preg_match('/^(.*)\?variant=([-a-zA-Z]+)\/(.*)$/', $link, $tmp)) { return add_query_arg('variant', $tmp[2], trailingslashit($tmp[1]) . $tmp[3]); } return $link; } else { return $link; } } /** * "取消"繁简转换后页面部分内部链接轉換. * * @param string $link URL to be fixed * * @return string Fixed URL * * 本函數作用與上面的wpcs_fix_link_conversion類似, 不同的是本函數"取消"而不是"修復"繁簡轉換頁內部鏈接 * 舉例而言, 對繁簡轉換頁面而言, WP生成的單篇文章trackback地址 是 /YYYY/mm/sample-post/zh-tw/trackback/ * 本函數把它修改為 /YYYY/mm/sample-post/trackback/的正確形式(即去除URL中 zh-xx字段) * */ function wpcs_cancel_link_conversion($link) { global $wpcs_options; if ($wpcs_options['wpcs_use_permalink']) { if (preg_match('/^(.*\/)(zh-tw|zh-cn|zh-sg|zh-hant|zh-hans|zh-my|zh-mo|zh-hk|zh|zh-reset)\/(.+)$/', $link, $tmp)) { return $tmp[1] . $tmp[3]; } return $link; } else { if (preg_match('/^(.*)\?variant=[-a-zA-Z]+\/(.*)$/', $link, $tmp)) { return trailingslashit($tmp[1]) . $tmp[2]; } return $link; } } /** * ... */ function wpcs_rel_canonical() { if ( ! is_singular()) { return; } global $wp_the_query; if ( ! $id = $wp_the_query->get_queried_object_id()) { return; } $link = wpcs_cancel_link_conversion(get_permalink($id)); echo "\n"; } /** * 返回w3c標準的當前中文語言代碼,如 zh-CN, zh-Hans * 返回值可以用在html元素的 lang=""標籤裡 * * @since 1.1.9 * @link http://www.w3.org/International/articles/language-tags/ W3C關於language attribute文章. */ function variant_attribute($default = "zh", $variant = false) { global $wpcs_langs; if ( ! $variant) { $variant = $GLOBALS['wpcs_target_lang']; } if ( ! $variant) { return $default; } return $wpcs_langs[$variant][3]; } /** * 返回當前語言代碼 * @since 1.1.9 */ function variant($default = false) { global $wpcs_target_lang; if ( ! $wpcs_target_lang) { return $default; } return $wpcs_target_lang; } /** * 输出当前页面不同中文语言版本链接 * * @param bool $return Optional, Default to false, return or echo result. * * 本插件Widget会调用这个函数. * */ function wpcs_output_navi($args = '') { global $wpcs_target_lang, $wpcs_noconversion_url, $wpcs_langs_urls, $wpcs_langs, $wpcs_options; extract(wp_parse_args($args, array('mode' => 'normal', 'echo' => 1))); if ($mode == 'wrap') { wpcs_output_navi2(); return; } if ( ! empty($wpcs_options['nctip'])) { $noconverttip = $wpcs_options['nctip']; } else { $locale = str_replace('_', '-', strtolower(get_locale())); if (in_array($locale, array('zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'))) //zh-mo = 澳門繁體, 目前與zh-hk香港繁體轉換表相同 { $noconverttip = '不轉換'; } else { $noconverttip = '不转换'; } } if ($wpcs_target_lang) { $noconverttip = zhconversion($noconverttip); } if (($wpcs_options['wpcs_browser_redirect'] == 2 || $wpcs_options['wpcs_use_cookie_variant'] == 2) && $wpcs_target_lang ) { $default_url = wpcs_link_conversion($wpcs_noconversion_url, 'zh'); if ($wpcs_options['wpcs_use_permalink'] != 0 && is_home() && ! is_paged()) { $default_url = trailingslashit($default_url); } } else { $default_url = $wpcs_noconversion_url; } $output = "\n" . '
' . "\n"; $output .= ' ' . esc_html($noconverttip) . '' . "\n"; foreach ($wpcs_langs_urls as $key => $value) { $tip = ! empty($wpcs_options[$wpcs_langs[$key][1]]) ? esc_html($wpcs_options[$wpcs_langs[$key][1]]) : $wpcs_langs[$key][2]; $output .= ' ' . esc_html($tip) . '' . "\n"; } $output .= '
' . "\n"; if ( ! $echo) { return $output; } echo $output; } /** * Another function for outputing navi. You should not want to use it. * */ function wpcs_output_navi2() { global $wpcs_target_lang, $wpcs_noconversion_url, $wpcs_langs_urls, $wpcs_options; if (($wpcs_options['wpcs_browser_redirect'] == 2 || $wpcs_options['wpcs_use_cookie_variant'] == 2) && $wpcs_target_lang ) { $default_url = wpcs_link_conversion($wpcs_noconversion_url, 'zh'); if ($wpcs_options['wpcs_use_permalink'] != 0 && is_home() && ! is_paged()) { $default_url = trailingslashit($default_url); } } else { $default_url = $wpcs_noconversion_url; } $output = "\n" . '
' . "\n"; $output .= ' 不轉換' . "\n"; $output .= ' 大陆简体' . "\n"; $output .= ' 台灣正體' . "\n"; /*$output .= ' 其它中文 简体中文' . ' 繁體中文' . ' 港澳繁體 马新简体 ';*/ $output .= '
' . "\n"; echo $output; } /** * 从给定的语言列表中, 解析出浏览器客户端首选语言, 返回解析出的语言字符串或false * * @param string $accept_languages the languages sting, should set to $_SERVER['HTTP_ACCEPT_LANGUAGE'] * @param array $target_langs given languages array * @param int|bool $flag Optional, default to 0 ( mean false ), description missing. * * @return string|bool the parsed lang or false if it doesn't exists * * 使用举例: 调用形式 wpcs_get_prefered_language($_SERVER['HTTP_ACCEPT_LANGUAGE'], $target_langs) * * $_SERVER['HTTP_ACCEPT_LANGUAGE']: ja,zh-hk;q=0.8,fr;q=0.5,en;q=0.3 * $target_langs: array('zh-hk', 'en') * 返回值: zh-hk * * $_SERVER['HTTP_ACCEPT_LANGUAGE']: fr;q=0.5,en;q=0.3 * $target_langs: array('zh-hk', 'en') * 返回值: en * * $_SERVER['HTTP_ACCEPT_LANGUAGE']: ja,zh-hk;q=0.8,fr;q=0.5,en;q=0.3 * $target_langs: array('zh-tw', 'zh-cn') * 返回值: false * */ function wpcs_get_prefered_language($accept_languages, $target_langs, $flag = 0) { $langs = array(); preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $accept_languages, $lang_parse); if (count($lang_parse[1])) { $langs = array_combine($lang_parse[1], $lang_parse[4]);//array_combine需要php5以上版本 foreach ($langs as $lang => $val) { if ($val === '') { $langs[$lang] = '1'; } } arsort($langs, SORT_NUMERIC); $langs = array_keys($langs); $langs = array_map('strtolower', $langs); foreach ($langs as $val) { if (in_array($val, $target_langs)) { return $val; } } if ($flag) { $array = array('zh-hans', 'zh-cn', 'zh-sg', 'zh-my'); $a = array_intersect($array, $target_langs); if ( ! empty($a)) { $b = array_intersect($array, $langs); if ( ! empty($b)) { $a = each($a); return $a[1]; } } $array = array('zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'); $a = array_intersect($array, $target_langs); if ( ! empty($a)) { $b = array_intersect($array, $langs); if ( ! empty($b)) { $a = each($a); return $a[1]; } } } return false; } return false; } /** * 判断当前请求是否为搜索引擎访问. * 使用的算法极为保守, 只要不是几个主要的浏览器,就判定为Robots * * @return bool * @uses $_SERVER['HTTP_USER_AGENT'] */ function wpcs_is_robot() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return true; } $ua = strtoupper($_SERVER['HTTP_USER_AGENT']); $robots = array( 'bot', 'spider', 'crawler', 'dig', 'search', 'find' ); foreach ($robots as $key => $val) { if (strstr($ua, strtoupper($val))) { return true; } } $browsers = array( "compatible; MSIE", "UP.Browser", "Mozilla", "Opera", "NSPlayer", "Avant Browser", "Chrome", "Gecko", "Safari", "Lynx", ); foreach ($browsers as $key => $val) { if (strstr($ua, strtoupper($val))) { return false; } } return true; } /** * fix a relative bug * @since 1.1.14 * */ function wpcs_apply_filter_search_rule() { add_filter('posts_where', 'wpcs_filter_search_rule', 100); function search_distinct() { return "DISTINCT"; } add_filter('posts_distinct', 'search_distinct'); } /** * 对Wordpress搜索时生成sql语句的 where 条件部分进行处理, 使其同时在数据库中搜索关键词的中文简繁体形式. * * @param string $where 'post_where' filter's argument, 'WHERE...' part of the wordpesss query sql sentence * * @return string WHERE sentence have been processed * * 使用方法: add_filter('posts_where', 'wpcs_filter_search_rule'); * 原理说明: 假设访客通过表单搜索 "简体 繁體 中文", Wordpress生成的sql语句条件$where中一部分是这样的: * * ((wp_posts.post_title LIKE '%简体%') OR (wp_posts.post_content LIKE '%简体%')) AND ((wp_posts.post_title LIKE '%繁體%') OR (wp_posts.post_content LIKE '%繁體%')) AND ((wp_posts.post_title LIKE '%中文%') OR (wp_posts.post_content LIKE '%中文%')) OR (wp_posts.post_title LIKE '%简体 繁體 中文%') OR (wp_posts.post_content LIKE '%简体 繁體 中文%') * * 本函数把$where中的上面这部分替换为: * * ( ( wp_posts.post_title LIKE '%簡體%') OR ( wp_posts.post_content LIKE '%簡體%') OR ( wp_posts.post_title LIKE '%简体%') OR ( wp_posts.post_content LIKE '%简体%') ) AND ( ( wp_posts.post_title LIKE '%繁体%') OR ( wp_posts.post_content LIKE '%繁体%') OR ( wp_posts.post_title LIKE '%繁體%') OR ( wp_posts.post_content LIKE '%繁體%') ) AND ( ( wp_posts.post_title LIKE '%中文%') OR ( wp_posts.post_content LIKE '%中文%') ) OR ( wp_posts.post_title LIKE '%簡體 繁體 中文%') OR ( wp_posts.post_content LIKE '%簡體 繁體 中文%') OR ( wp_posts.post_title LIKE '%简体 繁体 中文%') OR ( wp_posts.post_content LIKE '%简体 繁体 中文%') OR ( wp_posts.post_title LIKE '%简体 繁體 中文%') OR ( wp_posts.post_content LIKE '%简体 繁體 中文%') * */ function wpcs_filter_search_rule($where) { global $wp_query, $wpdb; if (empty($wp_query->query_vars['s'])) { return $where; } if ( ! preg_match("/^([" . chr(228) . "-" . chr(233) . "]{1}[" . chr(128) . "-" . chr(191) . "]{1}[" . chr(128) . "-" . chr(191) . "]{1}){1}/", $wp_query->query_vars['s']) && ! preg_match("/([" . chr(228) . "-" . chr(233) . "]{1}[" . chr(128) . "-" . chr(191) . "]{1}[" . chr(128) . "-" . chr(191) . "]{1}){1}$/", $wp_query->query_vars['s']) && ! preg_match("/([" . chr(228) . "-" . chr(233) . "]{1}[" . chr(128) . "-" . chr(191) . "]{1}[" . chr(128) . "-" . chr(191) . "]{1}){2,}/", $wp_query->query_vars['s'])) { return $where; }//如果搜索关键字中不含中文字符, 直接返回 wpcs_load_conversion_table(); $placeholder = '%'; if (method_exists($wpdb, 'placeholder_escape')) { $placeholder = $wpdb->placeholder_escape("%"); // echo("pe exists: " . $placeholder . '
'); } $sql = ''; $and1 = ''; $original = '';//Wordpress原始搜索sql代码中 post_title和post_content like '%keyword%'的部分,本函数最后需要找出原始sql代码中这部分并予以替换, 所以必须在过程中重新生成一遍, foreach ($wp_query->query_vars['search_terms'] as $value) { $value = addslashes_gpc($value); $original .= "{$and1}(($wpdb->posts.post_title LIKE '{$placeholder}{$value}{$placeholder}') OR ($wpdb->posts.post_excerpt LIKE '{$placeholder}{$value}{$placeholder}') OR ($wpdb->posts.post_content LIKE '{$placeholder}{$value}{$placeholder}'))"; $valuea = zhconversion_all($value); $valuea[] = $value; $sql .= "{$and1}( "; $or2 = ''; foreach ($valuea as $v) { $sql .= "{$or2}( " . $wpdb->prefix . "posts.post_title LIKE '{$placeholder}" . $v . "{$placeholder}') "; $sql .= " OR ( " . $wpdb->prefix . "posts.post_content LIKE '{$placeholder}" . $v . "{$placeholder}') "; $sql .= " OR ( " . $wpdb->prefix . "posts.post_excerpt LIKE '{$placeholder}" . $v . "{$placeholder}') "; $or2 = ' OR '; } $sql .= ' ) '; $and1 = ' AND '; } // debug // echo("Where: ". $where . "

Search: " . $original . "

Replace with: $sql");die(); if (empty($sql)) { return $where; } $where = preg_replace('/' . preg_quote($original, '/') . '/', $sql, $where, 1); return $where; } /** * ob_start Callback function * */ function wpcs_ob_callback($buffer) { global $wpcs_target_lang, $wpcs_direct_conversion_flag; if ($wpcs_target_lang && ! $wpcs_direct_conversion_flag) { $wpcs_home_url = wpcs_link_conversion_auto(home_url('/')); $buffer = preg_replace('|(]*?href=([\'"]))' . preg_quote(esc_url(home_url('')), '|') . '/?(\2[^<>]*?>)|', '\\1' . esc_url($wpcs_home_url) . '\\3', $buffer); } return zhconversion2($buffer) . "\n" . ''; } /** * Debug Function * * 要开启本插件Debug, 去掉第一行 defined('wpcs_DEBUG', true')...注释. * Debug信息将输出在页面footer位置( wp_footer action) * */ function wpcs_debug() { global $wpcs_noconversion_url, $wpcs_target_lang, $wpcs_langs_urls, $wpcs_deubg_data, $wpcs_langs, $wpcs_options, $wp_rewrite; echo ''; } /** * Admin管理后台初始化 * */ function wpcs_admin_init() { global $wpcs_admin; require_once(dirname(__FILE__) . '/wp-chinese-switcher-admin.php'); $wpcs_admin = new wpcs_Admin(); } /** * Parse current request * * @param object $query 'parse_request' filter' argument, the 'WP' object * * @todo 彻底重写本函数(目前是一团浆糊)。使用Wordpress原生的query var系統讀/寫variant參數, 1.2版本實現. * Core codes of this plugin * 本函数获取当前请求中文语言并保存到 $wpcs_target_lang全局变量里. * 并且还做其它一些事情. * */ function wpcs_parse_query($query) { if (is_robots()) { return; } global $wpcs_target_lang, $wpcs_redirect_to, $wpcs_noconversion_url, $wpcs_options, $wpcs_direct_conversion_flag; if ( ! is_404()) { $wpcs_noconversion_url = wpcs_get_noconversion_url(); } else { $wpcs_noconversion_url = get_option('home') . '/'; $wpcs_target_lang = false; return; } $request_lang = isset($query->query_vars['variant']) ? $query->query_vars['variant'] : ''; $cookie_lang = isset($_COOKIE['wpcs_variant_' . COOKIEHASH]) ? $_COOKIE['wpcs_variant_' . COOKIEHASH] : ''; if ($request_lang && in_array($request_lang, $wpcs_options['wpcs_used_langs'])) { $wpcs_target_lang = $request_lang; } else { $wpcs_target_lang = false; } if ( ! $wpcs_target_lang) { if ($request_lang == 'zh') { if ($wpcs_options['wpcs_use_cookie_variant'] != 0) { setcookie('wpcs_variant_' . COOKIEHASH, 'zh', time() + 30000000, COOKIEPATH, COOKIE_DOMAIN); } else { setcookie('wpcs_is_redirect_' . COOKIEHASH, '1', 0, COOKIEPATH, COOKIE_DOMAIN); } header('Location: ' . $wpcs_noconversion_url); die(); } if ($request_lang == 'zh-reset') { setcookie('wpcs_variant_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); setcookie('wpcs_is_redirect_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); header('Location: ' . $wpcs_noconversion_url); die(); } if ($cookie_lang == 'zh') { if ($wpcs_options['wpcs_use_cookie_variant'] != 0) { if ($wpcs_options['wpcs_search_conversion'] == 2) { wpcs_apply_filter_search_rule(); } return; } else { setcookie('wpcs_variant_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); } } if ( ! $request_lang && ! empty($_COOKIE['wpcs_is_redirect_' . COOKIEHASH])) { if ($wpcs_options['wpcs_use_cookie_variant'] != 0) { setcookie('wpcs_variant_' . COOKIEHASH, 'zh', time() + 30000000, COOKIEPATH, COOKIE_DOMAIN); setcookie('wpcs_is_redirect_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); } else if ($cookie_lang) { setcookie('wpcs_variant_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); } if ($wpcs_options['wpcs_search_conversion'] == 2) { wpcs_apply_filter_search_rule(); } return; } $is_robot = wpcs_is_robot(); if ($wpcs_options['wpcs_use_cookie_variant'] != 0 && ! $is_robot && $cookie_lang) { if (in_array($cookie_lang, $wpcs_options['wpcs_used_langs'])) { if ($wpcs_options['wpcs_use_cookie_variant'] == 2) { $wpcs_target_lang = $cookie_lang; $wpcs_direct_conversion_flag = true; } else { $wpcs_redirect_to = $cookie_lang; } } else { setcookie('wpcs_variant_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); } } else { if ($cookie_lang) { setcookie('wpcs_variant_' . COOKIEHASH, '', time() - 30000000, COOKIEPATH, COOKIE_DOMAIN); } if ( $wpcs_options['wpcs_browser_redirect'] != 0 && ! $is_robot && ! empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && $wpcs_browser_lang = wpcs_get_prefered_language($_SERVER['HTTP_ACCEPT_LANGUAGE'], $wpcs_options['wpcs_used_langs'], $wpcs_options['wpcs_auto_language_recong']) ) { if ($wpcs_options['wpcs_browser_redirect'] == 2) { $wpcs_target_lang = $wpcs_browser_lang; $wpcs_direct_conversion_flag = true; } else { $wpcs_redirect_to = $wpcs_browser_lang; } } } } if ($wpcs_options['wpcs_search_conversion'] == 2 || ($wpcs_target_lang && $wpcs_options['wpcs_search_conversion'] == 1) ) { wpcs_apply_filter_search_rule(); } if ($wpcs_target_lang && $wpcs_options['wpcs_use_cookie_variant'] != 0 && $cookie_lang != $wpcs_target_lang) { setcookie('wpcs_variant_' . COOKIEHASH, $wpcs_target_lang, time() + 30000000, COOKIEPATH, COOKIE_DOMAIN); } } /** * 载入繁简转换表. * * 出于节省内存考虑, 本插件并不总是载入繁简转换表. 而仅在繁简转换页面才这样做. */ function wpcs_load_conversion_table() { global $wpcs_options; if ( ! empty($wpcs_options['wpcs_no_conversion_ja']) || ! empty($wpcs_options['wpcs_no_conversion_tag'])) { if ( ! function_exists('str_get_html')) { require_once(__DIR__ . '/simple_html_dom.php'); } } global $zh2Hans; if ($zh2Hans == false) { global $zh2Hant, $zh2TW, $zh2CN, $zh2SG, $zh2HK; require_once(dirname(__FILE__) . '/ZhConversion.php'); if (file_exists(WP_CONTENT_DIR . '/extra_zhconversion.php')) { require_once(WP_CONTENT_DIR . '/extra_zhconversion.php'); } } } /** * 进行繁简转换. 加载若干filter转换页面内容和内部链接 * */ function wpcs_do_conversion() { global $wpcs_direct_conversion_flag, $wpcs_options; wpcs_load_conversion_table(); add_action('wp_head', 'wpcs_header'); if ( ! $wpcs_direct_conversion_flag) { remove_action('wp_head', 'rel_canonical'); add_action('wp_head', 'wpcs_rel_canonical'); //add_filter('the_permalink', 'wpcs_link_conversion'); add_filter('post_link', 'wpcs_link_conversion'); add_filter('month_link', 'wpcs_link_conversion'); add_filter('day_link', 'wpcs_link_conversion'); add_filter('year_link', 'wpcs_link_conversion'); add_filter('page_link', 'wpcs_link_conversion'); add_filter('tag_link', 'wpcs_link_conversion'); add_filter('author_link', 'wpcs_link_conversion'); add_filter('category_link', 'wpcs_link_conversion'); add_filter('feed_link', 'wpcs_link_conversion'); add_filter('attachment_link', 'wpcs_link_conversion'); add_filter('search_feed_link', 'wpcs_link_conversion'); add_filter('category_feed_link', 'wpcs_fix_link_conversion'); add_filter('tag_feed_link', 'wpcs_fix_link_conversion'); add_filter('author_feed_link', 'wpcs_fix_link_conversion'); add_filter('post_comments_feed_link', 'wpcs_fix_link_conversion'); add_filter('get_comments_pagenum_link', 'wpcs_fix_link_conversion'); add_filter('get_comment_link', 'wpcs_fix_link_conversion'); add_filter('attachment_link', 'wpcs_cancel_link_conversion'); add_filter('trackback_url', 'wpcs_cancel_link_conversion'); add_filter('get_pagenum_link', 'wpcs_pagenum_link_fix'); add_filter('redirect_canonical', 'wpcs_cancel_incorrect_redirect', 10, 2); } if ( ! empty($wpcs_options['wpcs_no_conversion_ja']) || ! empty($wpcs_options['wpcs_no_conversion_tag'])) { add_filter('the_content', 'wpcs_no_conversion_filter', 15); add_filter('the_content_rss', 'wpcs_no_conversion_filter', 15); } if ($wpcs_options['wpcs_use_fullpage_conversion'] == 1) { @ob_start('wpcs_ob_callback'); /* function wpcs_ob_end() { while( @ob_end_flush() ); } add_action('shutdown', 'wpcs_ob_end'); */ //一般不需要这段代码, Wordpress默认在shutdown时循环调用ob_end_flush关闭所有缓存. return; } add_filter('the_content', 'zhconversion2', 20); add_filter('the_content_rss', 'zhconversion2', 20); add_filter('the_excerpt', 'zhconversion2', 20); add_filter('the_excerpt_rss', 'zhconversion2', 20); add_filter('the_title', 'zhconversion'); add_filter('comment_text', 'zhconversion'); add_filter('bloginfo', 'zhconversion'); add_filter('the_tags', 'zhconversion_deep'); add_filter('term_links-post_tag', 'zhconversion_deep'); add_filter('wp_tag_cloud', 'zhconversion'); add_filter('the_category', 'zhconversion'); add_filter('list_cats', 'zhconversion'); add_filter('category_description', 'zhconversion'); add_filter('single_cat_title', 'zhconversion'); add_filter('single_post_title', 'zhconversion'); add_filter('bloginfo_rss', 'zhconversion'); add_filter('the_title_rss', 'zhconversion'); add_filter('comment_text_rss', 'zhconversion'); } /** * 在html的body标签class属性里添加当前中文语言代码 * thanks to chad luo. * @since 1.1.13 * */ function wpcs_body_class($classes) { global $wpcs_target_lang; $classes[] = $wpcs_target_lang ? $wpcs_target_lang : "zh"; return $classes; } add_filter("body_class", "wpcs_body_class"); /** * 自動修改html tag 的 lang=""標籤為當前中文語言 * @since 1.0 * */ function wpcs_locale($output, $doctype = 'html') { global $wpcs_target_lang, $wpcs_langs; $lang = get_bloginfo('language'); if ($wpcs_target_lang && strpos($lang, 'zh-') === 0) { $lang = $wpcs_langs[$wpcs_target_lang][3]; $output = preg_replace('/lang="[^"]+"/', "lang=\"{$lang}\"", $output); } return $output; } add_filter('language_attributes', 'wpcs_locale'); /** * add a wpcs_NC button to html editor toolbar. * @since 1.1.14 */ function wpcs_appthemes_add_quicktags() { global $wpcs_options; if ( ! empty($wpcs_options) && ! empty($wpcs_options['wpcs_no_conversion_qtag']) && wp_script_is('quicktags')) { ?> 1, 'wpcs_used_langs' => array('zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-sg', 'zh-tw'), 'wpcs_browser_redirect' => 0, 'wpcs_auto_language_recong' => 0, 'wpcs_flag_option' => 1, 'wpcs_use_cookie_variant' => 0, 'wpcs_use_fullpage_conversion' => 1, 'wpcs_trackback_plugin_author' => 0, 'wpcs_add_author_link' => 0, 'wpcs_use_permalink' => 0, 'wpcs_no_conversion_tag' => '', 'wpcs_no_conversion_ja' => 0, 'wpcs_no_conversion_qtag' => 0, 'wpcs_engine' => 'mediawiki', // alternative: opencc 'nctip' => '', ); foreach ($current_options as $key => $value) { if (isset($wpcs_options[$key])) { $wpcs_options[$key] = $value; } } foreach ( array( 'zh-hans' => "hanstip", 'zh-hant' => "hanttip", 'zh-cn' => "cntip", 'zh-hk' => "hktip", 'zh-sg' => "sgtip", 'zh-tw' => "twtip", 'zh-my' => "mytip", 'zh-mo' => "motip" ) as $lang => $tip ) { if ( ! empty($current_options[$tip])) { $wpcs_options[$tip] = $current_options[$tip]; } } //WP will automaticlly add a option if it doesn't exists( when this plugin is firstly being installed). update_option('wpcs_options', $wpcs_options); } register_activation_hook(__FILE__, 'wpcs_activate');