前言

作为一个强迫症程序员,看着 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 文件,在文件的末尾添加以下代码:

functionset_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' );