win2003+IIS6+PHP5.3.8 安装配置

其实网上的方法也正确,只是在注册PHP 到 FastCGI时内容不全。新版本的PHP5.3通过以往老方法已经不能在IIS上安装了(因为现在php 5.3已经不支持ISAPI了,而是用FastCGI了),现在给出在IIS上安装PHP5.3以后版本的教程。 首先肯定是安装IIS了,具体安装方法可查看:http://down.chinaz.com/server/201102/11_1.htm。 然后下载并安装IIS FastCGI,下载地址:http://www.iis.net/download/fastcgi。选择 x86或者download x86,下载下来名称为 fcgisetup_1.5_rtw_x86.msi。如下图0 安装成功后会在C:\WINDOWS\system32\inetsrv\目录下搞出了5个文件,如下图1 这个时候在IIS 6的"WEB服务扩展"里就多出了一个FastCGI Handler 2 再下载安装IIS下的PHP5.3.8,下载地址http://windows.php.net/download/,(注意IIS下要选择VC9的版本)解压到所需目录,该目录需要给予user读取运行权限。 下面是要配置和修改的内容:
  • 如果你的PHP5.3.8是安装版(即以.msi结尾的)安装完所有的软件就可以直接测试运行,安装过程中已经帮你配置完成。
  • 如果你的PHP5.3.8是压缩版(即以.zip结尾的)安装完后要作以下配置。
1、环境变量修改。我的电脑》属性》高级》环境变量》系统变量 Path=E:\PHP\;(加到最前面,如果没有可以自己建一个。) 2、FastCGI安装目录内的修改(注册PHP 到 FastCGI) 打开C:\WINDOWS\system32\inetsrv\fcgiext.ini文件,在文件最后加上下面的语句:
[Types](这个是文件原来就有的,在[Types]后面加上下面的语句就可以,要全部哦不然会报错的。)
php=PHP

[PHP]
ExePath=E:\PHP\php-cgi.exe
InstanceMaxRequests=10000
ActivityTimeout=600
RequestTimeout=600
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000,PHPRC:E:\PHP\
3、 PHP.ini的修改PHP5.3.8安装目录下是没有PHP.ini这个文件的,只有php.ini-development和php.ini- production,我们把php.ini-development改为php.ini(当然如果你怕有错可以先备份一下)。 注明: 首先建一个文件夹命名为TMP,位置随意我这里放在E:\PHP\tmp。 (upload_tmp_dir会用到,upload_tmp_dir是用来定义上传文件存放的临时路径,这里可以修改并给它定义一个绝对路径,同时需要 有读、写权限。)。用搜索(快捷键:Ctrl+F)的方式把下面的关键字改成现在的值:
short_open_tag = Off    (这个它本来默认就是这样我们就不要改了。)
把;upload_tmp_dir =改为upload_tmp_dir="E:\PHP\tmp"   
把;cgi.force_redirect = 1改为cgi.force_redirect=0      
把;fastcgi.impersonate = 1;改为 fastcgi.impersonate=1;       
把; extension_dir = "ext"改为extension_dir="E:\PHP\ext"   
把;date.timezone =改为date.timezone =PRC(如果不修改date.timezone,打开网页的时候蛮有可能提示500错误。也有人把值改为Asia/Shanghai,我没试过你们可以试试。)
在Windows Extensions中去除扩展前面的分号(;):
; extension=php_curl.dll
; extension=php_gd2.dll
; extension=php_ldap.dll
; extension=php_mbstring.dll
; extension=php_exif.dll
; extension=php_mysql.dll
; extension=php_mysqli.dll
; extension=php_sockets.dll
; extension=php_xmlrpc.dll
4.Internet信息服务(IIS)管理器的修改 1)网站》属性》主目录》配置》添加可执行文件=C:\WINDOWS\system32\inetsrv\fcgiext.dll。扩展名= .php。动作》限制为=GET,HEAD,POST。整个操作如图: 3 4 5 6 2)网站》属性》文档》添加默认内容=index.php。这里全部配置好了,一定要把IIS服务重启一下。 5、测试(一定要重启IIS服务)最后用文本写一段测试代码:
<?php
phpinfo();
>
保存为index.php,名字随便取只要后缀 是.php就可以。把index.php(你写的文件)放到根目录下,我这里是C:\Inetpub\wwwroot,然后在浏览器中输入 http://127.0.0.1/index.php或http://localhost/index.php(两者随便一个就可以效果一样)就可以得 到返回的信息了。返回的信息,如图:7

Wordpress Rewrite / Permalink内部过程分析

关于Query Vars 这是Wordpress全部代码中最重要的变量,所谓的query vars是一系列变量集合. WP通过解析URL设定query vars, 并通过分析query vars值决定显示那些文章,设定标志位等.所谓标志位是WP_Query类中一系列$is_xxx形式布尔成员变量,所有的is_xxx()形式 template tag实际上都是返回$wp_query里对应成员变量值.  举例而言,如果当前页面是单篇文章, 则p这个Query Var(以下简称变量)值不为空.(在WP类里空的query var根本不存在,而WP_Query类里如果对应name的query var没有设置,$wp_query->query_vars['varname']被填充为空值), 如果当前为搜索页, s变量值则为搜索关键字. 如果p和page两个变量都不为空值, 则当前为单篇文章分页页面, 依次类推. Query Vars在WP类($wp)里根据WP_Rewrite里的rewrite规则生成, 在WP_Query($wp_query)类里这些变量被用来建立主循环. WP和WP_Query类里都有query_vars成员变量,键值为query vars里的varname. 具体的query vars包括'm', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage'等公开变量,以及一些private变量. private变量不能由rewrite/GET等方式生成, 所以我们这里说的都指公开变量(public query vars) 准备知识:WP初始化过程: 基本过程是index.php  ->wp-blog.header.php ->wp-load.php . 通过wp-load.php 先后包含了wp-config.php, wp-setting.php,classes.php,fucntions.php query.php等文件,并建立了三个全局变量,$wp_the_query,$wp_rewrite和$wp ,分别为WP_Query,WP_Rewrite和WP类的实例,另外建立了一个$wp_query=&$wp_the_query, (之所以这样做是为了通过query_posts等方式新建自定义查询时不会损坏WP主循环,在自定义查询结束后可以调用wp_reset_query 把$wp_query还原为$wp_the-query引用). 然后,wp-blog-header执行wp()函数,并通过其调用$wp所属WP类的main方法,这个方法又调用一系列方法,但最重要的是 parse_request方法, WP从这里开始解析URL并建立主循环. 我们假设使用了友好的permalink,并且通过Apache下.htaccess实现. 那么 ,WP类的parse_request方法建立一个$request变量,这个变量值是$_SERVER['REUEST_URI'] 或$_SERVER['PATH_INFO']经过处理后的值, 是request_uri还是path_info取决于当前是否URL是否pathinfo类型请求. 处理过程包括,移除request_uri和path_info里?以后部分(即所有GET参数). 去除request url开始的/ ,  如果你WP安装在子目录(如wordpress/目录), 从(request_uri和pathinfo)开头去除wordpress/ , 去除末尾的'/' , 对request_uri进行rawurldecode等. ($_SERVER['PATH_INFO']的值已经是decode过的了,所以无需由wp处理).当一切完成后, $request就是一个规范化的当前请求filename, 形如 post-slug, date/YYYY/mm, tag/tag-slug之类 , 接下来,WP根据rewrite规则逐条对$request进行匹配(preg_match), 如果找到一个匹配, 建立相关的变量(query vars);如果没有任何匹配,则为404 所谓的Rewrite规则就是关联数组, 键值为用来匹配$request的正则表达式, 值为解析的变量, 如'([0-9]+)(/[0-9]+)?/?$' => 'index.php?p=$matches[1]&page=$matches[2]' 就是一条规则. 具体解析过程稍后会有介绍.在WP类里会调用$wp_rewrite的wp_rewrite_rules方法获取rewrite规则.注意Rewrite 规则有缓存的, 保存在数据库wp_option表,option name为rewrite_rules.如果数据库里这个option值为空,wp_rewrite_rules()会根据你的permalink structure重新生成rewrite规则, 并保存到数据库中.在后台更改永久链接结构时也会重新生成rewrite规则并保存到数据库中. 具体的过程,举例说明,如果你使用了 /%post_id% 形式的permalink, 当前URL是 http://domain.com/18. 解析出来的$request则是18 . WP对rewrite数组里每条规则$match用preg_match("!^$match!", $request, $matches)语句尝试匹配, 发现$request与 '([0-9]+)(/[0-9]+)?/?$' => 'index.php?p=$matches[1]&page=$matches[2]' 这条规则匹配, preg_match把 '18' 和空值保存到$matches数组里, 然后WP提取出匹配项值?后部分'p=$matches[1]&page=$matches[2]',对这个字符串$query执行 eval("@\$query = \"" . addslashes($query) . "\";");语句, 这句的目的是把$matches[1]替换为18, 把 $matches[2]替换为空. 所以$query值变为'p=671&page=', 然后执行parse_str($query, $perma_query_vars); 这样现在$perma_query_vars数组里就有键值'为p'和'page'的值.  但这还不是最终的query vars, 最终生成的query vars是$GLOBALS, $_POST, $GET和$perma_query_vars里键值为变量名项集合.依次判断. 如果 $_POST['varname']存在,则varname这个query var值为$_POST['varname'], 而不再继续判断$_GET['varname']和$perma_query_vars['varname']是否存在, 如此类推. 最后生成的query vars保存在 $wp->query_vars里. 如果使用的是默认的/?p=123 permalink形式,那么上面过程简单的多,只会从$GLOBALS, $_POST, $GET里提取query vars变量值,而不会解析REQUEST_URI和PATH_INFO. 上面过程完成后会执行parse_request这个Action,然后执行$wp的query_posts方法,这个方法 把$wp->query_vars传给$wp_the_query的query方法,开始建立主循环,设定标志位(is_home, is_page ...)等.接下来就是载入模板显示页面内容了. 下面分析一些问题: 1. 假设permalink设置为/%post_id%, 数据库中有id为 10和11的两篇文章, 访问http://domain.com/10/?p=11 ,显示什么内容?- - 答案是会显示id为11的文章,因为上面说的, $_GET里变量优先级高于rewrite rules里解析出来的变量($perma_query_vars),所以最后的p变量值为11.但这时WP通常会把当前页重定向到http://domain.com/11, 因为WP有canoninol机制(wp-includes/canonical.php),能够301重定向一些不规范地址到规范url, 典型的如把其他域名重定向到后台HOME和SITEURL里设定的域名里页面.但WP的canonical机制并不完善, 个人推荐使用permalink validator插件,这个插件判断当前URL与官方URL是否完全匹配,如果不匹配要么重定向,要么set 404,.. 2. 假设permalink设置为/%post_name%, 访问http://domain.com/index.php/%post_name%结果如何? 如果对应slug的post存在的话, 不会是404. 因为虽然你permalink没有设置为index.php形式的path info permalink,但如上面所说,WP在解析URL时并不判断后台设定的永久链接结构是path info还是request uri类型或者甚至是默认/?p=123类型. 不过这时通常会重定向到http://domain.com/%post_name% , 同样因为canonical机制. 3. 关于URL末尾的 '/' URL末尾是否有/对rewrite没有影响, 如上所述, WP类在生成$request时会去除requset_uri和path_info末尾/ ,另外,你注意到所有WP生成的rewrite规则, 键值正则式的末尾均为  /?$ ,表示URL末尾可选 / .  不过wp会判断当前URL末尾是否有/ 以及后台设置的permalink末尾是否有/, 如果不一致则301重定向, 还是因为canonical代码. 请注意WP的 canonical代码在template_redirect这个action处执行,这时WP实际上已经解析完query vars, 主循环也设置好了, 即将载入模板.. 4. 假设permalink设置为/%post_name%,数据库里两个有slug都为'about'的post和page,访问http://domain.com/about, 显示哪个? 这种情况由rewrite规则数组顺序决定, 通常wp生成的rewrite规则里 '(.+?)(/[0-9]+)?/?$' => 'index.php?pagename=$matches[1]&page=$matches[2]' 这条规则是最后一个, 所以这时会显示post而不是page. 5. 有人使用"古怪"的permalink结构,如/?p=%post_id%.html, 然后发现所有分类/tag页全部显示最新文章= = 原因是在这种古怪的permalink结构下,WP根本无法正确获取query vars变量,无论从GET还是url rewrite,因为如上面所说,wp rewrite 的第一步就是去除request_uri和path_info里?以后部分.事实上在这种情况下单篇文章页能够正常显示也仅仅因为有一个通过GET传递的 p变量,值为 18.html这样形式,然后php 的 (int) 或intval() 把它变成了18 = = 6 .关于Verbose rewrite 以Apache为例,wp默认生成的.htaccess里mod_rewrite规则非常简单:
  1. # BEGIN WordPress
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase /
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7. RewriteRule . /index.php [L]
  8. </IfModule>
  9. # END WordPress
复制代码
如果当前请求不为文件或目录,把URL请求里第一个字符重写到index.php并停止继续rewrite.然后WP会通过request_uri 或path_info解析query vars, 如上面所述.  WP还提供一种non verbose rewrite rules, 但并没有提供前台接口. 在wp-include/rewrite.php里把WP_Rewrite里var $use_verbose_rules = true; 这句赋值改为false, 后台重新保存一下permalink,你会发现.htaccess里内容已经变了:
  1. # BEGIN WordPress
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase /
  5. RewriteCond %{REQUEST_FILENAME} -f [OR]
  6. RewriteCond %{REQUEST_FILENAME} -d
  7. RewriteRule ^robots\.txt$ /index.php?robots=1 [QSA,L]
  8. RewriteRule ^.*wp-atom.php$ /index.php?feed=atom [QSA,L]
  9. RewriteRule ^.*wp-rdf.php$ /index.php?feed=rdf [QSA,L]
  10. RewriteRule ^.*wp-rss.php$ /index.php?feed=rss [QSA,L]
  11. RewriteRule ^.*wp-rss2.php$ /index.php?feed=rss2 [QSA,L]
  12. RewriteRule ^.*wp-feed.php$ /index.php?feed=feed [QSA,L]
  13. RewriteRule ^.*wp-commentsrss2.php$ /index.php?feed=rss2&withcomments=1 [QSA,L]
  14. RewriteRule ^feed/(feed|rdf|rss|rss2|atom)/?$ /index.php?&feed=$1 [QSA,L]
  15. RewriteRule ^(feed|rdf|rss|rss2|atom)/?$ /index.php?&feed=$1 [QSA,L]
  16. .....
  17. RewriteRule ^(.+)/page/?([0-9]{1,})/?$ /index.php?pagename=$1&paged=$2 [QSA,L]
  18. RewriteRule ^(.+)/comment-page-([0-9]{1,})/?$ /index.php?pagename=$1&cpage=$2 [QSA,L]
  19. RewriteRule ^(.+)(/[0-9]+)?/?$ /index.php?pagename=$1&page=$2 [QSA,L]
  20. </IfModule>
  21. # END WordPress
你可能对这种rewrite规则更为熟悉,国内的程序基本上都是用这种Rewrite. 请注意这时WP的内部过程完全不同. 在这种情况下, WP 的query vars值均来源于$_GET (Apache直接rewrite生成的), 但Request_uri或Path_Info仍会被解析并且生成的$perma_query_vars完全正确,! 只是不会被用于query vars而已. 因为$_GET优先级高于对url rewrite获得的值. 有人在windows下IIS的httpd.ini里加入rewrite规则,后台permalink设置为默认后rewrite后友好地址仍可以访问, 就是这个原因. 如果你能看懂(或早已知道)上面内容, 那么, 我相信对所有关于Wordpress rewrite/permalink方面的问题,你都能够解决,或者至少找到思路.至少,我是这样的.XT.

WordPress 后台TinyMCE 编辑器增强技巧大全

今天再补充一些 TinyMCE 编辑器增强技巧,希望能尽可能满足你自己的折腾需求。

更改编辑器默认视图为HTML

大家都知道,在后台新建文章后,编辑器就自动跳转到“可视化”视图,对于一些经常要插入代码或者WEB设计者们来说,可能更习惯使用HTML视图手动编辑。 设置方法:将以下代码添加到主题的functions.php文件里即可:
add_filter('wp_default_editor', create_function('', 'return "html";'));

添加编辑器默认内容(编辑器内可见)

新 建文章后编辑器里的内容默认是空的,有些朋友做的是WordPress主题站、插件站或单纯的下载站,一些标准的格式化的文章每次都会输入“主题名称”、 “主题作者”、“下载地址”等内容,添加默认内容之后,这些重复性的工作以后再也不用了,一切都预定义好了。而且如果发表文章不需要这些预定义的内容,只 需要全选-Delete就ok了,并不会很麻烦。 设置方法:在主题functions.php文件添加以下代码即可:
function insertPreContent($content) {
        if(!is_feed() && !is_home()) {
 $content.= "这里的预定义内容在编辑器可见";
        }
        return $content;
}
add_filter ('default_content', 'insertPreContent');

添加编辑器默认内容(编辑时不可见)

此方法添加的内容在发布文章时自动添加在内容的最后,在编辑的时候是看不见的,用于添加订阅、文章版权信息等等。 设置方法:在主题functions.php文件添加以下代码即可:
function insertFootNote($content) {
        if(!is_feed() && !is_home()) {
 $content.= "这里的预定义内容在编辑器不可见";
        }
        return $content;
}
add_filter ('the_content', 'insertFootNote');

添加更多的HTML标签

此功能请慎用,因为WordPress自带的TinyMCE编辑器会默认过滤掉不符合XHTML 1.0中的html标签,如<br />、<iframe>等。但不排除某些情况下也可能会用到这些标签,所以把方法放出来供大家参考吧。 添加方法:将以下代码粘贴到主题的functions.php文件里即可:
function fb_change_mce_options($initArray) {
$ext = 'pre[id|name|class|style],iframe[align|longdesc|
name|width|height|frameborder|scrolling|marginheight|
marginwidth|src]';  //注意:格式为“标签一[属性一|属性二],标签二[属性一|属性二|属性三]”
if ( isset( $initArray['extended_valid_elements'] ) ) {
$initArray['extended_valid_elements'] .= ',' . $ext;
} else {
$initArray['extended_valid_elements'] = $ext;
}
return $initArray;
}
add_filter('tiny_mce_before_init', 'fb_change_mce_options');
WordPress自带编辑器的强大往往被人忽略,很大程度上就是其隐藏的编辑按钮默认情况下没有被显示出来而已。 完整的编辑器其实包含这些功能:
加 粗(bold)、斜体(italic)、下划线(underline)、删除线(strikethrough)、左对齐(justifyleft)、居中 (justifycenter)、右对齐(justfyright)、两端对齐(justfyfull)、无序列表(bullist)、编号列表 (numlist)、减少缩进(outdent)、缩进(indent)、剪切(cut)、复制(copy)、粘贴(paste)、撤销(undo)、重 做(redo)、插入超链接(link)、取消超链接(unlink)、插入图片(image)、清除格式(removeformat)、帮助 (wp_help)、打开HTML代码编辑器(code)、水平线(hr)、清除冗余代码(cleanup)、格式选择(formmatselect)、 字体选择(fontselect)、字号选择(fontsizeselect)、样式选择(styleselect)、上标(sub)、下标(sup)、 字体颜色(forecolor)、字体背景色(backcolor)、特殊符号(charmap)、隐藏按钮显示开关(wp_adv)、隐藏按钮区起始部 分(wp_adv_start)、隐藏按钮区结束部分(wp_adv_end)、锚文本(anchor)、新建文本(类似于清空文本) (newdocument)、插入more标签(wp_more)、插入分页标签(wp_page)、拼写检查(spellchecker)。
下面就把这些功能调出来吧!效果图: wpdaxue.com-201301317 调用方式:将以下代码添加到主题functions.php文件里即可:
function enable_more_buttons($buttons) {
$buttons[] = 'hr';
$buttons[] = 'fontselect';
$buttons[] = 'sup';
$buttons[] = 'del';
$buttons[] = 'fontselect';
$buttons[] = 'cleanup';
$buttons[] = 'styleselect';

// 更多按钮自行添加吧...

return $buttons;
}
add_filter("mce_buttons", "enable_more_buttons"); //默认将新添加的按钮追加在工具栏的第一行
//add_filter("mce_buttons_2", "enable_more_buttons");  //添加到工具栏的第二行
//add_filter("mce_buttons_3", "enable_more_buttons");  //添加到工具栏的第三行

让编辑器支持中文拼写检查

WordPress自带TinyMCE编辑器默认对英文拼写进行检查,怎么样才能让其支持中文拼写检查呢? 设置方法:在主题的functions.php文件里添加如下代码即可:
function fb_mce_external_languages($initArray){
$initArray['spellchecker_languages'] = '+Chinese=zh,
English=en';

return $initArray;
}
add_filter('tiny_mce_before_init', 'fb_mce_external_languages');

简单添加自定义按钮

如果你使用了 WordPress3.0以上的版本,可以用以下方法快捷方便的在后台HTML编辑器中加入自定义按钮。 步骤一:首先创建一个js文件,粘贴如下代码并保存为my_quicktags.js文件:
QTags.addButton( 'hr', 'hr', 'n<hr />n', '' ); //快捷输入一个hr横线,点一下即可
QTags.addButton( 'h1', 'h1', 'n<h1>', '</h1>n' ); //快捷输入h1标签
//QTags.addButton( 'my_id', 'my button', 'n', 'n' );
//这儿共有四对引号,分别是按钮的ID、显示名、点一下输入内容、再点一下关闭内容(此为空则一次输入全部内容),n表示换行。
步骤二:把刚才写好的my_quicktags.js放在主题文件夹,再在主题 functions.php 中加入代码:
add_action('admin_print_scripts', 'my_quicktags');
function my_quicktags() {
    wp_enqueue_script(
        'my_quicktags',
        get_stylesheet_directory_uri().'/my_quicktags.js',
        array('quicktags')
    );
    }
关于quicktags的更多参数(比如 按钮的提示),你可以查看 http://codex.wordpress.org/Quicktags_API

如何自定义WordPress的 后台登录页面(Logo/链接/文本)

出于个性化要求,你可能需要自定义WordPress的登录页面的显示效果。貌似有不少这方面的WordPress插件,但是我们完全没有必要安装插件,只需要简单的添加一些代码即可。

方法概要

通过WordPress内置的挂钩(Hook),在主题的 functions.php 添加一些简单的代码,即可完成自定义修改,所有的操作都不需要修改WordPress核心文件,即使升级WordPress版本,也不会丢失效果。
注:下文提到的所有代码,都是添加到主题的 funshions.php 文件的最后一个 ?> 的前面。

自定义Logo图片

制作一个名为 login_logo.png 的图片,放在主题下的images文件夹里(也可以根据自己的实际修改,只要下面的代码引用的Logo地址正确即可)。
//自定义登录页面的LOGO图片
function my_custom_login_logo() {
    echo '<style type="text/css">
        h1 a { background-image:url('.get_bloginfo('template_directory').'/images/logo.png) !important; }
    </style>';
}
add_action('login_head', 'my_custom_login_logo');

自定义Logo链接

将Logo的链接改为网站首页链接:
//自定义登录页面的LOGO链接为首页链接
add_filter('login_headerurl', create_function(false,"return get_bloginfo('url');"));
将Logo的链接改为任意链接:
//自定义登录界面LOGO链接为任意链接
function custom_loginlogo_url($url) {
	return 'http://www.frankway.net'; //修改URL地址
}
add_filter( 'login_headerurl', 'custom_loginlogo_url' );

自定义Logo提示信息(tltle)

自定义为网站名称:
//自定义登录页面的LOGO提示为网站名称
add_filter('login_headertitle', create_function(false,"return get_bloginfo('name');"));
自定义为其他任何文本:
//自定义登录页面LOGO提示为任意文本
function custom_loginlogo_desc($url) {
    return 'WordPress大学'; //修改文本信息
}
add_filter( 'login_headertitle', 'custom_loginlogo_desc' );

自定义登录框内容

//在登录框添加额外的信息
function custom_login_message() {
    echo '<p>欢迎来到'.get_bloginfo('name').',请登录后下载本站资源</p><br />';
}
add_action('login_form', 'custom_login_message');

自定义底部内容

//自定义底部信息
function custom_html() {
    echo '<p style="text-align:center">© ' . get_bloginfo(url).'</p>';
}
add_action('login_footer', 'custom_html');

自定义CSS

要更加灵活地修改登录页面的显示样式,建议添加一个自定义的CSS文件,然后查看登录页面的源代码的html结构,撰写自己的CSS样式。你可以使用下面的代码引入自己的CSS,注意修改代码中的css地址,以下调用的是主题根目录下的login_style.css:
//添加自定义CSS
function custom_login() {
    echo '<link rel="stylesheet" type="text/css" href="' . get_bloginfo('template_directory') . '/login_style.css" />';
}
add_action('login_head', 'custom_login');

本文小结

通过WordPress的挂钩(hook),可以做很多自定义修改,不仅仅是登录页面哦。对于WordPress主题或插件开发者来说,掌握WordPress的各种挂钩,你就可以很自由地自定义WordPress啦!

自定义 WordPress 后台底部的版权和版本信息

WordPress 后台底部默认会显示WordPress版本信息和版本号,如果你运维一个多用户网站,并且其他用户可以访问后台,那么你可以自定义这些信息,隐藏版本号等。只要将下面的代码添加到主题的 functions.php 即可:
/**
 * 自定义 WordPress 后台底部的版权和版本信息
 * http://www.wpdaxue.com/change-admin-footer-text.html
 */
add_filter('admin_footer_text', 'left_admin_footer_text'); 
function left_admin_footer_text($text) {
	// 左边信息
	$text = '<span id="footer-thankyou">感谢使用<a href="http://cn.wordpress.org/">WordPress</a>进行创作</span>'; 
	return $text;
}
add_filter('update_footer', 'right_admin_footer_text', 11); 
function right_admin_footer_text($text) {
	// 右边信息
	$text = "3.6.1版本";
	return $text;
}
请根据自己的实际需要,修改代码中的文本内容。

精简WordPress后台

详细的level在wp-admin/menu.php中可以看到 下面的实例是去掉评论菜单,编辑主题function.php加入代码就可以实现。
function remove_menu() {
global $menu;
//移除评论主菜单
unset($menu[25]);
}
add_action('admin_head', 'remove_menu');

function remove_submenu() {
global $submenu;
//移除主题二级菜单
unset($submenu['themes.php'][10]);
}
add_action('admin_head', 'remove_submenu');

精简WordPress工具条

下面这段代码写入function.php之后,你会发现工具条变成了空的,只剩下黑条,删除其中要保留的代码即可。
function my_edit_toolbar($wp_toolbar) {
	$wp_toolbar->remove_node('wp-logo'); //去掉Wordpress LOGO
	$wp_toolbar->remove_node('site-name'); //去掉网站名称
	$wp_toolbar->remove_node('updates'); //去掉更新提醒
	$wp_toolbar->remove_node('comments'); //去掉评论提醒
	$wp_toolbar->remove_node('new-content'); //去掉新建文件
	$wp_toolbar->remove_node('top-secondary'); //用户信息
}

add_action('admin_bar_menu', 'my_edit_toolbar', 999);
修改底部文字 在wordpress管理后台中底部,有一块空白的地方,在这里其实可以使用函数添加一些你想要的文字。 比如可以做一个功能强大的通知区域。 把下面的代码复制到主题functions.php文件中,
<?php
function example_footer_admin () {
echo '<p style="color:red;">这就是我想要显示的文字</p>';
}
add_filter('admin_footer_text', 'example_footer_admin');
?>
参考资料:http://www.catswhocode.com/blog/snippets/custom-footer-text-in-wordpress-dashboard

WordPress附件函数总结

WordPress附件可以是图片、视频、文本文件等类型,但大部分附件函数都是针对图片的,本文总结了常用的附件函数使用方法。

wp_get_attachment_image_src()

<?php wp_get_attachment_image_src( $attachment_id, $size, $icon ); ?>
用于图片类附件时,根据附件id和指定的尺寸($size,默认是thumbnail)获取图片的url、width、height,以数组形式返回结果,数组形式如下
Array
(
    [0] => 图片url
    [1] => 图片宽度width
    [2] => 图片高度 height
    [3] =>  $is_intermediate的值 //true表示返回了缩放后的图片,false表示返回了原始图片
)
关于$is_intermediate参考http://codex.wordpress.org/Function_Reference/image_downsize 关于第三个参数$icon 如果要获取的附件不是一张图片,而是,比如说视频,让$icon为真可以返回代表视频(mime type:video)的图标,否则只能返回空值。这些代表不同mime type的图片在wordpress wp-includes/images/crystal目录下

wp_get_attachment_image()

<?php wp_get_attachment_image( $attachment_id, $size, $icon, $attr ); ?>
用于图片类附件时,根据附件ID和指定的尺寸($size,默认是thumbnail)返回完整的img标签,属性包括宽度、高度、alt等。 如果是非图片类附件,$icon为true时返回代表该附件类型的图片,具体参考上面图片的说明。 关于第四个参数$attr 这个参数可以给图片标签增加更多的属性,属性用数组来指定,例如给图片增加一个title属性
wp_get_attachment_image(
    $attachment_id,
    'thumbnail',
    false,
    array('title'=>'图片标题')
 );

wp_get_attachment_url()

<?php wp_get_attachment_url( $attachment_id ); ?>
获取附件的url 例如:
echo wp_get_attachment_url( 1 );
//返回
http://www.solagirl.net/wp-content/uploads/2012/12/image.jpg

wp_get_attachment_link()

<?php wp_get_attachment_link( $id, $size, $permalink, $icon, $text ); ?>
以超链接形式返回附件,链接包括: 如果是图片,以img标签形式返回某个尺寸的图片 如果不是图片,且$icon为true,以img标签形式返回代表该类型文件的图标 如果不是图片,且$icon为false,返回附件标题 由$text指定的文字 例如:
echo wp_get_attachment_link( 1 );
//输出
<a title="图片标题" href="http://www.solagirl.net/wp-content/uploads/2012/12/image.jpg">
    <img width="150" height="150" alt="misuzu-air" class="attachment-thumbnail"
    src="http://www.solagirl.net/wp-content/uploads/2012/12/image.jpg">
</a>
如果指定了$te xt参数,则图片将被替换成文字。

the_attachment_link()

<?php the_attachment_link( $id, $fullsize, $deprecated, $permalink ); ?>
以超链接形式打印附件,与wp_get_attachment_link()基本类似,前者直接输出结果,后者返回结果。 第二个参数不太一样,$fullsize是布尔值,只能选择true or false,表示是使用原始图片(true)还是使用WordPress产生的缩略图(false)。

get_attachment_link()

<?php $attachment_page = get_attachment_link($attachment_id); ?>
以字符串形式返回专门用于显示该附件的页面的url,这个页面的模版通常是attachment.php。 与wp_get_attachment_url()的区别,后者以超链接形式返回附件的真实路径。

wp_get_attachment_metadata()

<?php wp_get_attachment_metadata( $attachment_id, $unfiltered ); ?>
获取图片类附件的meta信息,附件与post一样存储在wp_posts表中,只是类型不同。attachment meta与post meta类似,存储了有关该附件的全部信息。attachment meta可以告诉我们: 图片的宽度、高度、原始文件路径, 图片会根据多媒体设定生成其它尺寸,这些不同尺寸的宽高等信息 包括图片本身的信息,例如copyright、iso等

wp_get_attachment_thumb_url()

<?php wp_get_attachment_thumb_url( $attachment_id ); ?>
获取附件图像的缩略图url 缩略图尺寸在多媒体中设置(缩略图大小一项),上传图片时会自动产生缩略图。

wp_get_attachment_thumb_file()

<?php wp_get_attachment_thumb_file( $attachment_id ); ?>
此函数和上面那位很像,唯一的区别是它返回的是附件缩略图的绝对路径,例如 /home/user/www/wp-content/uploads/2012/12/image-150x150.jpg 在使用这个函数时,发现无法正常返回结果,修复的方法是找到这个函数,修改成下面这样 函数位于wp-includes/post.php line 4234 将
if ( !empty($imagedata['thumb']) && ($thumbfile = str_replace(basename($file), $imagedata['thumb'], $file)) && file_exists($thumbfile) )

return apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID );
替换成
if ( !empty($imagedata['sizes']['thumbnail']['file']) && ($thumbfile = str_replace(basename($file), $imagedata['sizes']['thumbnail']['file'], $file)) && file_exists($thumbfile) )

return apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID );

WordPress 删除后台仪表盘无用模块

 

一、无需代码,后台隐藏不必要的模块

因为不同的用户有不同的喜好,这种情况下,我们不需要通过代码彻底删除模块,只需要将不需要的模块隐藏即可,其实方法很简单,在控制板页面右上角有个“显示选项”按钮,点击可以弹出如下图所示的选项,你可以根据需要去除不需要的模块,当然也可以根据需要设定页面分栏数目。 123
注:以上后台设置只对当前用户有效,也就是说“控制面板”的模块在不同的注册用户之间不会相互影响。

二、增加代码,彻底删除后台不必要的模块

本教程讲解的是企业网站定制,应该根据企业网站的性质来去掉WordPress的特性,因此,在这里,我们需要彻底删除一些“控制面板”中的模块,这样子任何注册用户都无法看到该模块。彻底删除后台不必要模块的操作也很简单,你只需要在主题的functions.php中添加以下代码即可(请根据代码注释,自行修改): <pre>
function example_remove_dashboard_widgets() {
    // Globalize the metaboxes array, this holds all the widgets for wp-admin
    global $wp_meta_boxes;

    // 以下这一行代码将删除 "快速发布" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);

    // 以下这一行代码将删除 "引入链接" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);

    // 以下这一行代码将删除 "插件" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);

    // 以下这一行代码将删除 "近期评论" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);

    // 以下这一行代码将删除 "近期草稿" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);

    // 以下这一行代码将删除 "WordPress 开发日志" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);

    // 以下这一行代码将删除 "其它 WordPress 新闻" 模块
    unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);

    // 以下这一行代码将删除 "概况" 模块
    unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);
}
add_action('wp_dashboard_setup', 'example_remove_dashboard_widgets' );
</pre>
WordPress企业网站定制教程的第四篇文章到此为止,此前几篇文章均是教给大家如何删除WordPress后台不需要的模块或菜单,希望大家通过练习已经掌握了相应的技巧并实现需要的功能。至于如何添加自定义模块或菜单,偶米工作室将在接下来的教程中给大家一一讲述。

WordPress后台删除不需要的侧边栏菜单

自定义后台的侧边栏菜单 首先让我们看看,什么是后台的侧边栏菜单:

16442242P-0

上图就是使用管理员账号登陆后看到的侧边栏所有的菜单项,WordPress给不同角色的用户定义了不同功能的使用权限,所以不同角色的用户后台所看到侧边栏菜单项都是不一样的。这个时候需求又来了,有些时候即使是管理员,部分菜单也是用不到了,例如用WordPress来建一个企业介绍性的网站,该站点根本没有添加评论功能,那么侧边栏的评论菜单是用不着的,如果让企业用户看到,他们会感到很迷惑。所以最好的办法是,根据实际情况,把不该有的侧边栏管理菜单删掉。具体实现办法是在当前主题的functions.php中添加以下代码:
<?php

function remove_menus() {
global $menu;
$restricted = array(__('Dashboard'), __('Posts'), __('Media'), __('Links'), __('Pages'), __('Appearance'), __('Tools'), __('Users'), __('Settings'), __('Comments'), __('Plugins'));
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
}
}
// 删除左侧菜单
add_action('admin_menu', 'remove_menus');

?>
自定义要去除的菜单 以上代码核心部分是一个函数remove_menus(),然后通过WordPress的动作接口函数add_action来执行remove_menus函数。在remove_menus函数中,通过$restricted数组来定义需要删除哪些菜单项,以上$restricted数组提供了全部菜单项,也就是说如果你全部将以上代码不做修改地复制到functions.php,那你的WordPress后台就没有任何菜单了,你应该根据实际需要去除菜单,下面讲讲$restricted各个数组项对应的菜单: __(&apos;Dashboard&apos;) : 控制板菜单 __(&apos;Posts&apos;) : 文章 __(&apos;Media&apos;) : 媒体 __(&apos;Links&apos;) : 链接 __(&apos;Pages&apos;) : 页面 __(&apos;Comments&apos;) : 评论 __(&apos;Appearance&apos;) : 外观 __(&apos;Plugins&apos;) : 插件 __(&apos;Users&apos;) : 用户 __(&apos;Tools&apos;) : 工具 __(&apos;Settings&apos;) : 设置 例如你只想去除评论和工具菜单,你只需改写以上代码第3行的$restricted数组:
<?php

$restricted = array(__('Comments'), __('Tools'));

?>
根据用户角色去除菜单 如果你想按用户角色来去除相应的侧边栏菜单,那就再做一下用户等级的判断就可以了,给第11行的add_action添加判断,改写成:
<?php

function remove_menus() {
global $menu;

// 这里$restricted设置了评论和工具菜单
$restricted = array(__('Comments'), __('Tools'));
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
}
}

global $current_user;
get_currentuserinfo();

//如果当前用户的等级小于3,那么就删除对应的菜单
if ($current_user->user_level < 3)
{
add_action('admin_menu', 'remove_menus');
}

?>
在WordPress后台 – 用户那里,管理员可以查看 / 编辑用户的角色,以下是用户角色和其等级的对应关系:
  • 0 级对应 订阅者
  • 1 级对应 投稿者
  • 2 – 4 级对应 作者
  • 5 – 7 级对应 编辑
  • 8 – 10 级对应 管理员
更多的WordPress菜单项设置,请阅读以下文章(英文): Remove WordPress Admin Menu Without Affecting WordPress Core System

wordpress判断是否首页的if(is_home())不起作用?

利用is_home()判断是否为首页,如果不起作用,大致有如下两个常见原因: 第一种: 当你的首页不是默认的index.php的时候,而是在后台指定了一个page页面。这种情况下is_home()会失效,也就是说这样子的情况下就不能再用is_home()来判断。 is_front_page()是判断当前页是不是指定的首页,我们在上面描述的情况下需要的就是这个函数。 [php] <?php if (is_home() || is_front_page()) { ?> 我只会在首页显示 <?php }?> [/php] ps:我在使用多站点wordpress进行二次开发时,需要所有的站点均指定一个page作为首页来显示;而且,该page作为首页显示时,页头还要显示一个banner图片。这就需要对所有theme主题的page.php文件内使用上述代码以判断是否首页。 第二种: 如果is_home()之前有个 query_posts(),则会让它本身判断失效。原因是 is_home() 函数在首页的时候会返回一个 true 来判断,而 query_posts()会阻断这一判断。 解决方案是在 is_home()之前加一个 wp_reset_query()。 [php] <php wp_reset_query(); if ( is_home() ) { ?> 我只会在首页显示 <php } ?> [/php]