教文館の社内ナレッジベースです。

カスタム投稿タイプ(プラグインを使わない場合)のパーマリンクについては、どうも%postname%がパーマリンクに設定されてしまうようで、投稿スラッグが日本語のまま入力されてしまい、パーマリンクに反映されてしまう。例えばうちのサイト(http://www.kyobunkwan.co.jp/)ではパーマリンクの設定を

/archives/%post_id%

としているんだけれども、カスタム投稿ではこれがなぜか適用されず、

・・・/archives/weblog/知の広場

というような表示になり、URLに日本語が入ってしまう。

別に良いじゃん、と思ったあなた、firefoxを使ってますね。IEで表示させると、URLは

・・・・%E3%82%A6%E3%82%A3%E3%82%AD%E3%・・・・

てな感じで長たらしいものになってしまうのです。決してSEO的にもよくないし、ツイッターと「記事名&URL」を連動させているので、つぶやくときに困る。

そこで、調べたところ「MT Style Post Name」という便利なプラグインが存在することが分かった。それを改良した改良版も出回っているのを知って、自分なりにアレンジ。結果的に

①タイトルに英語が含まれるときはその英語のみを抽出

この投稿のURLの例)・・・archives/weblog/mt-style-post-name

②タイトルが日本語のみの場合、またはタイトルが空白の場合、英数字の組み合わせに変換

上記の「知の広場」の例)・・・/archives/weblog/1a488f0e

以上のように変換される。コードは以下の通り。(<>は全角にしてあります。)

< ?php
/*
* Plugin Name: MT Style Post Name Kai
* Description: MT Style Post Nameのタグ重複問題対応版。スラッグに強制的にタイトルのCRC32値を出力する
* Author: 449, Modified By Butaman-kun
* Plugin URI: http://pc10.2ch.net/test/read.cgi/blog/1163599919
* Version: 0.2.1
* */
add_filter(‘sanitize_title’,’sanitize_title_numalpha_only’,9);
function sanitize_title_numalpha_only($title) {
if(strlen($title) == 0){
return ”;//空文字の入力時は空文字を返す
}elseif(mb_strlen($title) == strlen($title)){
return $title;//2バイト文字が含まれていない場合はそのまま値を返す
}else{
$title_old = $title;

//とりあえず2バイト文字を置換する処理
$title = preg_replace(‘/[^%a-zA-Z0-9 ()_-]/’, ‘-’, $title);
$title = preg_replace(‘/-+/’, ‘-’, $title);
$title = trim($title, ‘-’);

if(mb_strlen($title) == 0) {
//何も残らなかったらCRC32のチェックサムに変換
//(同じ入力に対して同じ出力になればいいのでmd5とかでも良い)
$title = sprintf(“%x”, crc32($title_old));
}
return $title;
}
}
? >