使用WordPress博客的站长朋友肯定对文章别名不陌生,很多人的固定连接都是围绕着文章的 ID(/%post_id%.html) 展开的,而在国外很多站点的固定链接都是采用文章别名的。且有些插件和主题是必须要设置%postname%.html 这样的别名固定链接才能使用,而中文站点自动生成的文章别名直接是汉字(默认为文章的标题生成为文章别名),就会出现中文链接,那么调用出来的将会是一堆乱码(因为WordPress对中文的别名进行了编码,在数据库中存储的不是中文),文章链接地址也会很长,不利于SEO优化,非常不好。
为了SEO优化,在不改变以前的用文章ID作为文章链接地址且已经被收录的文章则要保证全部还能访问,不会造成了大量的死链接。这样就需要我们手动修改别名(WordPress使用自动生成的文章ID作为文章别名),今天就介绍怎么用纯代码实现直接将 WordPress 所有文章别名设置为文章ID的方法。
警告:为了安全起见,所有设置数据库的操作务必记得先备份网站的数据库,避免因失误带来无法挽回的损失!然后再按照下文操作!
一、修改固定链接结构
在后台的 “设置” → “固定连接” → “自定义结构”选项 里设置一下固定连接,把 ID 改成别名,也就是把固定连接里的 /%post_id%.html 改成/%postname%.html
二、批量修改旧文章(现在数据库里面的文章)的别名为文章 ID 的四种方法
方法一:在模板函数 functions.php 文件中添加代码实现批量修改旧文章别名
使用方法:将下边的代码添加到到当前主题目录下 functions.php 文件,在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' );
放置好代码后,访问一下下边的网站,注意替换成你的域名,访问前注意一定要备份数据,以免出错。
http://www.XXXXXX.com?post_name_id=yes
文章多的话网页加载会比较慢,因为正在一篇文章一篇文章的修改别名,要耐心等到网页完全加载好才可以。
PS:加载好后,删除之前添加的代码,修改完成,所有文章的别名都会变成自身的ID。
不过这个方法我试过,一般情况下都会造成页面502错误。所以文章比较多的话,不建议使用这种方法;
方法二:在配置文件 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 字段的方法
进入 mysql 命令【 选择你所创建的数据库的命令:mysql> USE MYSQLDATA; (注:MYSQLDATA是数据库的名称。按回车键出现 Database changed 时说明操作成功!) 】或者 phpmyadmin 的 SQL (登录后打开数据库管理系统,找到网站对应的wordpress数据库,点击后,在上方有个SQL按钮) ,执行如下SQL命令修改即可:
update wp_posts set post_name=ID where post_status='publish' and post_type='post';
PS:wp_posts 是 WordPress 的文章数据表,wp_ 是默认的前缀,如果自定义更改过,请根据实际修改即可。
这种方法强烈建议,很快!
方法四:使用新建一个 PHP 文件批量修改旧文章别名
操作方法:将以下代码保存为 php 文件,比如 uppostname.php,并上传到网站根目录,执行即可,成功后记得删除!
<?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 了!这时候你就可以放心大胆的将固定链接设置为/%postname%.html 了!
三、新文章自动使用文章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' ); } }
文章来源:http://aszhi.com/web/wordpress/32.html
本文地址:WordPress用文章ID做文章别名的几种办法
发表评论