上图中A和B两个小方块的背景色是相同的。你看出来了吗?
Lust of Life
高中的一节美术欣赏课,我第一因为一幅画而感动了——《Stary Night》。那种炽烈的感情,那种用尽全身力量,也没有办法表达万一的那种感情,那种使得人的精神倍受折磨的感情,透过画笔,透过颜料,透过画布,再透过照片,再透过印刷的纸张……即便是那么多次的“转载”,即便穿越了百年的时间,跨越了万里的空间,那幅画背后,画家的那种挣扎,依旧清晰地向我袭来,我就是那一刹那,深深地被感动了……
我原本一直以为那种感动是由于高三时候的那种压抑的气氛,然而,后来进了大学,再次在照片上看到那幅画,现如今,实验室的师兄从阿姆斯特丹回来,从他给送我的明信片上再一次看到那幅画,那种全身电流通过的感觉,一如往昔的清晰。想必,我是真的被感动了。
电影里,Vincent那炽烈的情感,就如同我的想象一般,并没有让我有太多的吃惊,这点,我想只要是看过他的画的人,都能有同感的。我只是为他强烈的想要为社会做点什么贡献,想要自己成为有用的人的那种意愿而感到深深的敬佩。这点是之前我所没有看到,也没有想到的,原来这个大画家,竟然是这么有社会责任感的一个人。通过这部电影我才知道,原来,在凡高之前,是没有人把劳动人民和劳苦大众作为作画的对象的。这就又加深了我对他的敬佩之情。
有的时候,我又觉得非常同情他,他是个天才,他对自然,对于看到的事物有着他非常独特的理解,可是没有人能够理解他,没有人认同他。即便是那位“好朋友”高更,也没有真正理解过他。那么表姐凯理解他更是不可能的了。有时候,我想,成为一个天才,伴随着你的不一定有很多幸运,但是一定有无尽的孤独。他就是那么一个孤独的人。
另一个打动我的,是他的弟弟,提奥。我甚至觉得,没有提奥,就没有凡高。凡高穷困潦倒,基本没有独立生活能力,又从不把自己的生活当成一回事情,要是没有提奥始终如一的经济上的资助和情感上的支持,就不可能有那些让无数人感动的伟大画作。
对电影本身,我没有什么想说的,我觉得豆瓣一个网友说得挺好的,一般的电影是“电影成就了故事”,而对于这部片子,却是“故事成就了电影”。我们先为故事本身而感动,才顾得上审视这部电影怎么样。从这个角度来看,导演,演员,音乐,都是令人满意的。
Unnamed 1.23 中文语言包
Unnamed是一款非常经典的三栏主题,其有着非常强大的功能。可以说是国人做的主题中最好的一类主题了。
Unnamed有如下特性:
- 即时评论(可以关闭)
- 即时搜索(可以关闭)
- 滑动面板(可以关闭)
- 两栏布局或者三栏布局可配置
- 字体、链接、背景颜色可配置
- 页头图片可配置
- 侧边栏显示可配置(还是不够强大的,不如SBM强大,但是已经相当不错了)
- 支持Widgets
- 支持多级页面导航,隐藏页面
- 支持Feed重定向,对于使用FeedSky或者FeedBurner的用户来说这个功能很方便
- WP2.5兼容,支持头像
Unnamed下载:作者页面下下载
中文语言包:本站下载
Unnamed截图:Live Demo
=========================================
后记,说实在的,翻译是一件吃力不讨好的工作,但是,还有一句实在话,就是通过翻译一个模板的语言文件,能学到很多的知识。有些时候,看到很多字符串,根本就想不出来这些字符串会出现在什么地方。通过翻译,然后运行模板反复对比,才可以搞清楚,原来,做一个模板还有考虑这,考虑那,真的很长知识,很长见识。通过这样的翻译,也发现了,Xu Yiyang的这两款模板,真的是细致周到,体贴入微,而且功能强大,当真让我敬佩非凡啊!
翻译肯定有不当的地方,希望试用的同学能给我指正,当然你也可以不指正,直接在我的基础上DIY。下面给出语言包的链接。
(这里解释一下,原作者提供的PO文件缺少一些字符串,后来我直接从他的模板文件又生成了一份,就比较完整了,不过本着尊重原作者的原则和抱着顺便发送Pingback的目的,还是提供一下原语言包的链接啦~~
)
手动调用Simple Tags输出相关日志
Simple Tags是一款非常优秀的插件,在WordPress原生支持tags后,Simple Tags因为其强大的tags管理功能成为了一款必不可少的插件。
经历了几个版本的演化后,Simple Tags的功能已经越来越强。输出相关日志的功能最终也被集成到了其中。在Simple Tags后台页面,通过简单的设置,就可以轻易实现在Feed、帖子页中,输出相关日志。
但是,通过后台设定添加的相关日志列表不能控制其出现的位置,Simple Tags采用filter来将相关日志列表追加到了文章内容的末尾(关于filter的说明,可以参考我翻译的文档),很多WPer都会在文章末尾添加很多东西,比如版权(如本站),社会化书签,有的还有广告等等,如果相关日志列表没有出现在合适的位置,不但影响美观,还会影响用户友好。
解决办法一般就是采用专门的Related Posts插件,比如我爱水煮鱼,就提供了一个这样的插件,使用起来也相对简便。现在,大家又有一个选择了,因为,按照查理的理论,同样是直接在页面模板中插入代码,插入一行和插入三行,是完全一样的。既然这样,为什么要多安装一个插件呢?(关于效率和功能的强大与否,查理没有对比过,所以,也就没有什么发言权了,所以,这也不是非要使用这个方法的一个理由,有兴趣研究的同学,可以把你的结果告诉查理,我会把你文章的permalink,添加在本文中)。
好了,闲话已毕,我们来看正题,首先我就把那三行代码贴在这里吧,全部采用默认设置输出相关日志的话,看到这里就可以大功告成了!在你自己的模板文件的single.php(如果使用K2,那么是theloop.php)中的合适位置,加入下面的代码即可输出10篇相关日志列表,如本站效果。
<?php
if (is_single() && function_exists('st_related_posts'))
{
st_related_posts('number=10&include_page=false&order=data-asc');
}
?>
简单解释一下,st_related_posts()是Simple Tags插件提供的公用函数,可以直接输出相关日志列表。
number–输出相关文章的数量order–输出相关文章的排序。可选值:- date-asc - 旧日志在前
- date-desc - 新日志在前
- count-asc - 相同标签数少的日志在前
- count-desc - 相同标签数多的日志在前(默认)
- name-asc - 字母顺序
- name-desc - 字母倒序
- random - 随机
format–不建议设定此参数,用法参见文档separator–不建议设定此参数,用法参见文档include_page–true表示包括页面;false表示不包括include_cat–需要包含的分类的ID,用半角逗号间隔,不设代表所有分类exclude_posts–不想包含的日志ID,用半角逗号间隔exclude_tags–不想包含的tags的ID,用半角逗号间隔post_id–不建议设定此参数,用法参见文档excerpt_wrap–不建议设定此参数,用法参见文档limit_days–多少天内的相关日志,不设代表所有日志min_shared–包含相同tag的数量,默认1(两篇文章有一个相同tag),设得越大,相关日志越少title–日志列表前的标题,可以使用html标签,如<h4>nopoststext–没有相关日志时候显示的文本。需要一个字符串,请用单引号括起来。dateformat–显示日期的格式,默认和WP的格式相同,想要修改的话参见PHP时间函数的参数设定格式xformat–扩展链接格式,默认的就很不错了,想要修改的,看文档吧,或者在Simple Tags的后台也可以设定
收藏、分享您的博客文章
如果您逛过很多优秀的博客,那么您一定会发现有经验的博客们都会在自己的帖子下面添加一个"收藏本文"的功能。一般这样的功能允许读者将博客帖子收藏到许多主流的社会化书签服务中。
美味书签(del.icio.us)的成功在互联网上掀起了一场社会化书签的旋风,自此,社会化书签成为了社会化网络服务大家族中非常重要的一员。
社会化书签允许人们使用Web服务来保存自己的书签,而不是向传统的那样保存在IE收藏夹。我可以在这里做个寓言,不久的将来,IE或者其他浏览器的新版本,将不再带有本地书签功能了。
社会化书签允许您通过网络访问您的收藏,在互联网普及程度如此之高的今天,这就意味着您真的可以随时随地地翻阅您的收藏。
社会化书签的另一个重要的意义就是分享。您的收藏可以通过社会化书签的方式实现和朋友,亲人,或者任何人进行分享。
综上,在您的博客中添加社会化书签,无论是出于访客友好的考虑,还是出于提高流量的考虑,甚至出于SEO的考虑,都是必然选择。
这里,介绍两个我用过的,觉得非常好的,适合WordPress使用的社会化书签插件:
Blog It 2-这款插件是著名的CoolCode.cn出品的。其最大的特色是全。用图片显示,包括抓虾、del.icio.us,Google,Yahoo,Windows Live Bookmarks, Digg,365key,baidu搜藏,新浪Vivi,和讯网摘,Spurl,Wists,Simpy,Newsvine,Blinklist,Furl,Reddit,Fark IP,Blogmarks,Smarking,Magnolia,Segnalo,BumpZee。此外还有些热心的网友补充了饭否,QQ等。使用这个插件,会在您的帖子中,您指定的位置,出现一行漂亮的小图标。这款插件内的服务无所不包,推荐那些比较国际化的博客一定要使用。
17fav Bookmark&Share-这款插件是WordPress中文团队的Denis和LiuYang开发。其特点是比较本地化,对于纯中文的博客,一般的读者也是中国人,针对这个特点,其收录服务有了一定的删减,安装后,会在帖子下面出现一个按钮,悬浮鼠标于其上,会弹出一个面板,可以将帖子收藏到国内常见的社会化书签服务中。这个插件的另一个特色是可以在您的Feed中也添加这个按钮,在用户友好方面,这款插件考虑得更加周到一点。
赶快行动起来,给您的博客添加订阅到社会化书签吧~~
补充一点:17fav Bookmark&Share这个插件有些问题,其引用图标的时候,其根目录被设定为博客主页的URL(应该是WordPress的安装目录),但是很多网站,例如本站,WordPress的安装目录和主页的目录不是同一个,这就会导致无法显示按钮。
修正方法:
打开bookmark-share/bookmark-share.php,找到
$this->imgbtn = get_bloginfo(’home’)."/wp-content/plugins/bookmark-share/bookmark.gif";
$this->iconbtn = get_bloginfo(’home’)."/wp-content/plugins/bookmark-share/icons.gif";
将其中的get_bloginfo(’home’)都改为get_bloginfo(’wpurl’)即可。其实已经有用户提出过这个问题了,但是其作者没有将其改正,盼望此插件的下一个版本能修正这个问题。
WordPress:插件开发API(Plugin API)
Plugin API
介绍
本文当主要介绍WordPress插件开发者可以使用的API Hook,以及如何使用它们。
本文假设您已经阅读了《Writing a Plugin》(这篇文章概览了如何写一个插件)。本文主要介绍API Hook,也称作Filter和Action,WordPress使用这些函数来使您的插件起作用。
注意:本文的内容适用于WordPress1.2+。
Hook,Action和Filter
Hook是WordPress提供的一种机制,帮助您将您的插件加入到WordPress中;也即,在您的插件中,通过调用一些系统函数,使得您的插件可以运作起来。一共有两种Hook:
- Action:Action是WordPress内核在运行到某个特定的点的,或者某个特定的事件发生的时候执行的。您可以通过使用Action API让您的插件中的一个或者多个函数在这些特定的点执行。
- Filter:Filter是WordPress在将一段文本加入到数据库,或者发送给浏览器之前处理不同种类的文本用的。您的插件可以通过使用Filter API,让一个或者多个函数在这些时刻运行,以处理特定类型的文本。
有的时候,您可以使用Action和Filter达到相同的目的。比如说,您希望你的插件可以更改一段日志的文本,您可能会往publish_post中添加一个Action函数(这段文字在被加入到数据库之前被修改了),或者往 the_content中添加一个Filter函数(这段文字在被发送给浏览器显示之前,被更改了)。
Action
Action由WordPress中发生的一些特定的事件所触发,比如发布一篇日志,更改主题,或者在管理面板显示一个页面。您的插件可以通过执行一个PHP函数来响应事件,实现以下几个目的:
- 修改数据库数据
- 发送Email信息
- 修改将要在浏览器上呈现的内容(管理员看到的或者访客看到的)
要达到上述的目的,需要遵循的步骤为(下文有详细的描述):
- 在您的插件文件中,创建一个在某个事件发生时,需要运行的PHP函数。
- 通过调用
add_action函数,将您的函数插入到WordPress中。 - 将您的插件文件放到插件目录下,然后激活它。
创建一个Action 函数
在您的插件中创建一个Action的第一个步骤是创建一个能响应Action的函数,并且将它写入到您的插件文件里(您的插件文件最后会被放到content/plugins目录)。举个例子,如果您想要您的朋友在您发表了新文章的时候收到一封邮件,您可以创建下述函数:
function email_friends($post_ID) {
$friends = ‘bob@example.org,susie@example.org’;
mail($friends, "sally’s blog updated",
‘I just put something on my blog: http://blog.example.com’);
return $post_ID;
}
对于大多数的Action来说,您的函数要接受一个单一参数(通常是日志或这评论的ID,这要视情况而定)。有些Action接受多于一个的参数,您可以查看WordPress的Action文档,或者直接查看WordPress源代码来取得第一手资料。除了一个参数外,您还可以访问WordPress的全局变量,并且调用其他WordPress函数或者您插件中的其他函数(或者其他插件中的函数)。
注意:您要始终留意,是否WordPress本身或者其他的插件已经使用了您想用的那个函数的名字。关于这点,您可以查看避免函数名冲突这篇文章来获取更详细的信息。
Hook到WordPress
当您定义好您的函数后,下一步就是将您的函数Hook或者注册到WordPress中。在您的插件文件中的全局空间中调用函数 add_action()就可以了:
add_action(’hook_name’, ‘your_filter’, [priority], [accepted_args]);
该函数中:
hook_name是WordPress提供的供hook用的函数名,也即您的函数将关联到的事件的名称。your_function_name是您希望在hook_name指定的事件发生时执行的函数的名称。这可以是一个在WordPress中定义好的标准的函数,也可以是一个您自己定义的函数(比如上面提到的email_friends)priority是一个可选的整型参数,可以指定可以指定关联到某个特定的函数的执行顺序。默认值是10。数字较小的执行较早,如果优先级相同,则按照他们hook进来的顺序先后来执行。accepted_args是一个可选的整型参数,它定义了您的函数可以接受多少个参数,默认是1。这个参数很有用,因为有些事件发生的时候,可能会向您的函数传递多于一个的参数。这个参数是从WordPress 1.5.1后的版本才开始有的。
继续前文的例子,我们可以将下面一行代码加入到插件的文件中:
add_filter(’comment_text’,'filter_profanity’);
相似的,您也可以将一个函数从Action中移除。你可以参考移除Action来获得详细的信息。
安装和激活
让您的插件奏效的最后一个步骤就是安装和激活和插件了。您写好的函数和对add_action的调用,必须放到同一个文件中,插件文件必须被装到wp-content/plugins目录中。一旦插件安装好,您需要访问管理面板来激活您的插件。
目前已有的Action Hook
参见Plugin API/Action Reference来查看WordPress中的当前的Action列表。
Filter
Filter是在WordPress执行过程中,传递数据时,在对数据采取某种行动(将数据写入到数据库或者发送给访客的浏览器)之前执行的。(当WordPress生成页面时)Filter就位于数据库和浏览器之间,(当WordPress向数据库添加日志和评论时)Filter就位于浏览器和数据库之间。WordPress中的绝大多数的输入和输出过程都要通过至少一个Filter。WordPress自己有一些默认的Filter,您可以在插件中使用自己的Filter。
将您自己的Filter添加到WordPress中,遵循以下几个步骤:
- 创建一个PHP函数来过滤数据。
- 通过调用add_filter将这个Filter添加到WordPress中。
- 将您的PHP函数写入到一个插件文件中,激活它。
创建一个Filter函数
一个Filter函数把未经修改的数据作为输入,返回修改过的数据(或者有的时候返回的空值,表明这些数据应该被删除)。如果您的Filter没有修改数据,那么原始的数据必须被返回回去,以便于后续的插件可以继续它们的修改工作。
所以,在您的插件中创建一个Filter的第一步,就是创建一个PHP函数来执行过滤动作,并且,将这个函数写入到您的插件文件中去。再举个例子,如果您需要确定您的日志或者评论中没有出现违禁词汇,您可以定义一个全局变量,里面包含了全部的违禁词汇的列表,然后创建下面的PHP函数:
function filter_profanity($content) {
global $profanities;
foreach($profanities as $profanity) {
$content=str_ireplace($profanity,’{censored}’,$content);
}
return $content;
}
注意:同样要小心您的函数的命名,不要和其他的WordPress函数和其他插件的函数冲突。
将您的Filter Hook到WordPress
在您的函数定义完毕后,下一步就是将您的函数"hook"或者说注册到WordPress中。在您的插件文件中,调用add_filter函数:
add_filter(’hook_name’, ‘your_filter’, [priority], [accepted_args]);
其中:
hook_name是WordPress提供的供hook的函数的名称,定义了您可以加入您自己的Filter的插入点。your_filter是您的filter函数的名称。这个函数可以是一个WordPress标准PHP函数,也即在WordPress内核中定义的函数,也可以使一个您自己定义的函数。priority是一个可选的整型参数,标明了注册到某个特定的filter中的函数的执行顺序。默认是10。较小的数字执行时较靠前。如果priority值相同,那么按照注册的先后顺序来执行。accepted_args是一个可选参数,用来标明您的函数能够接受的参数的个数,默认是1,某些hook可以像您的函数传递超过一个的参数。
继续上面的例子,您可以使用下面的代码,让WordPress过滤您评论中的违禁词汇:
add_filter(’comment_text’,'filter_profanity’);
您也可以使用remove_filter()函数来将一个Filter移除。
安装和激活
最后一个步骤就是使您的filter运作起来。你需要做的就是将您的插件文件放到wordpress/plugins目录,然后到后台管理界面激活。
目前WordPress中可以注册的Filter
参见Plugin API/Filter Reference。
例子
下面是一个例子,是Ozh曾经在邮件列表中描述过的,该插件修改(或者说覆盖)了默认的bloginfo()函数。这需要修改内核函数的行为。
add_filter(’bloginfo’, ‘mybloginfo’, 1, 2);
add_filter(’bloginfo_url’, ‘mybloginfo’, 1, 2);
function mybloginfo($result=”, $show=”) {
switch ($show) {
case ‘wpurl’:
$result = SITE_URL;
break;
case ‘template_directory’:
$result = TEMPL_DIR;
break;
default:
}
return $result;
}
移除Action和Filter
在某些情况下,您可能会发现,您的插件需要禁用WordPress中的内建Action或者Filter之一,或者某个其它插件添加的函数。您可以通过调用remove_filter(’filter_hook’,'filter_function’)或者 remove_action(’action_hook’,'action_function’)来达到目的。
比如,remove_action(’publish_post’,'generic_ping’);可以在您发表日志的时候,阻止您的博客向外发送ping。
注意,如果一个hook不是使用默认的优先级(priority)注册到系统中,那么您必须在remove_action()中指定那个hook使用的优先级。一般来说还要注意,除非您很清楚那个函数在干什么并且为什么要那么做,请不要移除任何函数。
缺省加载的Filter和Action
最可靠的获知WordPress缺省加载了哪些Filter和Action的方法就是在其源代码中搜索add_filter和add_action函数的调用。
WordPress 2.1
在WordPress2.1中,绝大多数的Filter和Action的加载是在wp-include/default-filters.php文件中进行的。其他的在下列的文件中加载:
- wp-admin/admin-ajax.php
- wp-admin/admin-functions.php
- wp-admin/custom-header.php
- wp-admin/edit.php
- wp-admin/index.php
- wp-admin/options-permalink.php
- wp-admin/upload-functions.php
- wp-admin/upload.php
- wp-includes/bookmark.php
- wp-includes/general-template.php
- wp-includes/kses.php
- wp-includes/plugin.php
- wp-includes/rewrite.php
- wp-includes/template-loader.php
- wp-includes/theme.php
WordPress 2.5
(以后我会完善这个部分)
您可以覆盖的函数
除了使用hook(action和filter),另一个插件修改Wordpress行为方式是覆盖WordPress的函数。实际上,有一小组函数,是WordPess希望被插件覆盖的。在所有的插件都已经启动后,如果他们还没有被覆盖的话,WordPress才启动这些函数。
这些函数在wp-include/pluggable.php文件中定义。这里有一个列表(WP2.1)。
- set_current_user
- wp_set_current_user
- wp_get_current_user
- get_currentuserinfo
- get_userdata
- update_user_cache
- get_userdatabylogin
- wp_mail
- wp_login
- is_user_logged_in
- auth_redirect
- check_admin_referer
- wp_redirect
- wp_get_cookie_login
- wp_setcookie
- wp_clearcookie
- wp_notify_postauthor
- wp_notify_moderator
- wp_new_user_notification
- wp_verify_nonce
- wp_create_nonce
- wp_salt
- wp_hash




Most Commented Posts