title 要素のカスタマイズ
タイトルフォーマットの定義
デフォルトでは、title 要素の表記は、「サイト名 :: ページ名」というフォーマットになっています。詳しくは、当サイト「設定ファイルの使い方」ページの「SEO関連の設定」の項を参考にしてください。
SEOヘルパーの操作
title に表示する内容の要素や表示フォーマットは、SEOヘルパーと呼ばれるクラスで管理されています。このクラスを使えば、フォーマットの設定以外にも、様々な操作が行えます。
例:タイトルセグメントのクリア
application/bootstrap/app.php への記載例
Events::addListener('on_before_render', function($event) { /** @var \Concrete\Core\Html\Service\Seo $seo */ $seo = Core::make('helper/seo'); $seo->clearTitleSegments(); });
ページリストブロックで、トピックやタグで絞り込みする際に、トピック名がタイトルに自動的に追加されますが、それらの追加要素を消去します。
例:ページ送りの番号をタイトルに追加
application/bootstrap/app.php への記載例
Events::addListener('on_before_render', function($event) use ($app) { /** @var \Concrete\Core\Html\Service\Seo $seo */ $seo = $app->make('helper/seo'); /** @var \Concrete\Core\Page\PageList $list */ $list = new \Concrete\Core\Page\PageList(); $parameter = $list->getQueryPaginationPageParameter(); /** @var \Symfony\Component\HttpFoundation\ParameterBag $query */ $query = \Concrete\Core\Http\Request::getInstance()->query; foreach ($query->all() as $key => $value) { if (strpos($key, $parameter) === 0) { $seo->addTitleSegment(sprintf('ページ %d', $value)); break; } } });
デフォルトではページ送りをしても title 要素に変化はありませんが、ページ送りをした際に title に「ページ 2」と追加するカスタマイズの例です。
SEOヘルパーをオーバーライド
SEOヘルパーは \Concrete\Core\Html\Service\Seo クラスとして実装されていますが、オーバーライドして差し替えれば完全に異なる挙動にすることができます。これにより、より柔軟にタイトルの表記をカスタマイズできます。
application/bootstrap/app.php への記載例
Core::bind('helper/seo', 'Application\Src\Html\Service\Seo');
テーマからページタイトルをカスタマイズする方法
テーマファイルの header_required を呼び出すところにタイトルの変数を渡すことによってテーマファイルからページタイトルをカスタマイズできます。なお、この方法は Meta Descriotion と Meta Keyword でも同じことが可能です。
使い方
次のコードを、 concrete5 のテーマファイルで Loader::element('header_required');
が記述されている行の前にページタイトルを設定するプログラムを書いてください。
- トップ & 第1階層ページ: [ページタイトル] - [サイト名]
- 第2階層以降のページ: [ページタイトル] | [第1階層のページタイトル] - [サイト名]
concrete5.7.5.7 より、サイト名が多言語対応になりました。[管理画面] - [システムと設定] - [基本] - [サイト名] は英語のサイト名を記入してください。日本語を含むその他の言語のサイト名は、[管理画面] - [システムと設定] - [多言語] - [翻訳インターフェース]で行えます。
Meta Description と Meta Keyword
Meta Description と Meta Keywords をプログラム的に指定できます。 サンプルコードでは $pageDescrition と $pageMetaKeywords がこのコードの前に設定されていたらそれを使うというサンプルです。
サイト管理者が通常のように Meta 属性や、ページ説明を入力していれば、それが優先されるというようにしています。
$metaTitle = $c->getCollectionAttributeValue('meta_title'); if ($metaTitle) $pageTitle = $metaTitle; if (!$pageTitle) { $siteName = h(\Config::get('concrete.site')); $collentionName = $c->getCollectionName(); $isRoot = null; $trail = $nh->getTrailToCollection($c); if (is_array($trail) && count($trail) > 1) { $count = count($trail); array_splice($trail, $count - 1); $deptC = array_pop($trail); $deptName = h($deptC->getCollectionName()); } else { $isRoot = true; } if ($isRoot) { $pageTitle = $collentionName . ' - ' . $siteName; } else { $pageTitle = $collentionName . ' | ' . $deptName . ' - ' . $siteName; } } $thisPageDescription = $c->getAttribute('meta_description'); if (!$thisPageDescription) $thisPageDescription = $c->getCollectionDescription(); if ($thisPageDescription) $pageDescription = $thisPageDescription; $thisPageMetaKeywords = $c->getAttribute('meta_keywords'); if ($thisPageMetaKeywords) $pageMetaKeywords = $thisPageMetaKeywords; Loader::element('header_required', array( 'pageTitle' => $pageTitle, 'pageDescription' => isset($pageDescription) ? $pageDescription : '', 'pageMetaKeywords' => isset($pageMetaKeywords) ? $pageMetaKeywords : '', ) );