aoyama

2013.06.27

WordPressのURLの構造で(標準では)出来ない事

どーも、青山です。

最近は自社サービスの比率がゼロになり、受託案件を主に担当しています。
昨年末から、Wordpressを触る様になりましたが、まだまだ知識が足りないことが
多く、その都度、はまったり、調べたりの連続です。

CMSはMTを触っていた事もあり、同じような感覚で、これは出来るだろうと思って
いた事が出来なかったりする事もあり、Wordpressの仕組みを考えれば、
「普通では無理」と分かるのですが、うっかりして勘違することも。

そんな中で、今回は「WordpressのURLの構造で(標準では)出来ない事」について書こうと思います。
Wordpressについて良くご存知の方は、「当たり前の事」だと思いますが、
「出来る事」についてはよく記事を見かけますが、「出来ない事」に焦点があたっている
ことは、少ないので、何かの役に立てばと思います。

さて、前置きがながくなりましたが、まずは、標準のURLのおさらいから。
(このブログのURLを例に挙げます。)

▼固定ページ
http://tech.aainc.co.jp/?page_id=###
▼著者ページ
http://tech.aainc.co.jp/?author=###
▼年月アーカイブ
http://tech.aainc.co.jp/?m=yyyymm
▼カテゴリーアーカイブ
http://tech.aainc.co.jp/?cat=###
▼タグアーカイブ
http://tech.aainc.co.jp/?tag=slug
▼パーマリンク
http://tech.aainc.co.jp/?p=###

この記事のURL(パーマリンク)を見て、違うじゃんというツッコミ
をいれて下さった方、ありがとうございます。

これも、皆さん当たり前の様にご存知だと思いますが、
Wordpressの管理画面 > 設定 > パーマリンク設定

「数字ベース」を選んでいるからです。
数字ベースを選ぶと各種ページのURLは下記のような感じになります。

▼固定ページ
http://tech.aainc.co.jp/slug
▼著者ページ
http://tech.aainc.co.jp/author/username
▼年月アーカイブ
http://tech.aainc.co.jp/archives/date/yyyymm
▼カテゴリーアーカイブ
http://tech.aainc.co.jp/category/slug
▼タグアーカイブ
http://tech.aainc.co.jp/tag/slug
▼パーマリンク(数字ベース)
http://tech.aainc.co.jp/archives/###

他にも、パーマリンク設定には「カスタム設定」と言うものがあり、パーマリンクをデフォルト
以外を選択する時に分かると思いますが、カテゴリーを表す「%category%」構造タグを使って
URLの構造を指定可能です。

▼日付と投稿名
http://tech.aainc.co.jp/%year%/%monthnum%/%day%/%postname%/
▼月と投稿名
http://tech.aainc.co.jp/%year%/%monthnum%/%postname%/
▼数字ベース
http://tech.aainc.co.jp/archives/%post_id%
▼投稿名
http://tech.aainc.co.jp/%postname%/

となかなか本題に入って行かなかったのですが、ようやく本題です。
出来ると思って、出来なかったこと、それはパーマリンクを下記の様に
カテゴリーに属するような形にした時の話です。

▼カスタム設定
http://tech.aainc.co.jp/category/%category%/%post_id%/
▼カテゴリベース
category
を指定し、下記のようなURL構造の実現を期待。

▼カテゴリA(cata)を指定した投稿のパーマリンク
http://tech.aainc.co.jp/category/cata/###/
▼カテゴリA(cata)のアーカイブ
http://tech.aainc.co.jp/category/cata/

各カテゴリのアーカイブが上記のような場合、
全てのカテゴリーを横断したページのURLを

http://tech.aainc.co.jp/category/

としたくなるのが人情じゃないですか。
(そんな事は無いと思った方は、さようなら、ここまで読んでくださってありがとうございまいした。)
あら、残念。これが、出来ません。

さて、何ででしょうか。
デフォルトのURLを見て下さい。
index.phpが省略されていますが、Wordpressは基本的に、index.phpにどのページを表示しろという
クエリを渡して、指定されたページを表示しているんです。

それでは、「デフォルト」以外を選択した場合はどうなんでしょう。
「.htaccess」の編集権限があればWordpressが勝手に以下の内容を追記していると思います。

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

.htaccessやmod_rewriteの話をするとますます長くなるので、割愛しますが、
ようは、実ファイルや実ディレクトリが無ければ、index.phpにrewrite(書き換えて)
index.phpが呼ばれたことにするって感じです。

その後、指定されたURIとパーマリンク設定から指定されたページを特定しています。
そのため、「固定ページ」「カテゴリーページ」「パーマリンク」の設定が入り乱れていると
うまくパーマリンクが認識されないことになります。
Codex 日本語版 パーマリンクの使い方にも
「構成タグあるいは構成タグの組み合わせのみを使用してください。 」
と書いてありますね。

実際、この問題は、無理矢理 .htaccessやfunctions.phpに力技で設定をして実現したのですが、
管理画面に表示されるパーマリンクのURL、プレビューのURLが実際のものと異なるので、
積極的にはお勧めしません。

※「WP No Category Base」というプラグインがあり、その名の通り、強制的にURLに入ってくる
カテゴリーベース(デフォルトではcategory)を消すことができます。
このプラグインを使い、さらに、「category」というカテゴリを作り、すべてのカテゴリをその子カテゴリ
として登録すれば、上記でやろうとしていたことは可能です。

そんな訳で、Wordpressでプログ以外のサイトを構築する際に、どういうURL構造にするかは
よく考える必要がありますね、というお話でした。

最後に
アライドアーキテクツでは、エンジニアを募集中です。
一緒に働いてくれる、仲間になってくれる方はこちらからご応募ください。

よろしくお願いします。