Meta-Tags individualisieren mit Fallback

02.11.2010 | eZ Publish

ezPublish bietet die Möglichkeit, Meta-Informationen in der site.ini abzulegen und als Loop in der pagelayout.tpl auszulesen.

 [SiteSettings]
# Name of the site, will be used in default templates in titles.
SiteName=eZ Publish
# URL of site, often used to link to site in emails etc.
SiteURL=example.com
# List of metadata to set in pagelayout
MetaDataArray[author]=eZ Systems
MetaDataArray[copyright]=eZ Systems
MetaDataArray[description]=Content Management System
MetaDataArray[keywords]=cms, publish, e-commerce, content management, development framework

Zur SEO-Optimierung einer Site eignet sich diese Methode leider wenig, da alle Seiten dieselben Meta-Tags bekommen würden. Wenn man aber doch nicht für jede Seite eigene Meta-Tags vergeben will, sondern nur für die mit spezifischen Contents, wäre ein Fallback wünschenswert, der in diesem Fall doch auf die ini-Einträge zurückgreift.

In folgendem Beispiel wird für die Meta-Description das short-description-Attribut des Contentobjekts verwendet und - sollte dieses fehlen oder leer sein - die ini-Einstellung verwendet.Das geschieht innerhalb des Loopings durch die Meta-Infos. D.h. alle anderen Meta-Infos (author, copyright, keywords) werden aus der ini geholt.

 {let $node_metas=fetch(content,node,hash(node_id, $module_result.node_id))}
         {section name=meta loop=$site.meta}
        {switch match=$meta:key|wash}
        {case match=description}
        {section show=is_set($node_metas.object.data_map.short_description)}
        {section show=eq($node_metas.object.data_map.short_description.has_content, true)}
<meta name="{$meta:key|wash}" content="{$node_metas.object.data_map.short_description.content.output.output_text|strip_tags}"/>
            {section-else}
            <meta name="{$meta:key|wash}" content="{$meta:item|wash}" />
            {/section}
            {section-else}
            <meta name="{$meta:key|wash}" content="{$meta:item|wash}"/>
            {/section}
            {/case}
{case}
<meta name="{$meta:key|wash}" content="{$meta:item|wash}"/>

{/case}
            
                
        {/section}
{/let}

Nachteil: in der pagelayout.tpl muß nochmal ein fetch für den modul-content eingebaut werden.Das könnte man umgehen, indem man persistente Variablen benutzt. Das hätte widerum aber den Nachteil, daß in allen Templates für Contentobjekte der Code zum setzen der persistenten Variable eingebaut werden muß. Ist nachträglich also mit gewissem Aufwand verbunden.

Im override-Template für den Article wäre also z.B. folgendes einzubauen:

 

{set scope=global $persistent_variable=hash(
  'seo_description',$node.object.data_map.description, 
  'seo_keywords', $node.object.data_map.keywords, 
  'seo_title', $node.object.data_map.title)}

Vorausgesetzt wird, daß die Contentklasse des Nodes die Attribute description, keywords und title aufweist.In der page-head oder in der pagelayout könnte man die Werte der persistenten Variablen dann wie folgt abholen und in einen Meta-Tag einbauen:


<title>{$module_result.content_info.persistent_variable['seo_title'].content|wash}</title>
<meta name="description" content="{$module_result.content_info.persistent_variable['seo_description'].content|wash}" />
<meta name="keywords" content="{$module_result.content_info.persistent_variable['seo_keywords'].content|wash}" />