code人生 · 2014 年 12 月 8 日 2

用WordPress子主题解决主题升级问题

现在在用的是一个国外开发者制作的主题,升级频率还是蛮快的,但是一直都忍住不升级,为什么?因为每次升级之后都得手动调整代码才能够恢复现在的外观。众所周知,因为字体问题,国外的主题直接拿到国内来用是非常不适合的,特别是字体大小,对于英文字体来说,大号字体做标题不会有什么突兀的感觉,但是一旦变成汉字之后,尤其是国内的众多XP系统默认的宋体字,麻烦就来了。

因为WordPress的主题升级是直接替换所有文件的,以往所有对于主题的修改都失效了,必须重新添加才行,然后问题又来了:我怎么记得那些文件是修改过的、样式表里添加了什么文件?当然呐,如果你舍得折腾,你可以在每次主题升级之前打包备份,然后将主题文件和升级后的主题文件对比,用编辑器的diff工具(大部分编辑器都支持)对比一下异同,然后就知道应该添加什么,应该修改什么了。但是这种方法总是太过耗费时间,每次升级之后都得更改,所以我还是按照过去折腾官方主题的方法,用子主题的形式来增添和删改样式表,或者增加函数来增强功能。下面就说一下大概的思路和WordPress的子主题机制。

WordPress对于子主题的要求是很松的,没有太多的限制,你可以很随意地使用,但是有几条框框还是要遵守的。第一,子主题里面必须要有一个style.css文件,作为子主题的样式表,哪怕这个样式表是空的都行,WordPress只是要求子主题至少要有一个文件,毕竟子主题也是一个主题,没有样式表算个怎么回事!

第二,子主题文件的替换机制。子主题作为对父主题的增强,肯定是要基于父主题来修改的,所以就有个文件替换的问题,哪些文件会直接覆盖掉父主题下的同名文件?答案是,除了functions.php以外的所有文件。子主题当中,style.css是对于父主题style.css样式表的增强,能够覆盖父主题同名样式或者增加一项父主题不存在的样式。但是要注意的一点是,如果style.css里没有掉入父主题样式的话,整个主题就只有你添加的那几条样式了,所以我们需要使用@import命令来调用父主题的样式,这样一来,子主题的样式表就是在父主题基础上添加样式,而不是从零开始重新写一整套样式了。

下面是子主题style.css的写法:(以我自己使用的主题Editor为例)

/*
Theme Name: Yiye
Description: Child theme of the Editor theme for zhangzhao.me
Author: Zhang Zhao
Template: editor
*/

@import url("../editor/style.css");
……//你需要添加或者修改的规则

其中的@import url("../editor/style.css")就是调用父主题的样式表,这一点尤其重要,另外,头部声明当中其他的都可以乱来,但是Template模板这一项必须填父主题的名字,不然就无法形成集成关系了。

接下来一个也很重要的文件是functions.php,这是我们经常用来存放自定义函数的文件,一般要实现WordPress和主题之外的功能,就得添加一些函数,这就得使用到这个文件了。functions.php不会覆盖掉父主题的函数,也不用特别声明继承关系,直接添加自己的自定义函数就行。当然,你觉得父主题里面某个函数不好用,你想用同名的函数覆盖过去,也是可以的,按照下面的方法:

if (!function _exists('theme_special_nav')) {//判断函数是否存在
    function theme_special_nav() {//重新定义函数
        statement;//函数功能语句
    }
}

我需要折腾的只是样式表,对于自定义函数和功能,我一般不自己添加,而是通过插件的方式来增强,因为插件是一种更加模块化、更灵活的方式,在版本升级之后也不容易出现不兼容问题,而自己手动添加代码很可能导致整个网站不可访问,为了稳定,我宁愿选择插件。

2
0
希望看到您的想法,请您发表评论x