前言
作为一个强迫症程序员,看着 WordPress 的文章中有个字段 post_name
如果不设置的话,就会默认使用标题 title
作为 post_name
,导致使用 post_name
作为文章 url 的时候会出现中文,看着很不协调。
但是我又不想每次发表文章时手动去设置 post_name
,本文就介绍一种将 post_name
默认设置成与 ID 相同的方案。
批量替换现有数据
首先将已经发布的文章给全部替换掉,直接用 sql 语句
UPDATE wp_posts SET post_name = ID;
这里的 wp_posts
是 WordPress 数据库中的文章表
发布文章自动修改
要在 WordPress 中每次发布或更新文章时,默认将 post_name
设置为与 ID 相同,可以通过添加自定义功能来实现此功能
打开 WordPress 主题文件夹中的 functions.php
文件,在文件的末尾添加以下代码:
function set_postname_as_id( $post_id ) {
$post = get_post( $post_id );
$post_name = $post->post_name;
$post_id = $post->ID;
if ( $post_name != $post_id ) {
$args = array(
'ID' => $post_id,
'post_name' => $post_id,
);
wp_update_post( $args );
}
}
add_action( 'save_post', 'set_postname_as_id' );
保存并上传 functions.php
文件到您的 WordPress 主题文件夹
每当发布或更新文章时,WordPress 将检查文章的 post_name
是否与 ID 相同。如果不同,它将自动更新 post_name
为 ID。请注意,这将影响所有类型的文章,包括页面和自定义文章类型。如果只想应用于特定类型的文章,可以在 set_postname_as_id
函数内添加适当的条件检查。
比如我用的是 b2 主题,我想替换所有的文章类型,除了 page 页面,可以改成下面这样:
function set_postname_as_id( $post_id ) {
// 获取文章对象
$post = get_post( $post_id );
// 获取当前文章的 post_name 和 ID
$post_name = $post->post_name;
$post_id = $post->ID;
// 检查文章类型是否为 page,如果是则返回
if ( $post->post_type == 'page' ) {
return;
}
// 检查 post_name 是否与 ID 不同
if ( $post_name != $post_id ) {
// 准备要更新的文章参数
$args = array(
'ID' => $post_id,
'post_name' => $post_id,
);
// 更新文章的 post_name 为 ID
wp_update_post( $args );
}
}
// 在保存文章时触发自定义功能
add_action( 'save_post', 'set_postname_as_id' );