[WordPress開発] パーマリンクに日本語が含まれているときに警告を出す

パーマリンクとは

ブログを作る上でよく使われる、オープンソースソフトウェアである「WordPress」の、ちょっとした開発ネタを書きたいと思います。

WordPressの設定では、パーマリンクを有効化しているWebサイトも多いかと思います。ちなみにパーマリンクとは、以下のようなものです。

パーマリンクとは、Webページの中の個別のコンテンツに対して設けられたURLのことである。特に、ブログにおける個々のエントリー(毎日の記述)に対して割り当てられたURLを指すことが多い。パーマリンク(Permalink)は、恒久・不変を意味する「パーマネント」(permanent)と「リンク」(link)が掛け合わされた造語である。

端的に言うと、ブログ内の個々のエントリーに対する、ユニークな名前のことです。これを、WordPressを使っている多くのブログサイトではURLになるように設定しています。弊社ブログもそのようにしています。

パーマリンクに日本語を使いたくない

このパーマリンクですが、日本語も使えるようになっています。その場合はURLエンコードされるので、URL自体は日本語を使わない場合と比べると長くなってしまいます。

例えば、以下のようなパーマリンクにしたい場合、

https://dev.classmethod.jp/tool/wordpress/日本語のブログだよ

以下のようになります。

https://dev.classmethod.jp/tool/wordpress/%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%81%ae%e3%83%96%e3%83%ad%e3%82%b0%e3%81%a0%e3%82%88

こうなってしまった場合、エントリーがシェアしづらくなる問題を抱えてしまうことになります。

  • 文字数制限のあるサービスでシェアできない
  • URLで紹介される可能性が低くなる(心理的にシェアしづらくなる)

以下の記事でも解説されていますので、あわせてお読みください。

こうなってしまわないように、WordPressをカスタマイズすることで解決できる方法を考えました。

WordPressをカスタマイズする

今回は下記の機能を作りました。

  • 記事の編集画面を開いたときに発動する
  • パーマリンクを正規表現にマッチしなかった場合にアラートを表示する
  • 保存自体を弾くことは行わない
    • 処理が複雑になってしまうため、シンプルにアラートだけ出すようにしている

まず wp-content/themes/<任意のテーマ> の中に、下記のファイルを作成します。

<?php
/* *****************************
 *
 * パーマリンクを検証する
 *
 **************************** */
add_action('admin_notices', 'validate_permalink');

function validate_permalink() {
  global $pagenow;
  if ($pagenow == 'post.php') {
    $post_name = get_post()->post_name;
    $decoded = urldecode($post_name);
    if (!preg_match('/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/', $decoded)) {
      echo '<div class="message error"><p>パーマリンク(URL)に日本語が含まれています!修正してから公開してください。</p></div>';
    }
  }
}

解説します。

まずこのアクション自体は admin_notices をフックしていますので、管理画面のいずれかを開くたびに発動します。11行目では post.php (つまり、記事の編集画面) の場合のみ処理するようにしています。

12行目で post_name からパーマリンクを拾ってきています。この時点でURLエンコードされた状態で取得できるので、13行目でデコードしてから検証を行なっています。そうしなければ、URLエンコードされた文字列の状態で検証してしまうことになり、日本語として弾くことができません。

15行目では message error というクラスを使うことにより、WordPressの管理画面のエラーメッセージとして出力しています。

あとは、このファイルを functions.php で読むように設定するだけです。

require( dirname(__FILE__) . 'validate_permalink.php' );

動作確認

ということで、動作を確認してみます。記事を新規作成し、パーマリンクが日本語の状態で保存します。

エラーが表示されました。これを修正すると…

エラーが消えます!

まとめ

正規表現の部分はカスタマイズすれば「ある文字列だけ除外する」ということもできますし、「記号すら許さない」なんてこともできます。

日本語でパーマリンクを作りたくない場合、ぜひ試してみてください。

参考

本記事に執筆にあたり、下記のブログを参考にしました。