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实现验证码功能
Oct 09 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
php实现加减法验证码代码
Feb 14 PHP
Eclipse的PHP插件PHPEclipse安装和使用
Jul 20 PHP
PHP连接操作access数据库实例
Mar 30 PHP
PHP模拟QQ登录的方法
Jul 29 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
php日期操作技巧小结
Jun 25 PHP
PHP crc32()函数讲解
Feb 14 PHP
PHP中16个高危函数整理
Sep 19 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 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
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
python搜索指定目录的方法
2015/04/29 Python
Python简单实现enum功能的方法
2016/04/25 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
SQL SERVER面试资料
2013/03/30 面试题
应届生.NET方向面试题
2015/05/23 面试题
四年大学生活的个人自我评价
2013/12/11 职场文书
降消项目实施方案
2014/03/30 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
六一活动主持词
2015/06/30 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
Django 如何实现文件上传下载
2021/04/08 Python
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL