bbPressで日本語トピック名にするとスラッグが全てtopic-0になってしまう問題の対処法
結論、bbPress Permalinks with ID プラグインを入れよ。2019年6月時点で最終更新は3年前でしたが問題なく動作しました。
問題の背景
日本語だとスラッグ名が $post_type . '-' . $post_ID
になるようですが、なぜか$post_IDは常に0になってしまうので、すべてのトピックのURLが同じになってしまいます。
以下のようにコードで投稿日時をスラッグにすることもできたのですが、これだとトピックと返信の編集を1回行うと、編集期限に関わらず編集
ボタンのリンクURLが/reply/edit
になってしまい編集できなくなる不具合がでました。
function post_slug_to_date( $slug, $post_ID, $post_status, $post_type ) {
// 投稿IDが空、もしくはスラッグが日本語(デコード後)だったら
if ( empty( $post_ID ) || preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) {
$slug = utf8_uri_encode( $post_type ) . '-' . date_i18n("Y-m-d-H-i-s");
return $slug;
}
}
add_filter( 'wp_unique_post_slug', 'post_slug_to_date', 10, 4 );
一発解決のプラグインがあった
なのでスラッグ名を正しい投稿IDに変換してくれる bbPress Permalinks with ID プラグインを入れるのがシンプルで手っ取り早いです。
余談
改めてpreg_match( '/正規表現/', 文字列)
の使い方の理解が甘いと感じました。
(%[0-9a-f]{2})+
という正規表現は%
と0-9もしくはa-f
のいずれかを使った2桁
が複数回繰り返されるという意味です。
日本語でサンプルトピック
というトピック名にすると、デコード後の$slug
は%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%83%88%e3%83%94%e3%83%83%e3%82%af
となります。この形式だと上記の正規表現にマッチするわけです。
アルファベットがfまでなのはデコードすると「%と16進数」になるからですね。