WordPress文章ID连续的最终解决方法。

  4,162 ℃

CONTENT

前面的文章写到了,代码复制到主题的functions.php下。注释很清楚,具体原理自行理解。

//自动设置新文章别名为文章数+1
add_action( 'save_post', 'using_id_as_slug', 10, 2 );
function using_id_as_slug($post_id, $post){
 global $post_type;
 $l_get_publish = wp_count_posts()->publish; //获取已发布文章数量
 $l_get_draft = wp_count_posts()->draft; //获取草稿数量
 $l_get_future = wp_count_posts()->future; //获取未来发布文章数量
 $l_get_private = wp_count_posts()->private; //获取登陆可见文章数量
 $l_get_postnumber = $l_get_publish + $l_get_draft + $l_get_future + $l_get_private;
 if($post_type=='post'){ //只对文章生效
 // 如果文章已发布则不生效
 if (get_post_status($post_id)===publish) return false;
 // 取消挂载该函数,防止无限循环
 remove_action('save_post', 'using_id_as_slug' );
 // 使用文章ID作为文章的别名
 wp_update_post(array('ID' => $post_id, 'post_name' => $l_get_publish + 1 ));
 // 重新挂载该函数
 add_action('save_post', 'using_id_as_slug' );
 }
}
//自动设置新文章别名为文章数+1

但此代码的局限在于若存在多个手动草稿,则会导致文章别名出现类似于15-2或15-3的形式。

且对于私密/定时发布的文章不友好。

本次更新初步解决了以上问题,但由于各种原因,若回收站存在文章时发表新文章,则会引起别名的错乱。解决方法为在回收站存在文章时不撰写新文章(但可新建和编辑草稿。)

具体原理为,当文章为草稿时,修改文章别名为cg+草稿数量+1的形式。例如cg15

当文章不为草稿。(此时只有两种情况,已发布/回收站。已发布包括已发布文章/定时发布文章/私密文章)

如果文章别名不为整数,则修改文章别名为已发布(包括已发布文章/定时发布文章/私密文章)文章数+1

(红色为更新时发现代码BUG)

代码将在测试完成后集成为插件放出。

以上更新于2018/05/16

优化规则:

只对文章执行。

草稿修改别名为"cg-草稿数+1"

自动草稿修改为"已发布数+1"

若不符合上述,则可能是:1.pending:待审  2.publish:已发布 3.future:定时 4.private:私有 。(这四种都属于已发布范畴。关于"pending:待审"暂不做考虑。)则判断文章别名是否包含字符"cg-",若包含该字符,则修改文章别名为已发布数。(BUG:暂时没想到,但感觉这个逻辑会有一点小问题,留位待补。)

//自动设置新文章别名为文章数+1
add_action( 'save_post', 'using_id_as_slug', 10, 2 );
//获取文章别名
function lz_the_slug() {
    $lz_post_data = get_post($post->ID, ARRAY_A);
    $lz_slug = $lz_post_data['post_name'];
    return $lz_slug; 
}
function using_id_as_slug($post_id, $post){
	global $post_type;
	//分别获取指定状态文章数量
	$lz_get_publish = wp_count_posts()->publish;  //获取已发布文章数量
	$lz_get_draft = wp_count_posts()->draft;      //获取草稿数量
	$lz_get_autodraft = wp_count_posts()->auto-draft;  //获取自动草稿数量
	$lz_get_future = wp_count_posts()->future;    //获取定时发布文章数量
	$lz_get_private = wp_count_posts()->private;  //获取私密文章数量
	//指定前缀
	$lz_cg = 'cg-';
	//文章别名
	$lz_get_slug = lz_the_slug();
	//获取文章状态
	$lz_get_status = get_post_status($post_id);
	//统计指定文章数量
	$lz_all_draft = $lz_get_draft + $lz_get_autodraft + 1;  // 获取总草稿数量
	$lz_all_publishs = $lz_get_publish + $lz_get_future + $lz_get_private;// 获取发布文章数量
	$lz_all_postnumber = $lz_get_publish + $lz_get_draft + $lz_get_future + $lz_get_private;  // 获取所有文章数量。
	if($post_type !== 'post' ) return false; //只对文章生效
		// 如果为草稿则执行
		if (get_post_status($post_id)===draft){
		    // 取消挂载该函数,防止无限循环
		    remove_action('save_post', 'using_id_as_slug' );
		    // 修改别名为 cg+草稿数量。
		    wp_update_post(array('ID' => $post_id, 'post_name' => $lz_cg.$lz_all_draft));
		    // 重新挂载该函数
		    add_action('save_post', 'using_id_as_slug' );
		}
		//如果为自动草稿则执行
		if (strpos($lz_get_status,'auto-draft') !== false){
			// 取消挂载该函数,防止无限循环
		    remove_action('save_post', 'using_id_as_slug' );
		    // 修改别名为 cg+草稿数量。
		    wp_update_post(array('ID' => $post_id, 'post_name' => $lz_all_publishs + 1));
		    // 重新挂载该函数
		    add_action('save_post', 'using_id_as_slug' );
		}
		//如果已发布文章别名中有'cg-',则执行。
		if (strpos($lz_get_slug,'cg-') !== false) {
			// 取消挂载该函数,防止无限循环
			remove_action('save_post', 'using_id_as_slug' );
			// 修改名章别名为已发布数
			wp_update_post(array('ID' => $post_id, 'post_name' => $lz_all_publishs ));
			// 重新挂载该函数
			add_action('save_post', 'using_id_as_slug' );
		}
		    // 否则退出。
		    else {
				return false;
		    }
}
//自动设置新文章别名为文章数+1

再次优化版。

//自动设置新文章别名为文章数+1
add_action( 'save_post', 'using_id_as_slug', 10, 2 );
//获取文章别名
function lz_the_slug() {
    $lz_post_data = get_post($post->ID, ARRAY_A);
    $lz_slug = $lz_post_data['post_name'];
    return $lz_slug; 
}
function using_id_as_slug($post_id, $post){
	global $post_type;
	//分别获取指定状态文章数量
	$lz_get_publish = wp_count_posts()->publish;  //获取已发布文章数量
	$lz_get_draft = wp_count_posts()->draft;      //获取草稿数量
	$lz_get_autodraft = wp_count_posts()->auto-draft;  //获取自动草稿数量
	$lz_get_future = wp_count_posts()->future;    //获取定时发布文章数量
	$lz_get_private = wp_count_posts()->private;  //获取私密文章数量
	//指定前缀
	$lz_cg = 'cg-';
	//文章别名
	$lz_get_slug = lz_the_slug();
	//获取文章状态
	$lz_get_status = get_post_status($post_id);
	//统计指定文章数量
	$lz_all_draft = $lz_get_draft + $lz_get_autodraft + 1;  // 获取总草稿数量
	$lz_all_publishs = $lz_get_publish + $lz_get_future + $lz_get_private;// 获取发布文章数量
	$lz_all_postnumber = $lz_get_publish + $lz_get_draft + $lz_get_future + $lz_get_private;  // 获取所有文章数量。
	if($post_type !== 'post' ) return false; //只对文章生效
		// 如果为草稿则执行
		if (get_post_status($post_id)===draft){
		    // 取消挂载该函数,防止无限循环
		    remove_action('save_post', 'using_id_as_slug' );
		    // 修改别名为 cg+草稿数量。
		    wp_update_post(array('ID' => $post_id, 'post_name' => $lz_cg.$lz_all_draft));
		    // 重新挂载该函数
		    add_action('save_post', 'using_id_as_slug' );
		}
		//如果为自动草稿则执行
		else if (strpos($lz_get_status,'auto-draft') !== false){
			// 取消挂载该函数,防止无限循环
		    remove_action('save_post', 'using_id_as_slug' );
		    // 修改别名为 cg+草稿数量。
		    wp_update_post(array('ID' => $post_id, 'post_name' => $lz_all_publishs + 1));
		    // 重新挂载该函数
		    add_action('save_post', 'using_id_as_slug' );
		}
		//如果已发布文章别名中有'cg-',则执行。
		    else if (strpos($lz_get_slug,'cg-') !== false) {
				// 取消挂载该函数,防止无限循环
				remove_action('save_post', 'using_id_as_slug' );
				// 修改名章别名为已发布数
				wp_update_post(array('ID' => $post_id, 'post_name' => $lz_all_publishs ));
				// 重新挂载该函数
				add_action('save_post', 'using_id_as_slug' );
			}
}
//自动设置新文章别名为文章数+1

以上两端代码都能正常使用。BUG待补。

 

评论: | 1 条评论

  • 回复

    膜拜程序猿大佬。主题很简洁,看着舒服~