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) {
    /** @var \Concrete\Core\Html\Service\Seo $seo */
    $seo = Core::make('helper/seo');
    
    /** @var \Concrete\Core\Page\PageList $list */
    $list = new PageList();
    $parameter = $list->getQueryPaginationPageParameter();

    /** @var \Symfony\Component\HttpFoundation\ParameterBag $query */
    $query = \Request::getInstance()->query;
    if ($query->has($parameter)) {
        $page = intval($query->get($parameter));
        $seo->addTitleSegment(sprintf('ページ %d', $page));
    }
});

デフォルトではページ送りをしても 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 : '',
        )
    );