BuddyPressでグループ名に日本語を使うと起こる面倒な事とその対策

BuddyPressのバージョンは1.5.1です。

仕様

BuddyPressはグループ名やトピック名をそのままURLに使います。
名前がマルチバイトの場合はURLエンコードされたものが利用されます。
記事を作るときのスラッグと同じです。

例:
グループ名を「日本語」として作った場合の、「日本語グループ」のURLは
http://example/group/%93%fa%96%7b%8c%ea


URLに利用する為の文字列を保存しているのは

グループの場合 wp_bp_groups -> slug というレコードです。
トピックの場合 wp_bb_topics -> topic_slub というレコードです。

グループにアクセスするとBadRequest

上記レコード、長さが100しか無い為、
日本語でグループ名をつけると11文字くらいでURLエンコードした文字が削られるのか、
そのグループにアクセスできなくなるという現象が起こります。

また、僕がやった場合はIIS6.0でやっていたからか404エラーが返ってきて
1文字のグループ名であろうがアクセスできなくなりました。
これはまぁ別の理由なんだろうけどドイヒーな話です。

どうしたらいいのかなぁ

ネットで色々調べてみた所

・一旦英語でグループを作ってから名前を日本語に戻す
・slugの長さを100→255にする事でもう少し文字が入るようになる

みたいな運用でのカバーをすれば良いって書いてありましたが、
トピックを作るのは管理人じゃないし、
そんなん使う人が面倒くさいしやってられないなぁと思ったので、
名前=スラッグ という仕様を変えたろうと思いました。

グループの対応

触る場所:wp-content\plugins\buddypress\bp-groups\bp-groups-classes.php
93行目くらい

// $this->slug からuniqid() に変更
$sql = $wpdb->prepare(
	"INSERT INTO {$bp->groups->table_name} (
		creator_id,
		name,
		slug,
		description,
		status,
		enable_forum,
		date_created
	) VALUES (
		%d, %s, %s, %s, %s, %d, %s
	)",
		$this->creator_id,
		$this->name,
		uniqid(), /* ←ココ!! */
		$this->description,
		$this->status,
		$this->enable_forum,
		$this->date_created
);

はい。INSERT文を生成するところでslugをuniqid()にしてしまいます。

トピックの対応

触る場所:wp-content\plugins\buddypress\bp-forums\bbpress\bb-includes
223行目付近

$topic_slug = uniqid(); // 追加
$bbdb->insert( $bbdb->topics, compact( $fields ) );
$topic_id = $bbdb->insert_id;
$bbdb->query( $bbdb->prepare( "UPDATE $bbdb->forums SET topics = topics + 1 WHERE forum_id = %d", $forum_id ) );
wp_cache_delete( $forum_id, 'bb_forum' );
wp_cache_flush( 'bb_forums' );
wp_cache_flush( 'bb_query' );
wp_cache_flush( 'bb_cache_posts_post_ids' );
do_action( 'bb_new_topic', $topic_id );

INSERTを発行する直前で、slugをuniqid()で書き換えちゃいます。

結果

これで再度グループを作ってみると

uniqidは現在時刻を元にidを生成するので、こんなURLになります。
日本語のグループを作っても大丈夫。

ただし、ミリ秒まで同じタイミングでuniqidを実行すると同じ戻り値になる
すなわち同じスラッグになるからバグるという諸刃の剣。
人気あるサイトにはお勧めできない。

また、URLは意味のある文字で構成されていないダメだという方にも向きません。