課題
WordPressで日本語のブログを運営していると、日本語タイトルの投稿をすると自動的に生成されるパーマリンク(URL)に日本語が含まれてしまい、見栄えが悪くなったり、共有する際に問題が発生することがあります。
例えば「こんにちは世界」というタイトルの投稿をすると、スラッグは %e3%81%93%e3%82%93%e3%81%ab%e3%81%a1%e3%81%af%e4%b8%96%e7%95%8c のようになります。
これを解決するために、日本語スラッグが生成された場合に自動的に「投稿タイプ+ID」形式に変換するシンプルなプラグインを作成しました。
- 日本語を含むURLは見栄えが悪い
- URLが長くなりすぎる
- SNSでの共有時に問題が発生することがある
- 検索エンジン最適化(SEO)の観点からも望ましくない
解決策
投稿スラッグが日本語(マルチバイト文字をエンコードしたもの)の場合、自動的に「投稿タイプ-ID」形式に変換するシンプルなプラグインを作成しました。
プラグインコード
<?php
/**
* Plugin Name: 日本語スラッグ自動修正
* Plugin URI:
* Description: 日本語スラッグが生成された場合、自動的に「投稿タイプ+ID」に変更します。
* Version: 1.0.0
* Author: Chiilabo
* Author URI: https://chiilabo.jp/
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: japanese-slug-fix
* Domain Path: /languages
*/
// 直接アクセスを防止
if (!defined('ABSPATH')) {
exit;
}
/**
* 日本語スラッグを「投稿タイプ+ID」形式に自動変換する
*
* @param string $slug 生成されたスラッグ
* @param int $post_ID 投稿ID
* @param string $post_status 投稿ステータス
* @param string $post_type 投稿タイプ
* @return string 変換後のスラッグ
*/
function japanese_slug_fix_auto_post_slug($slug, $post_ID, $post_status, $post_type) {
// %文字を含むスラッグ(日本語などのマルチバイト文字が変換されたもの)を検出
if (preg_match('/(%[0-9a-f]{2})+/', $slug)) {
// 「投稿タイプ-ID」形式に変換
$slug = utf8_uri_encode($post_type) . '-' . $post_ID;
}
return $slug;
}
add_filter('wp_unique_post_slug', 'japanese_slug_fix_auto_post_slug', 10, 4);
Code language: HTML, XML (xml)
仕組み
このプラグインは非常にシンプルで、以下のような仕組みで動作します:
- WordPress の
wp_unique_post_slugフィルターフックを使用 - 生成されたスラッグに
%文字が含まれているかチェック(日本語などマルチバイト文字がエンコードされた証拠) - マルチバイト文字が検出された場合、スラッグを「投稿タイプ-ID」形式に変換
- 例:「post-123」「page-45」など
使い方
- プラグインを
japanese-slug-fixなどの名前のフォルダに入れる - そのフォルダを WordPress の
wp-content/plugins/ディレクトリにアップロード - WordPress 管理画面からプラグインを有効化
これだけで、新規投稿時に日本語タイトルを使っても、自動的にクリーンなスラッグが生成されるようになります。
メリット
- コード量が少なく、サイトへの負荷が最小限
- 設定画面不要で、プラグインを有効化するだけで動作
- 投稿タイプとIDによる命名規則で一貫性のあるURLに
- 既存の投稿は変更されず、新規投稿からのみ適用
注意点
- このプラグインを有効化しても、既存の投稿のスラッグは変更されません。
新しく作成される投稿にのみ適用されます。 - 既存の投稿も変更したい場合は、各投稿を編集して保存し直す必要があります。
まとめ
WordPress で日本語サイトを運営する際の小さな悩みを解決するシンプルなプラグインを紹介しました。改良点やフィードバックがあれば、ぜひコメントしてください。