Hatena::ブログ(Diary)

考えてる途中

2008年07月08日

SEO Strict URLsプラグインを使ってみる

MODxには「フレンドリーURL」と呼ばれる機能があり、これを使うと「静的な見た目のURLでドキュメントにアクセスできるようになる」のは、これまでご説明した通りです。


実はいろんなURLでアクセスできてしまう

フレンドリーURLを使用すると…

アクセスできるように設定できます。


しかし、実はこれ以外にもさまざまなURLでアクセスできるようになってしまうのです。

例えば、

などなど。(詳しくは、Forumモデレータさんの「Let’s enjoy MODx|SEO Strict URLs 1.0.1」参照)


で、同一のドキュメントに対して複数のURLがあるのは、これまたSEO的にはあまりよろしくないと言われています。

「SEO Strict URLs」は、301リダイレクトを利用して、この複数のURLを(やや強引に?)統一してしまうプラグインです。要するに、本命以外のURLでアクセスされたら、全部本命のURLに飛ばしちゃうって仕組みをプラグイン化したものってことかな。


使用するプラグインと目指す形

SEO Strict URLsの本家版は、こちらにあるのですが、いくつか不具合があるそうなので、今回はPhizeさんが不具合を修正してくれた「SEO Strict URLs(Phize版)」を導入してみます。


さらに、Phizeさんが公開されている「URI構成を通常のサイト風にする方法」に従って進めていきます。


フレンドリーURLの設定を変更

まずは、フレンドリーURLの設定を変更しておくようです。

  1. MODxマネージャログイン
  2. ツール>MODx設定>フレンドリーURLの順にたどり、以下を設定
    • フレンドリーURLの使用 : Yes
    • フレンドリーURLの接頭辞 : なし
    • フレンドリーURLの接尾辞 : なし
    • フレンドリーエイリアス : Yes
    • エイリアスパスを使用 : Yes
    • 重複エイリアスを許可 : No
    • 自動エイリアス生成 : No
  3. 「保存」をクリック

SEO Strict URLsプラグインをインストールする

こちらから、プラグインをダウンロードします。

(テキストファイルへのリンクになっているので、開いて全文をコピーでも可)

  1. リソース>リソース管理>プラグインの順にたどり、「プラグインの作成」をクリック
  2. 全般タブ内で以下の作業
    • プラグイン名 : SEO Strict URLs
    • 説明 : 任意
    • プラグインコード : ダウンロードしたテキストファイルの中身をコピー&ペースト
  3. 設定タブを開き、「プラグイン設定」に後述のテキストをコピー&ペースト
  4. システムイベントタブを開き、以下のイベントにチェック
    • OnWebPageInit
    • OnWebPagePrerender
  5. 「保存」をクリック

▼プラグイン設定にコピペするテキスト

&editDocLinks=Edit document links;int;1 &makeFolders=Rewrite containers as folders;int;1 &emptyFolders=Check for empty container when rewriting;int;1 &override=Enable manual overrides;int;0 &overrideTV=Override TV name;string;seoOverride

.htaccessを修正する

ドメインを「wwwあり」か「wwwなし」のどちらかに統一するため、MODxのルートにある「.htaccess」を編集します。

今回は「wwwなし」に統一したいので、以下のように設定。


19行目前後の「# Rewrite www.domain.com -> domain.com -- used with SEO Strict URLs plugin」以下を見て…

#RewriteCond %{HTTP_HOST} .
#RewriteCond %{HTTP_HOST} !^example-domain-please-change\.com [NC]
#RewriteRule (.*) http://example-domain-please-change.com/$1 [R=301,L]

  ↓ 次のように編集

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^example\.jp [NC]
RewriteRule (.*) http://example.jp/$1 [R=301,L]

「wwwあり」に統一する場合は、Phizeさんの解説ページを見てください。


さらにもう一つ、フォルダドキュメントに「http://ドメイン/エイリアス/index.html」の形でもアクセスできるようにするための設定をします。

40行目前後の「# The Friendly URLs part」を探して…

# The Friendly URLs part
★RewriteCond %{REQUEST_FILENAME} !-f
★RewriteCond %{REQUEST_FILENAME} !-d
★RewriteRule ^(.*)/index.html$ index.php?q=$1 [L,R=301,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

★のついた行を追加します。(実際には、★は入力しない)


.htaccessを保存。


動作を確認してみる

では、動作確認です。

  1. サイト>ドキュメントの作成で、新しいページの準備をする
  2. 全般タブ内で以下の作業
    • タイトル : 任意
    • ドキュメントエイリアス : seotest.html (拡張子htmlまで含めて設定!)
    • 使用テンプレート : 任意
    • 内容 : 適当に
  3. ページ設定タブで、「公開」にチェック
  4. 「保存」をクリック

結果OK!

http://example.jp/3 などでアクセスすると、seotest.html にリダイレクトされてます。

今後、Dittoとかパラメータ付きのURLを吐くプラグインを入れたら、また確認が必要かもしれませんが、とりあえず完了です。

WordPress Integratorを試す

どうにかこうにかWordPress IntegratorでMODxの中にWordPressを表示することができるようになった感じなので、もう少しいろいろ試してみます。


テンプレートを適用してみる

とりあえず表示してみたWPのコンテンツは、CSSも何も適用されてない素のHTML状態です。

ソースを見てみると、

<div id="content" class="narrowcolumn">〜</div>

までの本当に「WPの中身」が出ちゃってる状態。


というわけで、MODxの「リソース」で以下のようなごくごくシンプルなテンプレートを作成。

<html>
<head><title>[*pagetitle*]</title></head>
<body>[*content*]</body>
</html>

適当なテンプレート名で保存します。

続いて、WordPress Integratorスニペットを呼び出すために作ったドキュメントを開き、「使用テンプレート」に今作ったテンプレートを指定して保存。


ページを更新してソースを確認してみると…、出た出た。ちゃんとMODxで作ったテンプレートが適用されてます。

ちょっと、QuickEditがえらいことになって出てきちゃってるので、テンプレートに以下を追加。

<base href="[(site_url)]" />

WordPressのサイドバーを出してみる

ここまでの状態で見えているWordPressの内容は「エントリのみ」です。

カテゴリメニューとかアーカイブメニューとか、ブログのサイドバーとしてよくあるアレは出ていないので、それを表示させます。


さっきのテンプレートに以下を追加。

<body>
[*content*]
[!WordPressIntegrator?block=sidebar!] ←追加
</body>

保存して更新してみると出てきました。

ブログ内検索もちゃんと出来てるや。すごいなぁ。


ページタイトルを適切なものにしてみる

テンプレートに書いた [*pagetitle*] は、MODxタグと呼ばれるもので、MODxのドキュメントタイトルを取得するものです。それはそれで機能しているので良いのですが、このままだとWordPressのエントリを個別表示にしたときも、ページタイトルが全部スニペットを呼び出しているドキュメントタイトルになります。


で、7bitさんを見てみるとプレースホルダも用意されているらしい。

WordPressのエントリタイトルは、[+wp_pagetitle+] で取得できるようなのでテンプレートに追加してみます。

<head><title>[+wp_pagetitle+]|[*pagetitle*]</title></head>

おお〜…見事。ちゃんとWordPress側で付けているエントリタイトルが出てる。

さらに、ここで1個わからなくて放っておいた内容の意味に気づく。


[+wp_pagetitle+]を付け加えるとエントリ個別表示の場合は、

  • WordPressのエントリタイトル|MODxのドキュメントタイトル
  • 例 : Hello world!|WordPressテスト

のように表示されてイイ感じなのですが、WordPressのトップ(今回の例なら、http://example.jp/blog/)を表示させたときは、

  • the title to show if the given one is blank|WordPressテスト

と出てくる。


あ!スニペットの define で設定するもう一つの部分はこれだったのか〜!

というわけで、早速スニペット「WordPressIntegrator」を開いて編集。

define ('WPMODX_WP_PATH', '/home/<username>/www/example.jp/wp');
define ('WPMODX_TITLE', 'the title to show if the given one is blank');

この部分の2行目を以下のようにしました。(別に何でもいい)

define ('WPMODX_TITLE', 'テストブログTOP');

これでブログトップになるページのタイトルもイイ感じになりました。


疑問点

おおむねうまくいったWordPressとMODxの統合ですが、現時点で一つだけ疑問点が残っています。

WordPressのパーマリンク設定が「デフォルト」じゃないと動かない点です。


WordPressでも「クエリ形式のURL(デフォルト)」と「静的(に見える)URL」を選べるように設定ができるのですが、静的URLを選択するとブログトップは表示できるものの、エントリ個別ページが表示できなくなってしまいます…。


分かるような分からないような…。

何とかする方法はありそうな気はするのですが、URL周りに関してはもう一つ使ってみたいと思っていた機能があるので、そちらを導入してから考えてみることにします。