🏡まったのブログ

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進数」になるからですね。