使用 WordPress 的子主题(Child Themes)功能快速制作自己的主题

子主题的目录结构

子主题也是一个主题,也跟其他主题一样,放在 wp-content/themes 目录下面的文件夹中,文件夹的名称可以随便定义,为了形象一点,在示例中,我们可以新建 twentytwelve-child 这样一个文件夹存放子主题。这样的话,我们的 themes 文件夹中,至少有两个文件夹:twentytwelve、twentytwelve-child ,因为子主题要基于父主题,所以主题目录肯定要有父主题。

在子主题中,一般有下面几个文件:

  • style.css (必须)
  • functions.php (可选)
  • 其他模板文件 (可选)
  • 其他文件 (可选)

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

必需的style.css文件

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

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

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

/*
Theme Name:     Twenty Ten Child
Theme URI:      http: //example.com/
Description:    Child theme for the Twenty Ten theme
Author:         Your name here
Author URI:     http: //example.com/about/
Template:       twentyten
Version:        0.1.0
*/

逐行的简单解释:

  • 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。
/*
Theme Name: Twenty Ten Child
Description: Child theme for the Twenty Ten theme
Author: Your name here
Template: twentyten
*/
 
@import url("../twentyten/style.css");
 
#site-title a {
    color: #009900;
}

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

  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元素里面。

<?php
 
function favicon_link() {
    echo '<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />' . "n";
}
add_action('wp_head', 'favicon_link');
 
?>

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

if (!function_exists('theme_special_nav')) {
    function theme_special_nav() {
        //  Do something.
    }
}

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

替换父主题函数的前提是父主题在定义函数之前判断了函数是否已经定义,但显然这个父主题并没有判断

如果父主题提示错误:Cannot redeclare_….请参考这篇文章:WordPress删除父主题中指定功能的两种方法 | 关于hook:add_action()用法的学习笔记

模板文件

模板文件 在子主题中的表现和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文件。

参考文章:http://blog.wpjam.com/article/child-themes/

 

WordPress删除父主题中指定功能的两种方法 | 关于hook:add_action()用法的学习笔记

在折腾WordPress模版代码时经常见到两种触发function的方法,一种是用function_exists()来判断方法存不存在,如果存在则执行;另一种则是用add_action()或add_filter()来执行写好的方法,统称hook(勾子)。如果用到子主题的话,在父模版中用function_exists()会更灵活,因为在子主题中可以用相同的方法名字直接覆盖父主题的方法。下面以在子主题中删除父主题指定的方法(function)代码为例,简单整理一下:

方法一:function_exists()

先查看父主题中的代码。

// 父主题中function.php的代码
if ( ! function_exists('print_something') ) {
function print_something() {
// 功能代码
 }
}

如果想要修改父主题中的方法,只需在子主题重新写一个相同名称的方法即可。

// 子主题中function.php的代码
 
function print_something() {
// 功能代码
}

方法一实际项目运用:(父主题)

/**
 * 加载脚本样式(父主题)
 */
if ( ! function_exists('doocii_mobile_scripts') ) {
function doocii_mobile_scripts() {

    if ( is_home() ) { 
     wp_enqueue_style( 'home', get_template_directory_uri() . '/css/home.css', array(), '3.2' );
     wp_enqueue_script( 'home', get_template_directory_uri() . '/js/home.js', array(), '202141212', true );
    } 

}
}
add_action( 'wp_enqueue_scripts', 'doocii_mobile_scripts' );

方法一实际项目运用:(子主题)

if (!function_exists('doocii_mobile_scripts')) {
    function doocii_mobile_scripts() {
        //  做一些事情
    }
}

方法二:使用Hook,用add_action()或add_filter()调用方法

// 父主题中function.php的代码
function print_something() {
// 功能代码
}
add_action('wp_head', 'print_something');

从代码中可以看出有一个print_something()功能方法,然后用add_action()触发、执行该方法。其中add_action()中有两个参数,分别是“Hook位置(决定在哪里执行)”,“调用的方法”。有些代码也加上了第三个以数字为主的参数,那是指优先权。

如果我们要删除指定的父主题中的print_something()要怎么做呢?我的习惯是这样的三部曲:先写好你要用的新方法,然后再写一个方法用来删除父主题中指定的方法,最后再用add_action()或add_filter()调用他们。具体:

// 子主题中function.php的代码
function new_print_something() {
// 你要写的、新的功能代码
}
 
function remove_old_function() {
remove_action ('wp_head', 'print_something');
}
 
add_action('init', 'remove_old_function');
add_action('wp_head', 'new_print_something');

其中我们写了两个新的方法分别叫new_print_something()和remove_old_function(),一个是用来写新的功能的,另一个是用来删除父主题中指定方法的。最下面用add_action()调用并执行这两个方法。

细心的话你可能会问为什么要单独写一个remove_old_function()这样的方法来删除父主题的功能而不是直接用remove_action()来删除?因为WordPress会先执行子主题的代码,然后再执行父主题的代码,如果我们直接删除掉指定的方法,WordPress会因为父主题的代码还没有运行就执行了删除而找不到需要删除的方法,从而忽略掉这个行为。

以上即是制作子主题时常见的php文件功能修改的方法。

 

参考文献:WordPress Child Themes Tutorial

CentOS下shadowsocks-libev一键安装脚本

使用root用户登录

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh
chmod +x shadowsocks-libev.sh
./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log

安装完成后,脚本提示如下:

Congratulations, shadowsocks-libev install completed!
Your Server IP:your_server_ip
Your Server Port:your_server_port
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:https://teddysun.com/357.html
Enjoy it!

卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocks-libev.sh uninstall

其他事项:

客户端配置的参考链接:https://teddysun.com/339.html
安装完成后即已后台启动 shadowsocks ,运行:

ps -ef | grep ss-server | grep -v ps | grep -v grep

可以查看进程是否存在。
本脚本安装完成后,会将 shadowsocks-libev 加入开机自启动。

使用命令:

启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
查看状态:/etc/init.d/shadowsocks status

阻止移动设备自动识别页面上的电话号码、email地址

这个问题主要发生在iOS的浏览器上,他们有时候会有一些“自作聪明”,自动把页面上的一串数字识别成电话号码,这样用户不小心点击这串数字,就拨号了。所以我们习惯给那些要在手机上访问的响应式页面增加一串meta标签,以阻止移动端浏览器的这些自动行为。

<meta name="format-detection" content="telephone=no" />
<meta name="format-detection" content="email=no" />
<meta name="format-detection" content="address=no" />
<meta name="format-detection" content="date=no" />

其实之所以iOS的浏览器会自动识别页面上的数字为电话号码,就是因为它默认的format-detection中有一条telephone=yes。人为把它设置成no就阻止了这个功能。那么在我们需要真的实现点击链接播电话的时候,只要在link上用标准的“tel:”写法就可以了:

<a href="tel:8602188888888">+86 021 88888888</a>

如此本文开头的其他几个例子就很好理解了,都是针对iOS(也不排除部分安卓浏览器)的。其中address=no,是防止地址跳转到地图;date=no是防止日期被显示成别的格式。这些浏览器自动产生的行为,可能会破坏页面原本布局,所以一律阻止掉它们。

珍惜时间的名言勉励自己

光阴似箭,岁月如梭,每天忙忙碌碌的工作,自己没有收获什么。为了避免在我老年的时候说’时间过的这么快’,至此分享出这些珍惜时间的名言来鞭策激励自己,懂得珍惜时间。

Copyright ©豆采博客All Rights Reserved 拍摄于:2015.07.25

Copyright ©豆采博客All Rights Reserved 拍摄于:2015.07.25

时间,每天得到的都是24小时,可是一天的时间给勤勉的人带来智慧与力量,给懒散的人
只能留下一片悔恨。

——鲁 迅


盛年不再来,一日难再晨,及时当勉励,岁月不待人。

——陶渊明


逆水行舟用力撑,一篙松劲退千寻。古云“此日足可惜”,吾辈更应惜秒阴。

——董必武


我们若要生活,就该为自己建造一种充满感受、思索和行动的时钟,用它来代替这个枯燥、单调、以愁闷来扼杀心灵,带有责备意味和冷冷地滴答着的时间。

——高尔基


凡事都要脚踏实地地去工作,不驰于空想,不鹜于虚声,惟以求真的态度作踏实的工夫。
以此态度求学,则真理可明,以此态度作事,则功业可就。

——李大钊


完成工作的方法是爱惜每一分钟。

——达尔文


合理安排时间,就等于节约时间。

——培根


过于求速是做事的最大危险之一。

——培根


应当仔细地观察,为的是理解;应当努力地理解,为的是行动。

——罗曼 罗兰


每一点滴的进展都是缓慢而艰巨的,一个人一次只能着手解决一项有限的目标。

——贝弗里奇


科学的灵感,决不是坐等可以等来的。如果说,科学上的发展有什么偶然的机遇的话,那么这种 “偶然的机遇”只能给那些学有素养的人,给那些善于独立思考的人,给那些具有锲而不舍 的精神的人,而不会给懒汉。

——华罗庚


天分高的人如果懒惰成性,亦即不自努力以发展他的才能,则其成就也不会很大,有时反会不如天分比他低些的人。
成功=艰苦劳动+正确的方节约时间,也就是使一个人的有限的生命,更加有效,而也就等于延长了人的寿命。

——鲁 迅


我以为世间最可贵的就是“今”,最易丧失得也是“今”。因为它最容易丧失,所以更觉得它宝贵。

——李大钊


必须记住我们学习的时间是有限的。时间有限,不只是由于人生短促,更由于人事纷繁。我们应该力求把我们所有的时间用去做最有益的事情。

——斯宾塞


一个人越知道时间的价值,越倍觉失时的痛苦呀!

——但 丁


逝者如斯夫,不舍昼夜

——孔子


人生天地之间,若白驹过隙,忽然而已。

——庄子


天可补,海可填,南山可移。日月既往,不可复追。

——曾国藩


你热爱生命吗?那么别浪费时间,因为时间是构成生命的材料。

——富兰克林


荒废时间等于荒废生命。

——川端康成


抛弃时间的人,时间也抛弃他。

——莎士比亚


时间就是生命,时间就是速度,时间就是力量。

——郭沫若


时间就像海绵里的水,只要愿挤,总还是有的。

——鲁迅


时间是由分秒积成的,善于利用零星时间的人,才会做出更大的成绩来。

——华罗庚


在所有的批评家中,最伟大、最正确、最天才的是时间。

——别林斯基


要找出时间来考虑一下,一天中做了什么,是正号还是负号。

——季米特洛夫


世界上最快而又最慢,最长而又最短,最平凡而又最珍贵,最易被忽视而又最令人后悔的就是时间。

——高尔基


盛年不重来,一日难再晨。及时当勉励,岁月不待人。

——陶渊明


明日复明日,明日何其多,我生待明日,万事成蹉跎。世人若被明日累,春去秋来老将至。朝看水东流,暮看日西坠。百年明日能几何,请君听我明日歌。

——文嘉《明日歌》


今日复今日,今日何其少!今日又不为,此事何时了!人生百年几今日,今日不为真可惜!若言姑待明朝至,明朝又有明朝事。为君聊赋今日诗,努力请从今日始。

——文嘉《今日诗》


300+值得收藏的设计师资源站

设计 + 代码

1DnZ8sZKc1W8ZRYecOWL6rA

A. 免费设计资源

  • Freebbble: 网站搜集了来自 Dribbble 的免费素材.
  • Dribbble: 在 Dribbble 中搜索 “freebie” 能找到许多免费的好东西.
  • Graphic Burger: 这里的每一个设计资源都足够精致.
  • Pixel Buddha: 为专业人士准备的设计素材,有免费的好资源,也有收费的进阶版.
  • Premium Pixels: 为创意工作者准备的素材.
  • Fribbble: Dribbble设计师的免费素材,项目由 Gilbert Pellegrom 所策划.
  • Freebiesbug: 最新最热的PSD等设计素材,为设计师而生.
  • 365 Psd:每天一款免费的PSD.
  • Dbf: 这里有来自Dribbble和Behance的免费资源.
  • Marvel: 来自著名设计师的免费素材.
  • UI Space: 来自那些炫酷的创意工作者的高品质设计资源.
  • Free Section of Pixeden: 大量免费设计资源.
  • Free Section of Creative Market: 每周一一波免费设计资源.
  • Teehan+Lax: DiOS 8 GUI PSD (iPhone 6).
  • Teehan+Lax: iPad GUI PSD.
  • Freepik: 给每个人的免费平面设计资源.
  • Tech&All: PSD,技术新闻,免费资源,都在这里.
  • Tethr: 最漂亮的iOS UI设计工具.

B. 取色

C. 灵感

D. 免费图库

E. 免费排版与字体资源

F. 免费图标

G. 免费实用工具

  • UI Names: 随机生成名字,可以在设计原型中使用.
  • UI Faces: 查找并生成头像,用于UI设计.
  • UI Blurbs: 设计原型时,可以帮你快速生成用户信息.
  • Copy Paste Character: 点击复制工具.
  • Window Resizer: 查看你的设计作品在不同屏幕上的显示效果.

生产力工具

1e9HtOVMvEpwheMXWMMwxBQ

A. 帮你保持专注的环境音

  • Noisli: 背景音和色彩生成器.
  • Noizio: 帮你放松提高生产力的环境音.
  • Defonic: 将各种环境音合成为旋律的工具.
  • Designers.mx: 设计师的音乐播放列表.
  • Coffitivity: 咖啡馆的环境音,帮你提升效率.

B. 防止分心

C. 组织协作

  • Trello: 记录一切的工具.
  • Evernote: 可能作为你一生记录工具的优秀软件.
  • Dropbox: 世界上最优秀的网盘之一
  • Yanado: 在 Gmail 中使用的管理工具.
  • Wetransfer: 免费2GB的上传空间.
  • Drp.io: 免费快速私密易用的图片托管服务.
  • Pocket: 最好的稍后读软件,致力于成为你的图书馆的软件.
  • Mailtoself: 一款iOS插件,让你可以在任何APP中向你的邮箱发笔记.
  • List.ly: 发现并创建优质的列表.
  • Markticle: 在文章中记录阅读进度的工具.

D. 远程工作

  • Nomadlist: 那些适宜于远程工作的城市.
  • Where Nomads at: 发现那些全世界范围内远程工作的同行们.
  • Nomad Jobs: 那些最优秀的适宜于远程工作的创业项目.
  • What’s It Like: 帮助旅行者找到最佳出行时机.

发现与学习

1MOWZlV9gH81DGflyfv1Hzw

A. 发现工具/初创项目

B. 协同创造

C. LEARN

D. 那些还不错的资讯

E. 一些有用的东西

商业与营销

1lqvdybYOXnAvDmCAtRbPzw

A. 免费的网站+LOGO+托管+发票

B. 免费的商务/项目名称生成工具

C. 博客与写作

  • Hemingway: Hemingway App 让你的写作清晰而醒目.
  • Grammarly: 帮你找到文章中明显的错误.
  • Medium: 来自大家的故事和想法.
  • ZenPen: 为网站而生的轻量级写作工具.
  • Liberio: 借助Google Drive简单快速地发布电子书.
  • Editorial Calendar: 通过拖拽快速简便管理你的博客.
  • Story Wars: 大家协同写故事.
  • Headline Analyzer: 标题情感营销分析工具.
  • WP Hide Post: 控制博客内容可见性的工具.
  • Social Locker: 让用户通过发微博的方式来向你“支付”.
  • Egg Timer: 标记并设定时间以便重复使用.

D. 发现内容(趋势、点子)

E. 免费的SEO+网站分析

F. 免费的图片优化

G. 免费的图片编辑器

  • Canva: 极为简单的博客图片编辑工具.
  • Pixlr: Pixlr Editor 是一款强健的浏览器图片编辑工具.
  • Skitch: 用更少的文字传达信息.
  • Easel.ly: 授权任何人创建并分享优秀的视觉设计.
  • Social Image Resizer Tool: 为社交媒体优化的图片.
  • Placeit: 免费的产品原型/视觉稿模板.
  • Recite: 将语言转化为一个优秀的视觉作品.
  • Meme Generator: 第一个在线Meme生成器.

H. 免费收发邮件

I. 免费的社交媒体 + 社区管理 + 调查问卷

  • WriteRack: 最简单地在Twitter上发布博客的工具.
  • Spruce: 以最快的速度在Twitter上发布图片.
  • Click To Tweet: 让你的内容得到更多的转发分享.
  • MyTweetLinks: 提高你的Twitter访问流量.
  • Latergram: 轻松地规划安排你的Instagram的帖子.
  • WordPress Pin it Button for Images: 增加“Pin It” 按钮 .
  • SharedCount: 跟踪URL链接,分享,转发,点赞以及更多.
  • Justunfollow: 在Twitter和Instagram上关注/取消关注.
  • SocialRank: 识别、组织、管理你在Twitter上的好友.
  • Klout: 借助浏览器插件了解你在社交媒体上的影响力.
  • Ritetag: 话题和标签即时跟踪分析.
  • Social Analytics: 在社交平台上借助链接来进行互动.
  • Riffle: 任何Twitter用户完整的个人信息和资料.
  • Buffer Free Plan: 在 Twitter, Facebook, Linkedin, Google+ 上发布内容的时间表.
  • Bitly: 创建、分享、跟踪短链接.
  • Flament: 漂亮免费可定制的分享工具栏.
  • Addthis: 获得更多分享、转发、点赞和评论.
  • Sumome Share: 自动优化你的分享按钮,将流量最大化.
  • Digg Digg: All in one的分享按钮插件.
  • Disqus: 为活跃用户构建一个评论者社区.
  • Typeform: 免费漂亮的在线问卷调查表单生成器.
  • Tally: 在任何时候发起投票.

J. A/B 测试和其他