はじめに

私はずっと強迫観念のように気になっていたのですが、WordPress の記事にある post_name フィールドを設定しない場合、デフォルトではタイトル titlepost_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' );