WordPress のパーマリンク構造に %postname% が含まれていて、うっかりパーマリンクの設定をし忘れると、ブラウザのアドレス欄に日本語が表示されたり、 %e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b みたいな感じで、イミフな文字列がならんでしまったりしてあまり気持ちの良いものではありませんよね。
よく分かっているならまだしも、運営を任せていたりすると、そんなURLが大量に発生してげんなり・・・そんな状況もよくあり得ます。
先日フォーラムの 記事のスラッグ名を自動的に記事IDにしたい に回答した内容を一歩進めて、なるべく汎用的に使えるコードを書いてみました。
方針としては、
- 自分で設定したスラッグの場合は、変更しない
- 日本語などマルチバイトの場合は、{投稿タイプ}-{記事ID}に強制的に変更
記事IDのみにしていないのは、IDが4桁の場合、年別のアーカイブとURLの競合が発生する可能性があるため、接頭辞として投稿タイプを付けるようにしています。ここらへんは各自お好みで。(articleとか固定のものでも大丈夫ですよね。)
CODE 1 では、マルチバイトをエンコードした場合の % + 16進数2桁 がスラッグに見つかったら、強制的に変更するロジックになっています。もれなどありましたら、ご意見ください。
CODE 1
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) { if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) { $slug = utf8_uri_encode( $post_type ) . '-' . $post_ID; } return $slug; } add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4 );
はじめまして。
「the Event Calendar」というプラグインで、パーマリンクが変更できなかったので、こちらの記事を参考にカスタマイズしました(プラグインをインストールすると「tribe_event」というカスタム投稿ができるので、このpost_typeにだけ適用)。
うまく個別のイベントのスラッグが自動で変更できたのですが、固定ページのスラッグ編集の部分が消えてしまいました。
何か回避方法はありますでしょうか?
使用バージョン:WordPress3.5.1
以下の内容をfunctions.phpに記述しました。
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
if( $post_type == 'tribe_events' ){//イベント情報の時だけ実行
if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) {
$slug = 'event' . $post_ID ;
}
return $slug;
}
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4 );
return 分を if の条件分岐の外に出してください。
jim912様
うまくいきました!
ありがとうございました。
初めまして。
WordPressをマルチサイト化し、buddypress1.9.2+bbpress2.5.3でSNSサイトを運営しています。フォーラムにて問題が起きたので、ご教授いただければと思います。
パーマリンクを「/%postname%/」にしていますが、複数人で記事を投稿しているためpostnameの変更が面倒なのでコチラで紹介されているCODE1を使用させていただいています。
そうした場合、bbpressのフォーラムにもCODE1が適用されてしまうのか、投稿した全てのトピックが「http://hogehoge.com/forums/topic/topic-0/」というURLになってしまいます。
フォーラムのみpost_idにする方法はありますでしょうか?回答の方宜しくお願いいたします。
はじめまして。
検索でたどり着きました。
この記事の内容を応用して「カテゴリ」や「タグ」のスラッグをアルファベットのみ使用するようにできませんでしょうか。
記事からカテゴリやタグを追加した際にスラッグの編集ができず、あとから一覧で変更するのがひと手間なので。
ご教授いただければ幸いです。
はじめまして、hahaと申します。
いろいろ調べていたらここにたどり着きました。
少しアドバイスをいただけないかと思いまして。
現在ワードプレスのプラグインのbbpressを使ってサイトを作っています。
日本語のUPLはやめて
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
if ( preg_match( ‘/(%[0-9a-f]{2})+/’, $slug ) ) {
$slug = utf8_uri_encode( $post_type ) . ‘-‘ . $post_ID;
}
return $slug;
}
add_filter( ‘wp_unique_post_slug’, ‘auto_post_slug’, 10, 4 );
を使用しています。
通常は機能しているのですが、新規ユーザー(外部)がトピックを作ると同じURLになってしまいます。topic-0です。
******/forums/topic/topic-0/
なんとかしたいのですが、アドバイスいただけないでしょうか?
スラッグが毎回 topic-0 になってしまう件について、とりあえず下記のコードで回避できると思います。
`function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
if ( empty( $post_ID ) )
return ”; // 新規投稿でIDがゼロの場合はスラッグを未定とする
if ( preg_match( ‘/(%[0-9a-f]{2})+/’, $slug ) ) {
$slug = utf8_uri_encode( $post_type ) . ‘-‘ . $post_ID;
}
return $slug;
}
add_filter( ‘wp_unique_post_slug’, ‘auto_post_slug’, 10, 4 );
`