使用WordPress的子主题功能修改你的WordPress主题

相信很多朋友使用的WordPress主题都经过了自己的一些修改,好不容易折腾好了,主题的升级版发布了,要不要升级呢?升级以后,还得重新再次修改?郁闷啊!

其实,你大可不必如此烦恼,使用Wordpress的子主题功能,一切问题都可以迎刃而解!

WordPress 子主题简介

WordPress子主题也是一个主题,它继承了另一个主题——父主题——的功能,并允许你对父主题的功能进行修改,或者添加新功能。

创建一个子主题是很简单的。创建一个目录,将格式编写正确的 style.css 文件放进去,一个子主题就做成了!

只需要对 HTML 和CSS 具有基本的了解,您就可以通过创建一个非常基本的子主题 来对一个父主题的样式和布局进行修改和扩展,而不需要对父主题的文件作任何修改。

通过这样的方式,当父主题被更新的时候,您所做的修改就可以保存下来。

因为这个原因,我们强烈推荐您使用子主题的方式来对主题进行修改。

如果您对PHP, WordPress Templates,和 WordPress Plugin API有个基本的理解,理论上来讲,您可以使用子主题对父主题的每一个方面进行扩展,而不需要对父主题的文件进行任何修改。

本文将说明如何创建一个基本的子主题并解释您能用它来干什么。本文将使用 WordPress 3.0 的默认主题 Twenty Ten 作为父主题进行举例说明。

目录结构

子主题放在wp-content/themes目录下属于自己的目录里。下面的结构显示的就是子主题和它的父主题(Twenty Ten)在典型的WordPress目录结构中的位置:

  • public_html
    • wp-content
      • themes (主题存放的目录)
        • twentyten (示例中父主题Twenty Ten的目录)
        • twentyten-child (子主题存放的目录,可以任意命名)
          • style.css (子主题中不可或缺的文件,文件名必需为 style.css)

这个文件夹里面可以少至只包含一个style.css文件,也可以包含多至一个完整WordPress主题所拥有的文件:

  1. style.css (必需)
  2. functions.php (可选)
  3. Template files (可选)
  4. Other files (可选)

让我们看看它们是如何起作用的。

必需的style.css文件

style.css是一个子主题唯一必须的文件。它的头部提供的信息让WordPress辨认出子主题,并且重写父主题中的style.css文件

对于任何WordPress主题,头部信息必须位于文件的顶端,唯一的区别就是子主题中的Template:行是必须的,因为它让WordPress知道子主题的父主题是什么。

下面是一个style.css文件的头部信息的示例:

逐行的简单解释:

  • Theme Name. (必需) 子主题的名称
  • Theme URI. (可选) 子主题的主页。
  • Description. (可选) 子主题的描述。比如:我的第一个子主题,真棒!
  • Author URI. (可选) 作者主页。
  • Author. (optional) 作者的名字。
  • Template. (必需) 父主题的目录名,区别大小写。 注意: 当你更改子主题名字时,要先换成别的主题。
  • Version. (可选) 子主题的版本。比如:0.1,1.0,等。

*/ 这个关闭标记的后面部分,就会按照一个常规的样式表文件一样生效,你可以把你想对WordPress应用的样式规则都写在它的后面。

要注意的是,子主题的样式表会替换父主题的样式表而生效。(事实上WordPress根本就不会载入父主题的样式表。)所以,如果你想简单地改变父主题中的一些样式和结构——而不是从头开始制作新主题——你必须明确的导入父主题的样式表,然后对它进行修改。

下面的例子告诉你如何使用@import规则完成这个。

一个子主题的范例

这个例子中的父主题是Twenty Ten,我们喜欢这个主题的几乎每个部分,除了网站标题的颜色,因为我想把它从黑色的改成绿色的。使用子主题的话,只用完成以下三个简单的步骤:

  1. wp-content/themes目录下创建一个新目录,并将它命名为twentyten-child(或其他你喜欢的名称)。
  2. 将下面的代码保存在名为style.css的文件里,并将它放到新建的这个文件夹。
  3. 到WordPress的控制台>主题,然后激活你的新主题:Twenty Ten Child。

下面一步步解释上面代码的作用:

  1. /* 开启子主题的头部信息。
  2. Theme Name: 子主题名称的声明。
  3. Description: 主题的描述(可选,也可被省略)。
  4. Author: 作者名字的声明(可选,也可被省略)。
  5. Template: 声明子主题的父主题,换言之,父主题所在的文件夹的名称,区分大小写。
  6. */子主题头部信息的关闭标记。
  7. @import规则将父主题的样式表调入
  8. #site-title a 定义网站标题的颜色(绿色),覆盖父主题中相同的样式规则。

注意 @import 规则

需要注意的是,@import 规则之前没有其他的CSS样式规则,如果你将其他的规则置于它之上,那么它将无效,并且父主题的样式表不会被导入。

使用 functions.php

不像style.css,子主题中的functions.php不会覆盖父主题中对应功能,而是将新的功能加入到父主题的functions.php中。(其实它会在父主题文件加载之前先载入。)

这样,子主题的functions.php提供了一个灵活稳定的方式来修改父主题的功能。如果你想在你的主题里加入一些PHP函数,最快的方式可能是打开functions.php文件然后加入进去。但那样并不灵活:下次你的主题升级更新了,你加入的新功能就会丢失掉。相反地,如果你使用子主题,将functions.php文件放进去,再将你想加入的功能写进这个文件里,那么这个功能同样会工作得很好,并且对于父主题以后的升级更新,子主题中加入的功能也不会受到影响。

functions.php文件的结构非常简单:将PHP起始标签置于顶部,关闭标签置于底部,它们之间就写上你自己的PHP函数。你可以写得很多,也可以写得很少,反正按你所需。下面的示例是一个基本的functions.php文件的写法,作用是将favicon链接加入到HTML页面的head元素里面。

给主题作者的提示。事实上子主题的functions.php首先加载意味着你的主题的用户功能可插入——即子主题是可替换的——通过有条件地进行声明。例如:

用这种方式,子主题可以替换父主题中的一个PHP函数,只需要简单地对它再次声明。

模板文件

模板文件 在子主题中的表现和style.css一样,它们会覆盖父主题中的相同文件。子主题可以覆盖任何父主题模板中的文件,只需要创建同名文件就行。(注意:index.php在WordPress3.0及以上版本才能被覆盖。)

同样,这项WordPress的功能允许你修改父主题的样式功能而不用去编辑父主题的文件,并且你的修改能让你在更新父主题后继续保留。

下面是一些使用模板文件的子主题的例子:

  • 增加一个父主题没有提供的模板(例如:网站地图页面的模板,或者一单栏页面,它们在页面编辑,模板选择里是可用的)
  • 增加一个比父模板更加具体的模板(见模板级别)。(例如:新加的tag.php模板用于按tag归档的文章来代替父主题中通常的archive.php模板。)
  • 替换父主题中的一个模板.(例:使用你自己的home.php来覆盖父主题中的home.php

其他文件

除 了style.css,functions.php,index.php和home.php,子主题可以使用任何正式主题使用的类型的文件,只要文件被正确链接。打个比方,你可以使用在样式表里或者Javascript文件里链接的图标、图片,或者从functions.php文件中调用出来的额外PHP文件。

引用链接


使用WordPress的子主题功能修改你的WordPress主题

保护wp-login.php后台登陆入口

最近在观察后台的登陆统计的时候,发现来自"乌克兰","美国"的某个IP的访问数量特别多,访问记录显示是大量访问登陆页面https://www.mobibrw.com/wp-login.php,明显是发生了密码破解攻击。

TopVisitors

login-recorders

本来以为WordPress 4.4版本已经对密码的访问次数进行了限制,结果试了一下,发现完全没有任何限制,很容易导致密码穷举攻击。比较简单的解决方法是对登陆页面进行密码尝试次数限制。

最方便的是安装Limit Login Attempts插件即可,这个插件很久不更新了。目前从测试来看,与WordPress 4.4版本是兼容的。

WordPress 4.4:禁用/关闭XML-RPC

最近网站的访问量统计发现,大量的访问请求来自第三方的国家,远远超过国内的访问量,主要是来自185.130.5.165这个IP的访问量严重的异常,怀疑是遭到了密码尝试攻击,跟踪日志:

发现如下记录大量重复出现:

由于我并不使用XML-RPC服务,因此考虑禁止对于xmlrpc.php的访问。

目前由于网站开启了.htacess的支持,因此,发现在.htacess中禁止文件访问是最高效的办法。

.htacess的文件尾部增加如下语句即可:

修改后的文件内容变更为:

然后重启Apache2即可。

然后就会发现访问http://www.mobibrw.com/xmlrpc.php的时候,直接返回了403禁止访问了。

参考链接:


wordpress:禁用/关闭XML-RPC
利用xmlrpc.php对WordPress进行暴力破解攻击

WordPress 4.4.2版本在设置固定链接后出现分类翻页异常(404)

为了配合WP Super Cache,必须对页面进行固定链接的设置,最初的设置是固定设置成/p=%post_id%的样子,如下图:
WordpressPermalinkSettingWrong

刚刚开始没发现异常,最近才发现,当一个分类的分页数量大于3页的时候,会出现打不开的情况。

当点击Android分类的时候,会发现文章分了11页,当点击第二页的时候,发现,链接地址中的"/"被替换成了"%2F",导致网页打不开,直接返回404,如下图的情况:

ReplaceBy%2F

搜索半天,用Ubuntu12.04下WordPress安装WP Super Cache后链接包含”%2F”导致分类链接返回404的方法总算是解决,本以为没问题了,结果当点击完成第二页,继续点击第三页的时候,继续出现无法访问,观察链接后,发现错的更离谱了。如下图:

ClickTheThirdPage

直接提示"该页无法显示"

URLInCorrect

仔细观察链接会发现,链接地址莫名的被增加了一段%2Fpage%2F2,明显是第二页的地址残留,于是手工去掉这个多余的信息,发现是可以正常访问的。

RemovedIncorrectUrl

这就比较扯淡了,说明是页面生成的时候发生了异常。应该是不能正确的处理链接地址中携带%2F这种转义字符的情况。

网上搜索很长世间,也没有任何的有用信息,结果重新修改了一下固定链接,修改成/%year%/%post_id%,结果一切正常了,由此可见,WordPress应该是只测试了一部分情况,只能处理固定格式的固定链接,随便修改会导致内部代码混乱。WordpressPermalinkSettingCorrect

如此修改后,链接地址中也不会出现"/"被替换成"%2F"的情况了。

Ubuntu12.04下WordPress安装WP Super Cache后链接包含”%2F”导致分类链接返回404

WordPress安装WP Super Cache后需要开启"固定链接",但是开启之后,发现在点击分类链接的时候,一旦出现多页,点击分页的时候返回404错误。
开始认为是重写规则设置得不对, 后来才发现, 是"%2F"导致Apache直接返回404错误.

比如浏览查看某个标签下的文章列表的链接为

被重写后的URL变为:

这样"/"被替换为"%2F",当这个请求到达Apache的时候,被Apache直接返回404错误。
Apache有一个配置项"AllowEncodedSlashes", 默认是"Off", 也就是不允许请求路径(上例是 %2Fandroid/page/2)中包含编码后的斜杠'/'(在某些平台是反斜杠'\'). 这个选项的的相应代码在mod_rewrite模块被执行之前:

默认不允许包含"%2F". 如果请求路径中包含了, 那么ap_unescape_url()函数认为是无效的路径, 直接返回HTTP_NOT_FOUND, 最终浏览器得到的是"404 - Not Found"出错页面.

Apache的配置文件中增加AllowEncodedSlashes On即可.如下:

参考链接


链接包含"%2F"导致mod_rewrite失效

大批WordPress网站被渗透 ,成为DDOS攻击源

1456369411312.jpg!small

近日,Sucuri的安全研究人员发现,数万WordPress站点被利用于实施第7层DDos攻击。共有两万六千个不同的WordPress站点持续向同一个网站以每秒一万到一万一千次的频率发送HTTPS请求,最多时能达到两万次每秒。更严重是,如果Pingback功能默认开启,全球任何一个WordPress站点都可能被利用,成为DDos攻击网络的一个源头。

HTTP Flood是针对Web服务在第七层协议发起的大规模流量攻击,不仅可以直接导致被攻击的Web前端响应缓慢,还间接攻击到后端的Java等业务层逻辑以及更后端的数据库服务,增大它们的压力,甚至对日志存储服务器都带来影响。

建议所有基于Wordpress的网站尽快禁用Pingback。虽然无法保证网站免于遭受攻击,但会终止黑客利用您的网站来攻击其它目标。

最好的做法是,如果你确定不用pingbacks,就和xmlrpc一并关闭。如果需要使用,可以简单修改.htaccess文件,只允许白名单中的IP来存取文件。流行插件Jetpack也可用于流量监控。

14562244766558.png!small

WordPress的pingback服务可被DDoS攻击利用,这个漏洞早有披露,但至今仍有大量网站存在此问题,原因在于网站所有者很少刻意防止网站被僵尸网络捕获。而由于这种DDoS攻击中流量来自数千个不同IP,基于网络的防火墙也无法识别和拦截,只能限制每个IP地址的访问频率。

1456224508906.png!small

研究人员还发现,大多数实施攻击的源网站托管在知名VPS/云服务提供商:亚马逊的AWS、Digital Ocean、谷歌云、微软的Azure、HETZNER、OVH和Linode。

原文地址:Thousands of WordPress websites used as a platform to launch DDOS

li 的点超出div

在Wordpress写文章的时候,发现列表项的数字总是在DIV标签的外面,如下所示

  1. 用户界面
  2. 视图导航
  3. 视图设置

HTML的源代码如下:

这种情况是非常不美观的,尤其是当DIV设置了背景色的时候。

网上查询了一下,发现list-style-position:inside是用来调整这种情况的。

语法:
list-style-position : outside |inside
取值:
outside :默认值。列表项目标记放置在文本以外,且环绕文本不根据标记对齐
inside :列表项目标记放置在文本以内,且环绕文本根据标记对齐
说明:
设置或检索作为对象的列表项标记如何根据文本排列。
假如一个列表项目的左外补丁(margin-left)被设置为 0 ,则列表项目标记不会被显示。左外补丁(margin-left)最小可以被设置为 30。
仅作用于具有display属性值等于list-item的对象。如li对象。
注意: ol对象和ul对象的type属性为其后的所有列表项目(如 li对象)指明列表属性。
此属性对于currentStyle对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为listStylePosition

 

因此修改上面的代码如下:

修改后的效果如下:

  1. 用户界面
  2. 视图导航
  3. 视图设置

解决WordPress标题中数字英文字符串不能自动换行的问题

在发表文章的时候,如果标题中有长串的数字和英文字符,例如文件的路径、注册表路径、下载地址等,通常不能自动换行,从而造成溢出的部分要么延伸到侧边栏中,要么被隐藏,这都是不正常的。如下图所示:
TitleTooLong

解决这个问题的方法就是要在CSS样式表中加入换行控制代码。

操作方法如下:

1.用FireFox中的Firebug查看页面中标题的源代码
EntryTitleSrc
可以看到,Title部分的标题的源代码对应的是entry-title,字体大小为h2

2.修改对应主题的样式表(style.css),以Twenty Fifteen为例,在外观->编辑->style.css,源代码中搜索entry-title可以发现比较多,如下两处:

我们增加word-wrap:break-word;word-break:break-all;告诉浏览器标题超长之后,主动换行,修改后的结果如下所示:

如此修改之后,如果使用了WP Super Cache,则需要刷新缓存,如果没有使用WP Super Cache则直接刷新页面就可以了。

修改后的页面如下所示:

word_wrap_break_word

注意,只设置word-wrap:break-word;就可以满足需求,建议同时设置word-break:break-all;,效果会更好一些。

对于手机端来说,标题是h1大小的。使用Chrome查看手机端的网页的源代码是view-source:www.mobibrw.com就可以看到手机网页的源代码了。

解决开启 WP Super Cache 缓存时 WP-Postviews 1.71 不计数的问题

WP Super Cache的缓存插件可以有效地对动态网页进行缓存,降低主机资源的使用率,使得网站更加稳定。但是,这个插件也会导致别的插件工作不正常,比如这个统计访问次数的WP PostViews插件。

说下 WP Super Cache 的原理吧,是把所有的页面转化成静态html,然后再通过30X定向,绕后php直接访问静态html来加速,在有新评论和新文章时会更新缓存,而 WP-Postviews 原理是每次访问给meta加1,启用cache后不调用php文件了,所以自然不会计数。于是插件的作者通过ajax来增加计数。

我们以WP PostViews 1.7.1为例。

在PostViews的设置页面中点击允许使用Ajax进行计数统计,如下图:

PostViewsOptions

然后重新生成下缓存,就OK了。

这时候每次点击的时候后台会更新显示数,但是前台不会更新,下面我们来解决这个问题。

可以通过AJAX和DOM操作来解决。把下面的代码添加到wp-postviews.php文件尾部

这段添加到postviews-cache.js文件尾部

默认的调用方法是:

现在替换为

或者

这时候我们发现,文章页是正常计数的而且实时刷新,但是首页还是不行啊,这个没办法了,不过可以通过设置WP Super Cache,不缓存首页,这样就完美解决问题了。

参考链接:


解决开启 WP Super Cache 缓存时 WP-Postviews 不计数的问题

Wodpress主题底部显示当前网站备案号

后台备案号的设置是从 WP 3.7 开始的,查看网站根目录的 wp-config.php 文件,一般会看到 define('WP_ZH_CN_ICP_NUM', true); 这个定义,这个就是用来添加后台备案号设置的。如果你的 WP 版本在 3.7 以上,而且 wp-config.php 含有define('WP_ZH_CN_ICP_NUM', true);  就可以在后台 设置 - 常规 中看到配置选项。

icp

这个“ICP备案号”仅对WordPress自带主题有效。

如果使用的是第三方WordPress主题,因此不能享受到 WordPress 这个新添加的小功能实在是让人窝火。不过好在你只需要在自己所用的主题的footer.php中添加一行代码,即可让在WordPress 后台添加的ICP备案号显示出来了。

如果你不希望链接到工信部网站,只添加下面的代码即可。


注意,由于工信部网站地址发生变动,导致上述操作之后,默认主题无法正常跳转到正确的工信部备案网站地址,需要对跳转地址进行修改具体修改方式请参考 解决WordPress 5.2.3后台ICP备案链接不能跳转到工信部网站(www.miitbeian.gov.cn)的问题