WordPress MU 2.7 から 2.7.1 へバージョンアップしたところ、またもやカテゴリースラッグ(slug)の変更ができなくなってしまいました。
2.7.1 ではもしかするとデフォルトで変更できるようになっているかも、という淡い期待がありましたが、そんなことは露ほどもなく、2.7 より徹底的にできなくしてありました。

■ 2.7と2.7.1の違い

2.7 では、カテゴリースラッグが一応クイック編集で変更できるようになっていて、それがカテゴリー名をサニタイズしたもので上書きされてしまうというものでした。
2.7.1 では、クイック編集からも外されてしまっています。

■ なぜ、MUだけこういうことをするのか

WordPress MU › WordPress MU Forums » Category Slug の MrBrian の回答によると、よくわかんないらしい。

My guess is it’s a security risk, but I don’t know why. There are several differences between normal WordPress and WPMU for security reasons (such as being able to insert javascript into widgets), so it’s not always fair to compare normal wordpress to WPMU. Hope donncha can shed some light on the specifics in your trac ticket.

よくわかんないけど、セキュリティ絡みの問題じゃないの。ウィジェットに入った Javascript が悪さできるみたいなことが WPMUだと問題になるのかもね。詳しくは donncha に聞いてみたら?(超意訳)

TRACをざっと読んだ限りでは、donncha というコミッタがこの問題を仕切ってるみたいで、あれこれ言ってもダメらしい。

■ ほんとに問題か?

考えられる問題としては、パーマリンクにカテゴリースラッグを入れているような場合、カテゴリスラッグを変えるとパーマリンクが変わってしまうということ。
さらに、postsテーブルの guidにパーマリンクが突っ込まれているので、カテゴリスラッグを変えるタイミングで guidも変更しておかないと(たぶん、いまは変更してないと思う)、guidを取扱うような操作で問題がでる(あるはずのレコードがないなど)ということだろう。
カテゴリーの取扱い自体は、wp_*_terms、wp_*_term_relationships、wp_*_term_taxonomyテーブルの object_id、term_taxonomy_id、term_id などの主キーを使っているので、カテゴリースラッグ自体が変わっても問題ないはず。
ということで、結論としては、パーマリンクにカテゴリースラッグを入れない限り、変更しても安全なんじゃないかと思います。普通、post_idを入れてもスラッグまで入れないしね。(do it at your own risk !

■ 追記:問題点を確認しました。

WordPress MUの場合、カテゴリー名は wp_sitecategories というテーブルに入っているのですが、カテゴリースラッグとカテゴリー名を同時に変えると、ここを Updateせずに、古いレコードはそのままにして、新しくレコードを Insertするようになっていました。
そうすると、cat_ID が以前使っていたものと異なってしまうため、カテゴリーIDで投稿を取ってくる部分が動かなくなってしまいます。

query_posts(‘&cat=185&showposts=5&orderby=date’);

投稿記事とカテゴリーの関連などはちゃんとしていますので、こういうコードを自分で書いている人は影響範囲をしっかり確認した上で行ってください。(do it at your own risk !

■ やり方

\wordpress-mu\wp-admin\includes\template.php

function inline_edit_term_row($type) {

	if ( ! current_user_can( 'manage_categories' ) )
		return;

	$is_tag = $type == 'edit-tags';
	$columns = get_column_headers($type);
	$hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($type) ) );
	$col_count = count($columns) - count($hidden);
	?>

<form method="get" action=""><table><tbody>
	<tr class="inline-edit-row">&lt;td colspan=&quot;"&gt;

		<fieldset><div class="inline-edit-col">
			<h4></h4>

			<label>
				<span class="title"></span>
				<span class="input-text-wrap"></span>
			</label>
<!-- ########## ここから追加 ########## -->
			<label>
				<span class="title"></span>
				<span class="input-text-wrap"></span>
			</label>
<!-- ########## ここまで追加 ########## -->


			<label>
				<span class="title"></span>
				 0, 'name' =&gt; 'parent', 'orderby' =&gt; 'name', 'hierarchical' =&gt; 1, 'show_option_none' =&gt; __('None'))); ?&gt;
			</label>



		</div></fieldset>

 
\wordpress-mu\wp-admin\includes\mu.php

function sync_category_tag_slugs( $term, $taxonomy ) {
  if( $taxonomy == 'category' || $taxonomy == 'post_tag' ) {
    if( is_object( $term ) ) {
<!-- ########## ここから追加 ########## -->
      if (empty($term-&gt;slug))
<!-- ########## ここまで追加 ########## -->
        $term-&gt;slug = sanitize_title( $term-&gt;name );
    } else {
      $term[ 'slug' ] = sanitize_title( $term[ 'name' ] );
    }
  }
  return $term;
}

 
以上、WordPress MU 2.7.1 のカスタマイズのお話でした。

2 返信

コメントはクローズされています。