当使用中文站点自动生成文章别名时,别名通常直接使用汉字(默认为文章标题生成),导致生成的链接出现中文字符,调用时可能显示乱码(因为WordPress会对中文别名进行编码,实际存储在数据库中的不是中文字符)。由此导致文章链接变得冗长且不美观。那么我们如何解决呢?有四种方法,简单易用。
一、新文章自动使用文章 ID 作为文章的别名
请将以下代码添加到当前主题目录下的 functions.php 文件中,在 PHP 结束标记 `?>` 前插入。这样,新建的文章将自动使用生成的文章 ID 作为文章别名。
/** * WordPress 新文章自动使用 ID 作为别名 * 作用:即使你设置固定连接结构为 %postname% ,仍旧自动生成 ID 结构的链接 */ add_action( 'save_post', 'using_id_as_slug', 10, 2 ); function using_id_as_slug($post_id, $post){ global $post_type; if($post_type=='post'){ //只对文章生效 // 如果是文章的版本,不生效 if (wp_is_post_revision($post_id)) return false; // 取消挂载该函数,防止无限循环 remove_action('save_post', 'using_id_as_slug' ); // 使用文章 ID 作为文章的别名 wp_update_post(array('ID' => $post_id, 'post_name' => $post_id )); // 重新挂载该函数 add_action('save_post', 'using_id_as_slug' ); } }
二、批量修改旧文章的别名为文章ID的四种方法
方法一:在模板函数 functions.php 文件中添加代码实现批量修改旧文章别名;
使用方法:将下边的代码添加到当前主题 functions.php 中
/** * 修改 WordPress 旧文章别名为文章 ID */ function Bing_post_name_id(){ query_posts( 'posts_per_page=-1' ); while( have_posts() ){ the_post(); $post_id = $GLOBALS['post']->ID; wp_update_post( array( 'ID' => $post_id, 'post_name' => $post_id ) ); } wp_reset_query(); } if( $_GET['post_name_id'] == 'yes' ) add_action( 'init', 'Bing_post_name_id' );
放置好代码后,访问一下下边的网站,注意域名替换成自己的域名(https://myqqjd.com替换成 你的域名 ),访问前注意一定要备份数据,以免出错。
https://myqqjd.com?post_name_id=yes
文章多的话网页加载会比较慢,因为正在一篇文章一篇文章的修改别名,要耐心等到网页完全加载好才可以。
方法二:在配置文件 wp-config.php 中添加代码实现批量修改旧文章别名
使用方法:将下面的代码添加到网站根目录的 wp-config.php 文件中,访问一次网站首页(你将看到浏览器一直都在努力打开网页,不要急,耐心等待,直到网页真正打开,所需时间看文章数和网络情况而定)。
等网页打开后,删除刚刚添加到 wp-config.php 的代码!(删除代码是为了防止下次打开网站首页缓慢的情况发生)
/** 批量更改旧文章的别名为文章 ID */ // 添加一个变量来包容文章标题数组,防止重复操作 $slug_done = array(); // 查询所有文章 $posts = $wpdb->get_results( " SELECT `ID`, `post_title` FROM `" . $wpdb->posts . "` WHERE `post_type` = 'post' " ); // 输出文章 foreach( $posts AS $single ) { $this_slug = $single->ID; $slug_done[] = $this_slug; // 使用文章 ID 替换文章原来的别名 $wpdb->query( " UPDATE `" . $wpdb->posts . "` SET `post_name` = '" . $this_slug . "' WHERE `ID` = '" . $single->ID . "' LIMIT 1 " ); }
方法三:直接替换 SQL 数据库里的 post_name 字段的方法(推荐)
执行如下 SQL 命令修改即可:
update wp_posts set post_name=ID where post_status='publish' and post_type='post';
wp_posts 是 WordPress 的文章数据表,wp_ 是默认的前缀,如果自定义更改过,请根据实际修改即可。
方法四:使用新建一个 PHP 文件批量修改旧文章别名
操作方法:将以下代码保存为 php 文件,比如 uppostname.php,并上传到网站根目录,执行即可,成功后记得删除!
/** * 将所以已发布的文章别名修改成对应 ID,让文章以别名完美连续 * PS:备份网站数据库后,请放到 WordPress 根目录执行,成功后请记得删除! **/ require('./wp-blog-header.php'); global $wpdb; $wpdb->query("UPDATE $wpdb->posts SET post_name = ID WHERE post_status = 'publish' AND post_type = 'post'"); echo 'Update Success!';
任选其中一种方法,成功执行之后,你之前发布的文章的别名就全部变成了对应的 ID 了!个人觉得第三种方法简单有效且效率非常好,推荐!