[PHP] 文字長がnバイト以下になるまで末尾の文字を1字づつカット
スポンサーリンク
WordPressのURLスラッグは、”wp_posts”テーブルの”post_name”カラムに保存されます。post_nameの構造はvarchar(200)ですから、シングルバイト文字は200字まで使えますが、マルチバイト文字は22字までしか使えません。マルチバイト文字はURLエンコードされた上で保存されますから、1文字が3バイトでそれが3桁、つまり1字あたり9バイトが保存に必要なスペースとなります。200 / 9 = 22.222….ということで22字です。もし日本語URLを使っている場合、22字は頻繁にオーバーしてしまう字数です。
普通に使っている場合、WordPress側が上手く扱ってくれるので、スラッグの字数のことを気にする必要はありません。しかし、WordPress外部から日本語の単語にもとづきWordPressサイトへのリンクを作成する際には、字数を調整していかねばなりません。
さて、この単語は英数字も混じるのですが、英数字は半角のため、保存時のバイト数は1バイトです。つまり、日本語だけで23字なら末尾の1文字はカットされてしまいますが、日本語22字+半角2字の文字列なら、バイト数は200となりそのまま保存されるということになります。ということは、単純に文字数で判定し、22字以上なら末尾をカットではダメということです。
そこで、URLエンコードした後の文字長が200バイト以下になるまで末尾から1字づつカットするコードを書くことにしました。
$slug = "日本語とalphabetが混じった文字列"; while ( strlen(urlencode($slug)) > 200 )//URLエンコード後の文字長が200バイト以下になるまでループ $slug = mb_substr($slug, 0, -1);//末尾の1字をカット
判定はバイトで行い、カットは字数で行ったわけですね。WordPress内部も同じようなコードじゃないかと思います。
書いてみれば簡単なコードで、覚書を残すまでもないような気もしますが、初めに用途が必要になった時にしばらく考えこんでしまったのでメモを残しておくことにします。
スポンサーリンク
PHPカテゴリーの投稿
- [PHP] 配列からランダムに値を取得する
- [PHP] 配列へのヒアドキュメントまたはNowdocの追加
- [PHP] 変数を展開しないヒアドキュメント「Nowdoc」
- [PHP] Cookieの取得
- [PHP] 配列が連想配列かどうかを判定
- [PHP] 空配列の扱いと判定
- [PHP] アルファベットの大文字・小文字変換を行う全関数
- [PHP] 1を1st、2を2nd、3を3rd、4以上を4thに変換する関数
- [PHP] 数値の先頭の0を取る4つの方法と速度
- [PHP] Twitter bootstrapのform-horizontalを楽に使う関数
WordPressカテゴリーの投稿
- [WordPress] 記事が更新された回数を取得する
- [WordPress] ダッシュボードのウィジェットを表示オプションを使わずに非表示化する
- [WordPress] 関連記事をカテゴリーに基づきアイキャッチ画像つきで表示
- [WordPress] バックアッププラグインの特徴と機能比較
- [WordPress] タグ版wp_list_categories
- [WordPress] have_comments()がFALSEを返しコメントが表示されない現象
- [WordPress] 個別記事ページでカテゴリーを表示するときの目的別の方法
- [WordPress] wp_insert_post()でhtmlタグが除去されるのを防ぐ
- [WordPress] カテゴリー・タグ・カスタムタクソノミーを外部から登録・編集する
- [WordPress] カスタムフィールドで一つのキーに複数の値を保存