WordPress保存文章时自动添加已有标签

WordPress的标签作为一个很好的文章聚合方式,为SEO优化提供了很多便利。但是,每次发布新文章时,输入什么标签成为很多人头疼的一个问题,今天给大家带来自动添加已有标签的代码。

1、基础版

/**
 * WordPress保存文章时自动添加已有标签
 * http://www.liuweb.com/20180813214122.html
 */
add_action('save_post', 'auto_add_tags');
function auto_add_tags(){
	$tags = get_tags( array('hide_empty' => false) );
	$post_id = get_the_ID();
	$post_content = get_post($post_id)->post_content;
	if ($tags) {
		foreach ( $tags as $tag ) {
			// 如果文章内容出现了已使用过的标签,自动添加这些标签
			if ( strpos($post_content, $tag->name) !== false) wp_set_post_tags( $post_id, $tag->name, true );
		}
	}
}

代码的原理是:首先获取本站所有标签,然后和本文的内容一一比对,当发现文中有字段和标签名相同时,则自动添加已有标签。

2、乱序版

基础版有一个问题,就是因为获取到的本站标签是有固定顺序的,这就造成一个问题,自动添加的标签总是以固定顺序出现,比如说网站中有一个标签是“六维建站”,那么以后所有文章中,但凡出现“六维建站”触发自动添加标签时,“六维建站”这个标签永远排在第一个,为了改变这个缺陷,我们有了如下乱序版代码:

/**
 * WordPress保存文章时自动添加已有标签
 * http://www.liuweb.com/20180813214122.html
 */
add_action('save_post', 'auto_add_tags');
function auto_add_tags(){
    $tags = get_tags( array('hide_empty' => false) );
    shuffle($tags); //打乱标签顺序
	$post_id = get_the_ID();
	$post_content = get_post($post_id)->post_content;
	if ($tags) {
		foreach ( $tags as $tag ) {
			// 如果文章内容出现了已使用过的标签,自动添加这些标签
			if ( strpos($post_content, $tag->name) !== false) wp_set_post_tags( $post_id, $tag->name, true );
		}
	}
}

3、控制数量版

虽然标签顺序可以打乱了,但是随着标签的越来越多,将会出现新发布一篇文章自动添加了很多标签的现象,而很可能本文只是无意中提到了某个标签的内容,其实与那个标签关联并不大。

为了解决这个问题,我们可以假设如果一篇文章中提到某个标签的次数少于3次,那么我们认为其实这篇文章和这个标签关联并不大,改进代码如下:

/**
 * WordPress保存文章时自动添加已有标签
 * http://www.liuweb.com/20180813214122.html
 */
add_action('save_post', 'auto_add_tags');
function auto_add_tags(){
    $tags = get_tags( array('hide_empty' => false) );
    shuffle($tags); //打乱标签顺序
	$post_id = get_the_ID();
	$post_content = get_post($post_id)->post_content;
	if ($tags) {
		foreach ( $tags as $tag ) {
			// 如果文章内容出现了已使用过的标签,自动添加这些标签
			if ( substr_count($post_content, $tag->name) >2 ) wp_set_post_tags( $post_id, $tag->name, true );
		}
	}
}

4、大小写不敏感版

wordpress中标签的大小写是敏感的,即“WordPress”和“wordpress”是两个不一样的标签,但是很多时候诸如“CDN”和“cdn”等是很容易混写的,这就会造成已有标签“CDN”但是文章中提到的是“cdn”而不能识别的尴尬现象,为了避免这个问题,我们在标签和内容比对这一步,同时将标签名称和文字内容转换为小写进行比对,这样就可以避免这个问题,改进代码如下:

/**
 * WordPress保存文章时自动添加已有标签
 * http://www.liuweb.com/20180813214122.html
 */
add_action('save_post', 'auto_add_tags');
function auto_add_tags(){
    $tags = get_tags( array('hide_empty' => false) );
    shuffle($tags); //打乱标签顺序
	$post_id = get_the_ID();
	$post_content = get_post($post_id)->post_content;
	if ($tags) {
		foreach ( $tags as $tag ) {
			// 如果文章内容出现了已使用过的标签,自动添加这些标签
			if ( substr_count( strtolower($post_content) , strtolower($tag->name)) >= 3) wp_set_post_tags($post_id, $tag->name, true);
		}
	}
}

5、灵活控制版

作为主题作者,可以把自动添加标签的代码和后台框架相结合,定制更加灵活的代码:

/**
 * WordPress保存文章时自动添加已有标签
 * http://www.liuweb.com/20180813214122.html
 */
if (get_option('other_autotag')) {
    add_action('save_post', 'auto_add_tags');
    function auto_add_tags() {
        $num = get_option('seo_autotag_num', 1);
        $tags = get_tags(array('hide_empty' => false));
        shuffle($tags); //打乱标签顺序
        $post_id = get_the_ID();
        $post_content = get_post($post_id) -> post_content;
        if ($tags) {
            foreach($tags as $tag) {
                // 如果文章内容出现了已使用过的标签,自动添加这些标签
                if ( substr_count( strtolower($post_content) , strtolower($tag->name)) >= $num) wp_set_post_tags($post_id, $tag->name, true);
            }
        }
    }
}