Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法


Posted in PHP onDecember 29, 2010

NextGEN Gallery是Wordpress中著名的相册插件,遗憾的是不支持中文等unicode字符,本文将介绍如何将目录转换为拼音(添加图集时)。

以NextGEN 1.6.2为例:

“新增图集/图片”的路径是:admin.php?page=nggallery-add-gallery,我们在nextgen-gallery/admin/admin.php中查找“nggallery-add-gallery”,

switch ($_GET['page']){ 
case "nggallery-add-gallery" : 
include_once ( dirname (__FILE__) . '/functions.php' ); // admin functions 
include_once ( dirname (__FILE__) . '/addgallery.php' ); // nggallery_admin_add_gallery 
$ngg->addgallery_page = new nggAddGallery (); 
$ngg->addgallery_page->controller(); 
break;

类nggAddGallery在addgallery.php中,鼠标悬停在”新增图集“Tab上时从浏览器的状态栏可以看到URL是 admin.php?page=nggallery-add-gallery#addgallery , 在addgallery.php中查找"addgallery"看到其调用了:
nggAdmin::create_gallery($newgallery, $defaultpath);
nggAdmin类位于functions.php中,create_gallery函数修改如下:(红色粗体是新增加的行)
require_once('cn2pinyin.php'); 
/** 
* nggAdmin - Class for admin operation 
* 
* @package NextGEN Gallery 
* @author Alex Rabe 
* @copyright 2007-2010 
* @access public 
*/ 
class nggAdmin{ 
/** 
* create a new gallery & folder 
* 
* 添加中文支持 by:Elf Sundae 
* 
* @class nggAdmin 
* @param string $gallerytitle 
* @param string $defaultpath 
* @param bool $output if the function should show an error messsage or not 
* @return 
*/ 
function create_gallery($gallerytitle, $defaultpath, $output = true) { 
global $wpdb, $user_ID; 
// get the current user ID 
get_currentuserinfo(); 
//cleanup pathname 
$galleryname = sanitize_file_name( $gallerytitle ); 
// 中文转换为拼音 
$galleryname = cn2pinyin($galleryname,1); 
$galleryname = apply_filters('ngg_gallery_name', $galleryname); 
$nggpath = $defaultpath . $galleryname; 
$nggRoot = WINABSPATH . $defaultpath; 
$txt = '';

其中cn2pinyin是汉字转换为拼音的函数,位于cn2pinyin.php(新建此文件)中。
cn2pinyin.php
<?php 
/** 
* 
* 中文转换为拼音 
* 
*/ 
function cn2pinyin($_String, $_Code='gb2312') { 
$_DataKey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha" . 
"|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|" . 
"cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er" . 
"|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui" . 
"|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang" . 
"|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang" . 
"|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue" . 
"|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne" . 
"|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen" . 
"|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang" . 
"|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|" . 
"she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|" . 
"tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu" . 
"|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you" . 
"|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|" . 
"zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo"; 
$_DataValue = "-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990" . 
"|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725" . 
"|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263" . 
"|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003" . 
"|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697" . 
"|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211" . 
"|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922" . 
"|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468" . 
"|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664" . 
"|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407" . 
"|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959" . 
"|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652" . 
"|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369" . 
"|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128" . 
"|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914" . 
"|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645" . 
"|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149" . 
"|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087" . 
"|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658" . 
"|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340" . 
"|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888" . 
"|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585" . 
"|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847" . 
"|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055" . 
"|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780" . 
"|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274" . 
"|-10270|-10262|-10260|-10256|-10254"; 
$_TDataKey = explode('|', $_DataKey); 
$_TDataValue = explode('|', $_DataValue); 
$_Data = (PHP_VERSION >= '5.0') ? array_combine($_TDataKey, $_TDataValue) : _Array_Combine($_TDataKey, $_TDataValue); 
arsort($_Data); 
reset($_Data); 
if ($_Code != 'gb2312') 
$_String = _U2_Utf8_Gb($_String); 
$_Res = ''; 
for ($i = 0; $i < strlen($_String); $i++) { 
$_P = ord(substr($_String, $i, 1)); 
if ($_P > 160) { 
$_Q = ord(substr($_String, ++$i, 1)); 
$_P = $_P * 256 + $_Q - 65536; 
} 
$_Res .= _Pinyin($_P, $_Data); 
} 
return preg_replace("/[^a-z0-9]*/", '', $_Res); 
} 
function _Pinyin($_Num, $_Data) { 
if ($_Num > 0 && $_Num < 160) 
return chr($_Num); 
elseif ($_Num < -20319 || $_Num > -10247) 
return ''; 
else { 
foreach ($_Data as $k => $v) { 
if ($v <= $_Num) 
break; 
} 
return $k; 
} 
} 
function _U2_Utf8_Gb($_C) { 
$_String = ''; 
if ($_C < 0x80) 
$_String .= $_C; 
elseif ($_C < 0x800) { 
$_String .= chr(0xC0 | $_C >> 6); 
$_String .= chr(0x80 | $_C & 0x3F); 
} elseif ($_C < 0x10000) { 
$_String .= chr(0xE0 | $_C >> 12); 
$_String .= chr(0x80 | $_C >> 6 & 0x3F); 
$_String .= chr(0x80 | $_C & 0x3F); 
} elseif ($_C < 0x200000) { 
$_String .= chr(0xF0 | $_C >> 18); 
$_String .= chr(0x80 | $_C >> 12 & 0x3F); 
$_String .= chr(0x80 | $_C >> 6 & 0x3F); 
$_String .= chr(0x80 | $_C & 0x3F); 
} 
return iconv('UTF-8', 'GB2312', $_String); 
} 
function _Array_Combine($_Arr1, $_Arr2) { 
for ($i = 0; $i < count($_Arr1); $i++) 
$_Res[$_Arr1[$i]] = $_Arr2[$i]; 
return $_Res; 
} 
//用法: 
//第二个参数留空则为gb1232编码 
//echo cn2pinyin('中文测试'); 
//第二个参数随意设置则为utf-8编码 
//echo cn2pinyin('中文测试',1); 
?>

download cn2pinyin.php at: http://xiazai.3water.com/201012/yuanma/cn2pinyin.rar
另外,修改“新增图集”中的名称支持字符提示:
addgallery.php 中,Line:304
function tab_addgallery() { 
?> 
<!-- create gallery --> 
/// .... 
<?php _e('Create a new , empty gallery below the folder', 'nggallery') ;?> <strong><?php echo $this->defaultpath ?></strong><br /> 
<?php } ?> 
<i>(图集名称支持以下字符:中文、A-Z、a-z、0-9、-、_ ,中文将自动转换为拼音)</i></td> 
</tr> 
<?php do_action('ngg_add_new_gallery_form'); ?> 
</table> 
//... 
</form>
PHP 相关文章推荐
php设计模式 Decorator(装饰模式)
Jun 26 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
ThinkPHP表单自动提交验证实例教程
Jul 18 PHP
php将金额数字转化为中文大写
Jul 09 PHP
PHP函数func_num_args用法实例分析
Dec 07 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
Aug 12 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
服务器web工具 php环境下
Dec 29 #PHP
php cookie的操作实现代码(登录)
Dec 29 #PHP
PHP 图片文件上传实现代码
Dec 29 #PHP
php目录操作函数之获取目录与文件的类型
Dec 29 #PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
Dec 29 #PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 #PHP
php输出表格的实现代码(修正版)
Dec 29 #PHP
You might like
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
python3设计模式之简单工厂模式
2017/10/17 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
Python异常处理知识点总结
2019/02/18 Python
python tornado使用流生成图片的例子
2019/11/18 Python
python输出pdf文档的实例
2020/02/13 Python
简单的命令查看安装的python版本号
2020/08/28 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
教师学习培训邀请函
2014/02/04 职场文书
《钱学森》听课反思
2014/03/01 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
Nginx动静分离配置实现与说明
2022/04/07 Servers