纯代码解决WordPress发布文章ID不连续问题的方法

原创 aszhi@_admin  2020-11-13 13:45  阅读 2,141 次

WordPress因为历史修订版本(revision)、自动保存(autosave)和自动草稿(auto-draft)功能会非常讨厌的增加文章ID的数字,会造成连续的两篇文章,ID数值可能会相差很多,所以默认情况下发布的文章ID不是连续的,使用ID做为Permalink结构的用户将会看到一个地址越来越混乱的WordPress。让希望文章ID连续的人感到非常不舒服,尤其是使用了文章 ID 作为固定连接之后,每篇文章的 ID 并不连续,非常不好。

除了上述的这些可能造成文章ID不连续外,WordPress还会在“修改文章/页面、添加导航菜单、添加/新建页面、上传的图片/附件(上传新媒体文件)”等情况下占用ID,是造成文章 ID 不连续的罪魁祸首。这种占用没有太好的方法进行解决。

网上的解决方法一般是“禁止/关闭自动草稿及历史修订版本保持文章ID连续的方法”,这种方法能优化数据库,但并没有完全解决文章ID不连续的问题(有时会出现间隔一个ID不连续的问题)。还有,不在媒体库上传媒体、不建立页面等等,但这种方法会导致使用上的不便利,而且很有局限性。所以,本文将介绍一个完美解决WordPress文章ID不连续问题的两种方法。(在 WordPress 4.9 版本中测试有效)

方法一:重新排列不连续的文章ID

编辑当前主题目录下 functions.php 文件,在php结束标记 ?> 前添加以下PHP代码,这样如果你只是单纯发文章,不发页面,不添加菜单,不上传媒体的话,基本上此后的文章ID是连续的,而且不改变之前已经发布的文章ID,不影响SEO。

// WordPress解决文章ID不连续
function keep_id_continuous(){
  global $wpdb;
  // 删掉自动草稿和修订版
  $wpdb->query("DELETE FROM `$wpdb->posts` WHERE `post_status` = 'auto-draft' OR `post_type` = 'revision'");
  // 自增值小于现有最大ID,MySQL会自动设置正确的自增值
  $wpdb->query("ALTER TABLE `$wpdb->posts` AUTO_INCREMENT = 1");  
}
// 将函数钩在新建文章、上传媒体和自定义菜单之前。
add_filter( 'load-post-new.php', 'keep_id_continuous' );
add_filter( 'load-media-new.php', 'keep_id_continuous' );
add_filter( 'load-nav-menus.php', 'keep_id_continuous' );

//禁用文章自动保存
add_action( 'admin_print_scripts', create_function( '$a', "wp_deregister_script('autosave');" ) );
//禁用文章修订版本
add_filter( 'wp_revisions_to_keep', 'fanly_wp_revisions_to_keep', 10, 2 );
function fanly_wp_revisions_to_keep( $num, $post ) { return 0;}

方法二:利用“别名”保持文章ID连续的方法

解决方案:利用别名,自动给文章设置一个别名,别名按顺序递增,然后把固定连接设置成别名。

一、批量设置别名

1、首先,如果你之前已经有文章了,需要根据顺序重新排列,设置一下别名,从 1 开始递增。批量设置别名:把下边的代码添加到当前主题目录下 functions.php 文件,在php结束标记 ?> 前 即可。

// 批量设置别名,此代码使用完后不需要删除,之后还可能用到
function Bing_post_id_continuous_query(){
	set_time_limit( 0 );
	remove_action( 'publish_post', 'Bing_post_id_continuous' );
	query_posts( 'posts_per_page=-1' );
	$arr = array();
	while( have_posts() ){
		the_post();
		$post_id = $GLOBALS['post']->ID;
		$arr[] = $post_id;
	}
	wp_reset_query();	
	$arr = array_reverse( $arr );
	$i = 1;
	foreach( $arr as $post_id ){
		wp_update_post( array(
			'ID' => $post_id,
			'post_name' => $i++
		) );
	}
}
if( $_GET['post_id_continuous_query'] == 'yes' && current_user_can( 'level_10' ) ) add_action( 'init', 'Bing_post_id_continuous_query' );

2、然后,访问下边的地址,注意替换成你的域名(访问时需以管理员身份登录才会执行):

http://www.aszhi.com?post_id_continuous_query=yes

文章多的话网页加载会很慢,耐心等待加载完,加载好后,别名也就批量设置好了。

PS:此代码用完之后不用删除,留着之后有可能还需要用。

二、新文章自动设置别名

老文章设置好了,接下来就要给新文章自动设置别名了,只需要把下边的代码添加到到当前主题目录下 functions.php 文件,在php结束标记 ?> 前 即可。

// WordPress新文章自动使用“发布文章的数量”作为别名
function Bing_post_id_continuous( $id, $post, $update ){
    if( $update || $post->post_status != 'publish' ) return;
    $action = 'save_post';
    $func = 'Bing_post_id_continuous';
    remove_action( $action, $func, 10 );
    wp_update_post( array(
        'ID' => $id,
        'post_name' => wp_count_posts()->publish
    ));
    add_action( $action, $func, 10, 2 );
}
add_action( 'save_post', 'Bing_post_id_continuous', 10, 2 );

添加好后,每发布一篇文章,别名都会自动设置成当前发布文章的数量加 1.

三、修改固定链接

添加完代码之后,需要在后台的 “设置” → “固定连接” → “自定义结构”选项 里设置一下固定连接,把 ID 改成别名,也就是把固定连接里的 /%post_id%.html 改成/%postname%.html

WordPress设置固定链接

PS:如果因为删除、更新或者其它原因导致文章的 “ID” 不连续了,可以使用上边的那个批量设置的代码重新归位。

注意事项

第二种设置别名方法慎用,如果你的网站已经大量收录的情况下肯定没有必要用这种方法。因为每篇文章的路径和ID都是固定的且已经被收录。如果修改了文章的路径,那么百度数据库存储的已经收录的文章则全部不能访问,就造成了大量的死链接。为了SEO考虑最好不要将ID重新排列,直接将文章别名设置为文章ID。如果你的网站是新网站或者文章收录量较少的情况下,修改即可。

利用插件实现文章ID连续的方法

安装插件 WP Clean Up (将下载的插件包上传到wp-content/plugins/目录下进行安装并启用),只要不定期的去清除这些相关数据,那么文章ID连续性就不会有非常大的不连续。数值不会很大,最多就间隔几个。同时此插件还可以优化数据库表。

删除或不上传不必要的附件

相信很多博友在发布文章的时候为了增加页面的丰富性都会同时上传插入一些附件,如图像、视频、音乐、下载文件等,(至少会在文章中插入相匹配的一些元素来丰富文章的阅读性)这些附件可以在WordPress管理后台中的媒体库看到,不同媒体对应了不同的文章。而这些媒体也是占据着文章ID造成文章ID不连续的原因之一,它们与文章都保存在同一个数据库表wp_posts中。如果我们特别追求文章的ID一定要完美无缺地连续,那最好的建议就是请不要在发布文章的时候上传/插入这些媒体,并请在WordPress管理后台中的媒体库删除之前上传的媒体(注意这个操作不只是删除记录,而且会删除你上传的文件),需要的话通过 FTP 重新上传这些附件不会占用ID的。尽量不要上传多余的或者用处不大的等不必要的附件即可。

本文地址:http://aszhi.com/web/wordpress/31.html
关注我们:请关注一下微信号:扫描二维码爱思智前端的微信号
版权声明:本文为原创文章,版权归 aszhi@_admin 所有,欢迎分享本文,转载请保留出处!

发表评论


表情