Joomla!でCanonical Urlを設定する
概要:
今回は、今話題(もう、昔?)のCanonical Urlを設定してくれるモジュールの紹介です。
Canonical Urlとは、直訳すれば、"正規のURL"とでもいうべきでしょうか。意訳すれば、"唯一の正しいURL"という感じでしょうか。
つまり、以下のようにHTMLの中に記述することで、"このページの本当のURLは、これですよ"と指定しれあげるものです。
<link rel="canonical" href="http://www.off-soft.net/ja/software/dvd/eac.html" />
例えば、上記の場合であれば、Joomla!の場合などでは、特に、いろいろURLでアクセスできます。
http://www.off-soft.net/ja/software/dvd/eac.html
http://www.off-soft.net/index.php?option=com_content&view=article&id=170
|
上記の例は、いずれも同じ記事を表示できますが、見た目上、URLが異なります。それを、検索エンジンに「同じ記事ですよ」と教えるのが、Canonical Urlの設定です。
(ただし、このモジュールでは、上記のURLを同じURLでCanonical Urlを設定することはできません。以降にその回避策のヒントも記載しています。)
この設定を行うことで、Joomla!のようなCMSで色々なURLの指定ができる場合、1つの記事を同じページであることを認識することで、
検索エンジン側は無駄を削除し、検索される側は、ページランクを上げる効果があるとされています。
今回、記述します"Canonical URL" Module for Joomla 1.5 は、モジュールながら、簡単にすべてのページにCanonical URLを設定してくれます。早速、簡単に説明してみます。
早速、使ってみましょう
先のダウンロードサイトから、gzファイルをダウンロードし、インストールを行います。
(メニューの [エクステンション] - [インストール/アンインストール] から行ってください。)
インストールの後、[モジュール管理] で、[ Canonical URL Module ]が無効状態で、既にありますので、クリックして設定画面を表示しましょう。
[ Canonical URL Module ]の設定画面から、各情報の設定を行います。
パラメータ名 | 説明 |
Rule01: Find part of URL | 検索するURL |
Rule01: Set part of URL | 置換するURL |
※Rule01 - 10 まであります。
タイトルの非表示、モジュールを有効にすることを忘れないようにしましょう。
このモジュールは、このパラメータからもわかるように、URLの文字列の一部を変更することで異なるURLを同じと判断します。
例えば、以下のように設定した場合、1つの記事が複数ページにわたっていても1つのURLで設定されます。
Rule01: Find part of URL start=
Rule01: Set part of URL
複数ページにおよぶ記事の場合、URLのパラメータに"start="が付いてきます。その情報を削除することで、複数ページの記事が1つのURLで指定されます。
また、JoomFishを使っている場合、日本語、英語の記事を同一URLにまとめることもできます。
このようにパターンにはまっている場合は、それを同一のURLへ変換するのは、容易にできます。
ただ、概要でも記述したとおりJoomla!では、いろいろなURLでのアクセスが可能です。
特にSEOを有効にしている場合に、そのURLは、多くなります。そのような場合、どのようにすれば良いでしょう。
次に、その回避策の一つを簡単に解説したいと思います。
URLを統一する
最も単純なやり方は、すべての内部リンクを統一することです。
どういう形式のURLで統一するかは、管理人次第でしょう。
ここでは、メニューのURLに統一するやり方を記述してみます。
/modules/mod_canonical/helper.php は、Canonical URL ModuleのURLの設定処理を行っているクラスmodCanonicalHelperが、記述されています。
その一部に、メニューで設定しているURLへ変換する処理を追加してあげることで、統一を図ってみましょう。
[helper.php]
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| $_dom = ($_before!="")?(substr(JURI :: base(), 0, -1)):(JURI :: base());
// add search menu
if(isset($_GET['id']) && substr($_before,0,10)=='/index.php' && strstr($_before,'view=article')!==false){
$id_article = $_GET['id'];
$menu = &JSite::getMenu();
$items = $menu->getMenu();
$itemId = -1;
foreach($items as $item) {
if ( ! is_object($item) )
continue;
if (isset($item->query['view']) && isset($item->query['id']) &&
$item->query['view'] == 'article' && $item->query['id'] == $id_article) {
$b_1 = "index.php?Itemid=".$item->id;
$link_item=JRoute::_($b_1);
if($link_item!=$b_1){
$_before=$link_item;
}
break;
}
}
}
//1.1
$mytrigger=0;
|
72 - 91 行目が、追加された行です。
ここでは、表示しようとしているURLに、'/index.php' 及び 'view=article' , 'id=xxx' が指定されている場合、メニューから検索しています。
メニューに同じ記事IDが存在すれば、メニューIDを取り出して、メニューのURLへ変換しています。
もし、メニューに存在しなければ、そのままです。
上記のようなやり方でもできますが、少々、毎回検索するのは、重そうですね。
一応、記事の表示時のみに限っていますので、その点は、多少は限定されますが、一つの案としてご提示いたしておきます。
この回避策を行わないにしても、複数ページ、固定ページをまとめることは、簡単に行えますので、試すのも一考だと思います。
今回の記事では、PHPについて、少し知識が必要です。詳しく知りたい方は、以下の本なども良いと思います。
本から学ぶことは多いと思います。ネットだけでは判らない様々な事に気づかされます。
コメントをどうぞ