很多人会把WordPress文章的固定链接设置为postname
,也就是自己对每篇文章定义一个别名,作为文章的固定链接。这样使得文章链接更有意义,也有利于SEO优化。
而如果使用离线发布WordPress博客的时候,往往不能直接设置postname
,不得不发表到博客后自行修改。例如在我的这篇文章中,使用为知笔记作为离线编辑器,就会有这样的烦恼。
WordPress+Markdown+为知笔记,实现高质量笔记和博客
https://www.paincker.com/wp-markdown-wiz-blog
本文提供了一种简便易行的方法,完美解决了这个问题。
设置固定链接
首先肯定是要设置固定链接包含postname
,如果没有这个需要,也就不需要看本文了。在设置-固定链接中将固定链接设置为自定义:/%postname%
。
修改WordPress主题
在WordPress主题的functions.php
中添加下面的代码。
// 文章自动别名
function post_auto_slug( $postid ) {
global $wpdb;
$sql = "SELECT post_title,post_name FROM $wpdb->posts WHERE ID = '$postid' AND post_type = 'post' AND post_parent = '0'";
$results = $wpdb->get_results($sql);
if( empty($results) ) {
return false;
}
$post_title = $results[0]->post_title;
$post_name = $results[0]->post_name;
$pos = strrpos( $post_title , '@@' );
if( $pos > 0 ) {
$slug = substr( $post_title, $pos + 2 );
if( ! empty( $slug ) ) {
// 创建唯一的postname
$post_name_check = true;
$suffix = 1;
$after = '';
$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != '$postid' LIMIT 1";
while ( $post_name_check ) {
if ( $suffix > 1 ) {
$after = '-' . $suffix;
}
$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug . $after ) );
$suffix++;
}
$post_name = $slug . $after;
}
$post_title = substr( $post_title, 0, $pos );
$sql = "UPDATE $wpdb->posts SET post_name = '$post_name', post_title = '$post_title' WHERE ID = '$postid'";
$wpdb->query($sql);
}
}
add_action( 'publish_post', 'post_auto_slug' );
发布文章
发布文章时,将文章的标题设置为标题@@postname
形式,即可自动处理。如果你的文章标题中就需要包含@@
字符,你可以在上面的PHP代码中,将其改成其他分隔符。
前面的post_auto_slug
方法的作用是,在文章发布前,将文章标题从@@
符号截断为两部分,前面一半作为最终的标题,后面一半设置为postname
,且对重复的postname
自动添加后缀。例如已经有postname
为test
的文章,再次发送文章标题@@test
,则自动改成test-2
的形式。保证每篇文章的postname
独一无二,这样才能正常通过网址访问。
最后,欢迎扫码关注微信公众号。程序员同行学习交流,聊天交友,国内外名企求职内推(微软 / 小冰 / Amazon / Shopee / Coupang / ATM / 头条 / 拼多多等),可加我微信 jzj2015 进技术群(备注进技术群,并简单自我介绍)。

本文由jzj1993原创,转载请注明来源:https://www.paincker.com/wp-auto-postname
(标注了原文链接的文章除外)
为知笔记可以给文章设置SEO名称,发布之后SEO名称就是文章的别名啦