目標のURL構造
「WordPressでSEO的に理想のパーマリンクを実現してみる」という事ですが、具体的なコードを書く前に、一つお伝えしたいことがあります。
前回の記事では理想のURLは
http://bookof.com/book/technical/pc/web/css/487311232X/
/カスタムタイプ名/親ターム名/子ターム名/孫ターム名/…/個別スラッグ/
としていましたが、本当は違います。
ってか無理…というか厳しい。
その理由は、今回理想のURL構造(ツリー型でディレクトリ構造のまま、URLをアドレスバーから直接操作しても内容のないページは作らない)を目指す為には、カテゴリーやタグ・タクソノミー名を含みたくない。
とすると、cssというタグのアーカイブページも作りたくなると問題になってくる
というように、リライトルールを適応しようとしても、タグなのかカテゴリーなのか、他のタクソノミーなのかを判断する材料がURLに含まれていないのでどっちを表示していいのか解らない。
ということで、今回目指すURLの中にどうしてもタクソノミー名が必要になってくる。
しかし、URLのツリー構造の中に内容のないページは含まれたくないので、今回の目標は下記のようにする!
今回は上記のように、タクソノミー名とターム名をアンダースコアで区切る形にします。
使用テーマのfunction.phpに追記
では具体的なコードを書いてみましょう。
まずずっとご説明してきたとおり、WPに上記の新しいリライトルールを設定します。
使用しているテーマのfunction.php等に下記を追記
function
ChangeRewriteRules(
$mypost
,
$myterm
,
$parents
) {
if
(
$myterm
->parent == 0 ) {
$newrules
[
'archive'
][
$mypost
.
'/'
.
$myterm
->taxonomy .
'_('
.
$myterm
->slug .
')/?$'
] =
'index.php?'
.
$myterm
->taxonomy .
'=$matches[1]'
;
$newrules
[
'archive'
][
$mypost
.
'/'
.
$myterm
->taxonomy .
'_('
.
$myterm
->slug .
')/page/([0-9]+)/?$'
] =
'index.php?'
.
$myterm
->taxonomy .
'=$matches[1]&paged=$matches[2]'
;
$newrules
[
'single'
][
$mypost
.
'/'
.
$myterm
->taxonomy .
'_'
.
$myterm
->slug .
'/([^/]+)/?$'
] =
'index.php?'
.
$mypost
.
'=$matches[1]'
;
$newrules
[
'single'
][
$mypost
.
'/'
.
$myterm
->taxonomy .
'_'
.
$myterm
->slug .
'/'
. implode(
'/'
,
$parents
) .
'/([^/]+)/?$'
] =
'index.php?'
.
$mypost
.
'=$matches[1]'
;
$parents
[
count
(
$parents
)-1] =
'('
.
$parents
[
count
(
$parents
)-1] .
')/'
;
$newrules
[
'archive'
][
$mypost
.
'/'
.
$myterm
->taxonomy .
'_'
.
$myterm
->slug .
'/'
. implode(
'/'
,
$parents
) .
'?$'
] =
'index.php?'
.
$myterm
->taxonomy .
'=$matches[1]'
;
$newrules
[
'archive'
][
$mypost
.
'/'
.
$myterm
->taxonomy .
'_'
.
$myterm
->slug .
'/'
. implode(
'/'
,
$parents
) .
'page/([0-9]+)/?$'
] =
'index.php?'
.
$myterm
->taxonomy .
'=$matches[1]&paged=$matches[2]'
;
$parentterm
= get_term_by(
'id'
,
$myterm
->parent,
$myterm
->taxonomy);
array_unshift
(
$parents
,
$myterm
->slug);
$newrules
= ChangeRewriteRules(
$mypost
,
$parentterm
,
$parents
);
function
MyRewriteRules(
$rules
) {
$newrules
=
array
();
$toriaezu
=
array
();
$single
=
array
();
$archive
=
array
();
$myposts
= get_post_types(
array
(
'_builtin'
=> false));
foreach
(
$myposts
as
$mypost
) {
$mytaxonomies
= get_taxonomies(
array
(
'object_type'
=>
array
(
$mypost
)));
foreach
(
$mytaxonomies
as
$mytaxonomie
) {
$myterms
= get_terms(
$mytaxonomie
,
array
(
'hide_empty'
=> 0) );
foreach
(
$myterms
as
$myterm
) {
$toriaezu
= ChangeRewriteRules(
$mypost
,
$myterm
,
array
());
$single
+=
$toriaezu
[
'single'
];
$archive
+=
$toriaezu
[
'archive'
];
return
$archive
+
$single
+
$rules
;
add_filter(
'rewrite_rules_array'
,
'MyRewriteRules'
);
上記を簡単に説明すると、①のadd_filterで、rewrite_rules_arrayというフィルターフックに引っ掛ける。
rewrite_rules_arrayは引数に既に設定されているリライトールを
$rules[該当するルール] = “本当の姿”;
の形で持っているので、ここに新しいルールを追加して返します。
②で全てのカスタムタイプを取得してそれぞれをループ。
ループ内で、カスタムタイプ毎に設定されているタクソノミーを全て取得して、更にループ。
更にそれぞれのタクソノミーに設定されているタームを全て取得して、一つ一つに対して④の処理を実行。
④で
http://bookof.com/book/type_technical/pc/web/css/
にアクセスがあったら、
index.php?type=css
の内容を表示しなさい。
http://bookof.com/book/type_technical/pc/web/css/page/2/
にアクセスがあったら、
index.php?type=css&paged=2
の内容を表示しなさい。
http://bookof.com/book/type_technical/pc/web/css/487311232X/
にアクセスがあったら、
index.php?book=487311232X
の内容を表示しなさい。
の形の新しいルールを作成
配列に入っている順番で優先順位が変わるので⑤で調整して、
⑥で、古いルールに新しいルールを足して返す。
これで、新しいカスタムルールの設定は完了いたしました。
Custom Post Type Permalinksを入れる
次に「Custom Post Type Permalinks」プラグインを入れて、カスタム投稿タイプのパーマリンクの設置を変更いたします。
カスタム投稿を作ったら、それに割り当てるタクソノミーが色々あると思います。
今回の場合は
type (本のジャンル)
その他に例えば価格(price)・出版社(publisher)・著者(writer)等が考えられます。
その中から、singleページヘのURLのベースとなるタクソノミーを選びます。
http://bookof.com/book/price_1500-2000/
http://bookof.com/book/publisher_oreilly/
http://bookof.com/book/type_technical/pc/web/css/
今回の場合は、ユーザービリティ等を考えて
本の種類の軸
http://bookof.com/book/type_technical/pc/web/css/487311232X/
を本詳細ページまでのベースのURLとします。
その場合は、カスタム投稿タイプのパーマリンクの設置の
「book」のフィールドに
/type_%type%/%postname%/
と入力して変更を保存
(typeの部分は、詳細ページへの軸となるタクソノミー名に変更して下さい。)
上記でとりあえず理想のURLにアクセスした際に、URLを解決してパラメーターから正しいページの内容を表示できるようになりました。
http://bookof.com/book/type_technical/pc/web/css/
http://bookof.com/book/type_technical/pc/web/css/page/2/
http://bookof.com/book/type_technical/pc/web/css/487311232X/
でアクセスできるようになった!
この形なら、アドレスバーを直接操作しても404ページは含まれずに、本の種類の軸で正しいツリー構造になっている。(pageの事は置いといて下さいっ汗)
これで理想のURLにアクセスして内容を表示できるようになりましたので、今度は「Breadcrumb NavXT」プラグインを使って、このURL構造にぴったしあったパンくずリストを作ってみよう。