こんばんは、Phizeです。
どうしてもMetaタグ・キーワードが自動で出力されず困っていました。
みなさん、問題なく(?)出力されているとのことで、ふとインストール時のテンプレートに戻してみたところうまくいきました。
結果、なぜ私のテンプレートでうまくいかなかったのかがわかりましたので、
同じような方の参考になりましたらと思い、ご報告させていただきます(すでに出てましたらすみません)。
ドキュメントでMetaタグ・キーワードの設定を正しくしているにもかかわらず、meta要素が自動出力されないと言う方は、head要素の開始タグを疑ってみてください。
開始タグが「<head>」以外の場合、つまり、空白文字があったり、profile属性等の属性の記述がある場合にはmeta要素が出力されません。
属性を記述したい場合には、プラグインの作成、あるいは、コアスクリプトの改造の必要があります。
原因となっている箇所があるのは、/manager/includes/document.parser.class.inc.php の mergeDocumentMETATagsメソッドです。
下記のようなプラグインを作成すると、空白文字、属性の有無にかかわらずmeta要素が出力されるようになります。
【環境】
XREA(PHP4 + MySQL 4.0.26) + MODx 0.9.6
【解決策】
1.新しくプラグインを作ります(名前は適当に決めてください)
2.プラグインコードに下記のコードをコピー&ペーストします
3.「システムイベント」タブで「OnParseDocument」イベントにチェックをつけます
4.プラグインを「保存」します
5.これでmeta要素が正しく出力されるようになります
$event = &$modx->Event;
if ($event->name == 'OnParseDocument') {
if ($modx->documentObject['haskeywords'] == 1) {
// insert keywords
$keywords= implode(", ", $modx->getKeywords());
$metas= "\t<meta name=\"keywords\" content=\"$keywords\" />\n";
// Don't process when cached
$modx->documentObject['haskeywords'] = '0';
}
if ($modx->documentObject['hasmetatags'] == 1) {
// insert meta tags
$tags= $modx->getMETATags();
foreach ($tags as $n => $col) {
$tag= strtolower($col['tag']);
$tagvalue= $col['tagvalue'];
$tagstyle= $col['http_equiv'] ? 'http-equiv' : 'name';
$metas .= "\t<meta $tagstyle=\"$tag\" content=\"$tagvalue\" />\n";
}
// Don't process when cached
$modx->documentObject['hasmetatags'] = '0';
}
if ($metas) {
$template = &$modx->documentOutput;
$template = preg_replace("/(<(\s*)head(\s*)(.*?)(\s*)>)/i", "\\1\n\t" . trim($metas), $template);
}
}
(あまりよい正規表現ではないと思いますので、もっとよい書き方がありましたらご教示いただけましたら幸いです。)
ドキュメントオブジェクトの’haskeywords’、’hasmetatags’の値は、
meta要素の挿入の可否に関わらず、このプラグイン、またはmergeDocumentMETATagsメソッドが呼ばれた時点で「0」となってしまいます。
スニペット等でこれらのドキュメントオブジェクトの値を利用したい場合は、事前にgetDocumentObjectメソッドを呼んでDBから取得する必要がありそうです。