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
PS:如果因为删除、更新或者其它原因导致文章的 “ID” 不连续了,可以使用上边的那个批量设置的代码重新归位。
关注我们:请关注一下微信号:扫描二维码
版权声明:本文为原创文章,版权归 aszhi@_admin 所有,欢迎分享本文,转载请保留出处!