这几天在闲来没事的时候就会想着和blog相关的配置问题,有一个问题在写比较长的文章的时候经常会考虑:在别人blog的文章中是如何对其中出现的某些关键字,比如sqlmap,添加链接的?(说直白一点就是:如何为文章中的某些关键词自动添加链接?)手动一个一个添加在文章数量较少、内容不多的时候还撑得过去,但是一旦文章多起来了,而且像有的blog还是用爬虫自动抓取的内容进行发布,人工添加显然就不现实了,想着想着,就决定得解决这个问题(念念不忘,必有回想)。
组织一下搜索关键字:WordPress、关键词、自动添加链接。
然后就开始Bing/Google搜索(Baidu在这种情况下能帮到的忙不大,一般只会在迫不得已的情况下才会去试试),从一堆链接中选了几个出来,先大致看看思路,然后在对其中看起来可能性较大的研究一下,找出来的方法如下:
1.用插件实现
这种方法就不多说了,WordPress上的一些问题/功能基本上都可以用插件解决/实现,不过插件相对于自己修改代码来说要稍微多耗些资源,如果服务器性能较高的话也就没什么影响了,这里就稍微列一下网上给出的一些推荐:Simple Tags、SEO Smart Links、WP KeywordLink、Keyword Link Plugin ……(自己也可以去WordPress的后台安装插件那儿搜关键字“keyword”、“tag/link”这些,肯定还是能够找到适合自己的一款的)
2.修改代码(一)
在之前也修改过几次代码以实现一些小功能,所以现在对修改代码的流程也有了一个大致的了解–修改对应主题下的functions.php文件,一般是在文件末尾进行添加功能函数(在文件末尾添加是为了方便的知道你自己到底修改了哪些内容,方便在出现问题时rollback到最初的状态)
<?php
/**
* auto add tag link for WordPress
*/
$replace_limit = 1; // 一篇文章中同一个标签添加几次链接
add_filter('the_content', 'tag_link', 1);
function tag_sort($a, $b){ //按tag名字的长度排序
if ( $a->name == $b->name ) return 0;
return ( strlen($a->name) > strlen($b->name) ) ? -1 : 1;
}
function tag_link($content){ //为符合条件的tag添加link
global $replace_limit;
$posttags = get_the_tags();
if ($posttags) {
usort($posttags, "tag_sort");
foreach($posttags as $tag) {
$link = get_tag_link($tag->term_id);
$keyword = $tag->name;
/* 添加链接的代码 */
$cleankeyword = stripslashes($keyword);
$url = "<a href="$link" title="".str_replace('%s', addcslashes($cleankeyword, '$'), __('View all posts in %s')).""";
$url .= ' target="_blank"';
$url .= ">".addcslashes($cleankeyword, '$')."</a>";
$limit = $replace_limit;
/* 不添加链接的代码 */
$content = preg_replace( '|(<a[^>]+>)(.*)('.$ex_word.')(.*)(</a[^>]*>)|U'.$case, '$1$2%&&&&&%$4$5', $content);
$content = preg_replace( '|(<img)(.*?)('.$ex_word.')(.*?)(>)|U'.$case, '$1$2%&&&&&%$4$5', $content);
$cleankeyword = preg_quote($cleankeyword, ''');
$regEx = ''(?!((<.*?)|(<a.*?)))('. $cleankeyword . ')(?!(([^<>]*?)>)|([^>]*?</a>))'s' . $case;
$content = preg_replace($regEx, $url, $content, $limit);
$content = str_replace( '%&&&&&%', stripslashes($ex_word), $content);
}
}
return $content;
}
从网上找的代码,自己按照理解稍微修改了一下,也不复杂,自己看着办吧。
3.修改代码(二)
虽然说也是修改代码,思路也差不太多,但是是另一种实现方法,虽没上面的那个考虑的全,不过真的是简单方便也可以达到目的:
function replace_keywords($text){
$replace = array(
// '要查找的关键词' => '进行替换的关键词'
'wordpress' => '<a href="#">wordpress</a>',
'excerpt' => '<a href="#">excerpt</a>',
'function' => '<a href="#">function</a>'
);
$text = str_replace(array_keys($replace), $replace, $text);
return $text;
}
add_filter('the_content', 'replace_keywords');
你可以将href的值修改为对应的tag的URL也可以修改成网站地址,看个人喜好了。
在修改代码的过程中学到的一些知识:
WordPress中文文档 #以后可以在这上面有针对性的搜索/查找
WordPress中的add_filter()/add_action()的作用和区别
add_filter/add_action 介绍
WordPress 中有一种叫执行挂勾的机制,允许插件把一些功能“挂载”到 WordPress 当中。也就是说,在系统运行至某一个环节时,去调用插件内的一些函数。WordPress中有2个函数可以让我们执行WordPress标准操作到时候调用我们自定义的函数,这2个函数分别是 add_action() 和 add_filter()。
先看看WordPress里面关于这2个函数的定义,在 wp-includes/plugin.php 文件中,先看 add_filter() 的定义:
function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
global $wp_filter, $merged_filters;
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
$wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args);
unset( $merged_filters[ $tag ] );
return true;
}
再看看 add_action() 函数的定义:
function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
return add_filter($tag, $function_to_add, $priority, $accepted_args);
}
看到这里你也许就明白了,其实add_action()是调用add_filter()的功能,没有加入新的处理操作,说明这两个函数是没有什么区别的。下面来详细说说add_filter()函数。
通过add_filter()函数的定义,我们可以看到该函数是把我们要hook的函数的一些变量存储在 global $wp_filter 这样一个全局数组中的,包括$tag,即我们要hook的函数;$priority即hook的顺序;还有就是$idx这个就是我们自定义函数的名称了。
值得注意的是如果我们在使用add_filter这个函数的时候没有指定顺序/优先级,那么默认的就是10,这个在插件开发的时候值得注意一下,以免和其它插件产生冲突。下面看看该函数的语法:
<?php add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1); ?>
参数:
$tag (字符串)(必需)
连接到$function_to_add的过滤器名称 默认值:None
$function_to_add (回调)(必需)
应用过滤器时被调用函数的名称 默认值:None
$priority (整数)(可选)
用于规定函数被执行的顺序,函数与特定动作关联。较小的数字匹配较早的执行,同等优先级的函数按加入action的顺序被执行。 默认值:10
$accepted_args (整数)(必需)
函数所接受参数的数量。在WordPress 1.5.1及之后版本中,连接的函数可吸收其它在调用do_action() 或 apply_filters()时设置的参数。 默认值:None
用户还需要为过滤器回调时函数的命名空间提供一个指示器,如:
<?php add_filter(‘media_upload_newtab’, array(&$this, ‘media_upload_mycallback’)); ?>
否则WordPress会为函数查找自备命名空间,从而引发异常状况。
返回的值
$function_to_add 成功添加到$tag过滤器时返回true。返回函数可接受的参数数量。在WordPress 1.5.1及之后版本中,连接的函数可吸收其它在调用 do_action() 或 apply_filters() 时设置的参数。例如,comment_id_not_found动作将传递任何函数,若该函数将所请求的评论编号连接到该动作。
示例
博客发表新内容时用电子邮件通知朋友:
function email_friends($post_ID) {
$friends = '[email protected]'
mail($friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com');
return $post_ID;
}
add_filter('publish_post', 'email_friends');
总结一下:网上很多说到add_filter与add_action的区别,说的主观上的区别,add_filter是指在数据显示之前对数据进行一些(过滤)处理,而add_action则是执行一下复杂的操作。其实二者在功能上是没有任何区别的。
add_filter()函数的第一个参数也比较讲究:
- wp_title
- the_generator #WordPress的版本等信息
- publish_post #发表的public属性的文章
- the_content #我猜的话应该就是文章要显示的内容
- the_excerpt
我最后的选择
本来之前是非常想实现这样的自动化功能以减轻负担的,而且刚才也花了这么长时间进行搜索&代码阅读/修改,不过在看到了一句话(我也用过插件的方法,完美搞定博客的内链问题,但是我个人认为一篇文章是包含着作者思想的,是有血有肉有生命力的,我是不希望参杂一些比较机械的元素,即便是都要出现的链接,尽量的在最适合的位置去添加,这是人的思维,而机器是没办法理解的。所以插件和修改代码的方法我后来都未使用,本身每天写点内容并不算负担,没必要偷这个懒。)之后我改变了想法,反正blog现在的内容又不多,写文章也不是为了写而写,是在需要表达某种想法时自然而然的一个过程,并且在手动添加链接的过程中还可以对文章进行进一步的审阅、修改,所以,老老实实的选择手动添加吧,更准确,而且也是一种“情怀”……(然后呢,写这篇文章也就是为了记录一下折腾的过程,万一以后情怀渐渐消逝了呢?嘿嘿)
参考链接
- http://www.54ux.com/a-45.html
- http://codex.wordpress.org.cn/%E9%A6%96%E9%A1%B5
- http://zmingcx.com/automatically-replace-text.html
- http://bbs.chinaz.com/archiver/Archive/thread-5798138-1.html
《 “如何为WordPress实现关键词自动添加链接” 》 有 2 条评论
wordpress修改文章通知评论过那篇文章的用户
http://xptt.com/wordpress-modify-the-article-to-inform-users-who-commented-on-the-article.html
发布文章时邮件通知已评论的用户
http://www.siryin.com/867.html
复制文章内容弹出版权提示框
http://zmingcx.com/copy-popup-tooltip.html
`
代码一、通过SweetAlert美化的提示框
代码二、简单的提示框
`