Skip to content

Instantly share code, notes, and snippets.

@Abromeit
Created May 17, 2012 22:56
Show Gist options
  • Select an option

  • Save Abromeit/2722140 to your computer and use it in GitHub Desktop.

Select an option

Save Abromeit/2722140 to your computer and use it in GitHub Desktop.
xtcModified SEO Enhancements ^-^ /includes/modules/metatags.php
<?php
/*---------------------------------------------------------------------------
$Id$
xtcModified - community made shopping
http://www.xtc-modified.org
Copyright (c) 2010 xtcModified
-----------------------------------------------------------------------------
based on:
(c) 2003 nextcommerce (metatags.php, v1.7 2003/08/14); www.nextcommerce.org
(c) 2006 xt:Commerce (metatags.php, v.1140 2005/08/10); www.xt-commerce.de
Released under the GNU General Public License
-----------------------------------------------------------------------------
Modified by Gunnar Tillmann (August 2006)
http://www.gunnart.de
-----------------------------------------------------------------------------
AUTOMATISCHE METATAGS MULTILANGUAGE für xt:Commerce 3.04
-----------------------------------------------------------------------------
Version 0.97 / 16. Mai 2012 / D.Abromeit / Lucido Media GbR
- Canonical-Tag Bugfix für Pagination
- Title, Description, Robots: Diverse Änderungen nach aktuellen Empfehlungen
- Keywords-Tag entfernt
- Legacy Funktionen entfernt
-----------------------------------------------------------------------------
Version 0.96n / 13. Dezember 2010 / DokuMan / xtcModified
- Unterstützung für Pagination
-----------------------------------------------------------------------------
Version 0.96m / 26. August 2010 / DokuMan / xtcModified
- Unterstützung für "canonical"-Tag
-----------------------------------------------------------------------------
Version 0.96 / 21. Juni 2009
- Umwandlung von Umlauten in Keywords statt in ae und oe JETZT in &auml; &ouml;
- "Bindestrich-Wörter" (z.B. T-Shirt oder DVD-Player) werden in den Keywords nicht
mehr getrennt
- Metatags auch für ContentManager-Seiten (Achtung! Dazu Erweiterung erforderlich!)
- Im ContentManager können auch automatische Metatags aus eingebundenen HTML- oder
Text-Dateien erzeugt werden
- Standard-Meta-Angaben durch Content-Metas auch mehrsprachig möglich. Dazu eine
Seite namens "STANDARD_META" anlegen
- Bei automatisch erzeugen Keywords oder Descriptions werden Wörter nach Zeilen-
umbrüchen nicht mehr "zusammengezogen"
- Eigene (mehrsprachige) Metas für die Shop-Startseite möglich - Dazu werden die
Metas aus der "index"-Seite im ContentManager geholt
- Seiten-Nummer im Title bei Artikel-Listen (also Kategorien, Sonderangebote etc.)
- Eigener Title bei Suchergebnissen (Mit Seiten-Nummer, Suchbegriff, ggf. Hersteller
und Kategorienname)
- Bei allen Seiten, die nicht "Kategorie", "Startseite", "Content", "Produkt" o.ä.
sind, wird der Title aus den Einträgen im $breadcrumb-Objekt zusammengesetzt
- BugFix: BreadCrumb wird nicht mehr verkürzt
-----------------------------------------------------------------------------
Inspired by "Dynamic Meta" - Ein WordPress-PlugIn von Michael Schwarz
http://www.php-vision.de/plugins-scripte/dynamicmeta-wpplugin.php
---------------------------------------------------------------------------*/
// -----------------------------------------------------------------------------
// Konfiguration...
// -----------------------------------------------------------------------------
// Max.-Längen wirken sich nur auf automatisch generierte Teile aus.
$metaTitleLength = 90; // Max. Länge des titles (Anzahl Buchstaben) - default: 65
$metaDesLength = 155; // Max. Länge der description (Anzahl Buchstaben) - default: 155
$metaTitleSeparator = ' - '; // Trennzeichen zwischen Title-Tag-Teilen
$addPagination = true; // Seiten-Nummern anzeigen?
$addCatShopTitle = true; // Shop-Titel bei Kategorien anhängen?
$addProdShopTitle = true; // Shop-Titel bei Produkten anhängen?
$addContentShopTitle = true; // Shop-Titel bei Contentseiten anhängen?
$addSpecialsShopTitle = true; // Shop-Titel bei Angeboten anhängen?
$addNewsShopTitle = true; // Shop-Titel bei Neuen Artikeln anhängen?
$addSearchShopTitle = true; // Shop-Titel bei Suchergebnissen anhängen?
$addOthersShopTitle = true; // Shop-Titel bei sonstigen Seiten anhängen?
// Einzelne Dateien auf noindex setzen (Liste der Dateinamen)
$files_noindex = array(
FILENAME_ACCOUNT,
FILENAME_ADVANCED_SEARCH,
FILENAME_ADVANCED_SEARCH_RESULT,
FILENAME_ASK_A_QUESTION,
FILENAME_COOKIE_USAGE,
FILENAME_CREATE_ACCOUNT,
FILENAME_CREATE_GUEST_ACCOUNT,
FILENAME_LOGIN,
FILENAME_LOGOFF,
FILENAME_NEWSLETTER,
FILENAME_PASSWORD_DOUBLE_OPT,
FILENAME_SHOPPING_CART
);
// Einzelne Content-Seiten auf noindex setzen (Liste der coID's)
$content_noindex = array(
'0', //news
#'1', //versandkosten
'2', //datenschutz
#'3', //agb
'4', //impressum
'7', //kontakt
#'8', //sitemap
#'9', //rueckgaberecht
#'10', //zahlungsarten-info
'11' //sicheres einkaufen
);
// -----------------------------------------------------------------------------
// Ende Konfiguration
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Title für "sonstige" Seiten
// -----------------------------------------------------------------------------
$breadcrumbTitle = end($breadcrumb->_trail);
$breadcrumbTitle = $breadcrumbTitle['title'];
// -----------------------------------------------------------------------------
// noindex bei "unwichtigen" Seiten (bzw. Dateien)
// -----------------------------------------------------------------------------
$meta_robots = 'index,follow';
if( in_array(basename($_SERVER['SCRIPT_NAME']),$files_noindex) )
{
$meta_robots = 'noindex,follow';
}
// -----------------------------------------------------------------------------
// MultiLanguage-Metas
// -----------------------------------------------------------------------------
// Wenn wir auf der Startseite sind, Metas aus der Index-Seite holen
if(
basename($_SERVER['SCRIPT_NAME'])==FILENAME_DEFAULT &&
empty($_GET['cat']) &&
empty($_GET['cPath']) &&
empty($_GET['manufacturers_id'])
)
{
$ml_meta_where = "content_group = 5";
}
else // ...ansonsten Metas aus STANDARD_META holen
{
$ml_meta_where = "content_title = 'STANDARD_META'";
}
$ml_meta_query = xtc_db_query("
select
content_meta_title,
content_meta_description,
content_meta_keywords
from
".TABLE_CONTENT_MANAGER."
where
".$ml_meta_where."
and languages_id = '".(int)$_SESSION['languages_id']."'
");
$ml_meta = xtc_db_fetch_array($ml_meta_query,true);
// -----------------------------------------------------------------------------
// Mehrsprachige Standard-Metas definieren. Wenn leer, werden die üblichen genommen
// -----------------------------------------------------------------------------
#define('ML_META_DESCRIPTION',($ml_meta['content_meta_description'])?$ml_meta['content_meta_description']:META_DESCRIPTION);
define('ML_TITLE',($ml_meta['content_meta_title'])?$ml_meta['content_meta_title']:TITLE);
// -----------------------------------------------------------------------------
// Seitennummerierung im Title (Kategorien, Sonderangebote, Neue Artikel etc.)
// -----------------------------------------------------------------------------
$Page = '';
if( isset($_GET['page']) && intval($_GET['page'])==$_GET['page'] && $_GET['page'] > 1 && $addPagination )
{
// PREVNEXT_TITLE_PAGE_NO ist "Seite %d" aus der deutschen
// bzw. "page %d" aus der englischen Sprachdatei ...
$Page = trim(str_replace('%d','',PREVNEXT_TITLE_PAGE_NO)).' '.(int)$_GET['page'];
}
// -----------------------------------------------------------------------------
/**
* ueberfluessige leerzeichen und html-code entfernen,
* umlaute und sonderzeichen wandeln, inhalt ggf. kuerzen
*
* @param string $str
* @param int $maxlen
* @param string $append
*
* @return string
*/
function metaClean($str,$maxlen=false,$append='...')
{
$language_charset = strtoupper($_SESSION['language_charset']);
$str = preg_replace('/<[^>]*>/',' ',$str); // more reliable than striptags()
$str = html_entity_decode($str,ENT_QUOTES,$language_charset);
$str = trim( preg_replace('/\s\s+/',' ',$str) );
if( $maxlen > 0 && strlen($str) > $maxlen )
{
$maxlen -= strlen($append);
$str = preg_replace('/\s+?\S*$/','',substr($str,0,$maxlen+1));
$str = substr($str,0,$maxlen).$append;
}
return htmlentities($str,ENT_QUOTES,$language_charset);
}
/**
* build / format meta-title
*
* @param bool $allow_appended_shopname
* @param array $title
*
* @return string
*/
function metaTitle($allow_appended_shopname,$title)
{
global $metaTitleLength, $metaTitleSeparator;
// join given stuff
$title = array_filter((array)$title,'metaClean'); //remove elements that would be empty
$title = array_unique($title);
$res = implode($metaTitleSeparator,$title);
// append shopname
if( $allow_appended_shopname && !empty($res) )
{
$shopname = ML_TITLE;
$res_tmp = $res.$metaTitleSeparator.$shopname;
// shopname isn't empty
// && shopname isn't already contained in our current generated title
// && new title length won't exceed our maximum if we append the shopname
if( metaClean($shopname) && strpos($res,$shopname) === false && strlen($res_tmp) <= $metaTitleLength )
{
$res = $res_tmp;
}
}
return $res;
}
// -----------------------------------------------------------------------------
switch( basename($_SERVER['SCRIPT_NAME']) )
{
// -----------------------------------------------------------------------------
// Daten holen: Produktdetails
// -----------------------------------------------------------------------------
case FILENAME_PRODUCT_INFO :
if( $product->isProduct() )
{
// Description //
if( !empty($product->data['products_meta_description']) )
{
$meta_descr = $product->data['products_meta_description'];
$metaDesLength = false;
}
else
{
#$meta_descr = $product->data['products_name'].': '.$product->data['products_description'];
}
// Title //
if( !empty($product->data['products_meta_title']) )
{
$meta_title = metaTitle($addProdShopTitle,array($product->data['products_meta_title']));
}
else
{
$meta_title = metaTitle($addProdShopTitle,array($product->data['products_name'],isset($product->data['manufacturers_name'])?$product->data['manufacturers_name']:'',$Page));
}
// Canonical //
$canonical_url = xtc_href_link(FILENAME_PRODUCT_INFO, 'products_id='.$product->data['products_id'],$request_type,false);
}
break;
// -----------------------------------------------------------------------------
// Daten holen: Kategorie
// -----------------------------------------------------------------------------
case FILENAME_DEFAULT :
$startpage = true;
// Sind wir in einer Kategorie?
if( !empty($current_category_id) )
{
$categories_meta_query = xtDBquery("
select
categories_meta_description,
categories_meta_title,
categories_name,
categories_description
from
".TABLE_CATEGORIES_DESCRIPTION."
where
categories_id = '".(int)$current_category_id."'
and language_id = '".(int)$_SESSION['languages_id']."'
");
$categories_meta = xtc_db_fetch_array($categories_meta_query,true);
$startpage = false;
}
$manu_id = $manu_name = false;
// Nachsehen, ob ein Hersteller gewählt ist
if( !empty($_GET['manu']) )
{
$manu_id = $_GET['manu'];
$startpage = false;
}
if( !empty($_GET['manufacturers_id']) )
{
$manu_id = $_GET['manufacturers_id'];
$startpage = false;
}
if( !empty($_GET['filter_id']) && !$manu_id )
{
$manu_id = $_GET['filter_id'];
$startpage = false;
}
// ggf. Herstellernamen herausfinden
if( $manu_id )
{
$manu_name_query = xtDBquery("
select manufacturers_name
from ".TABLE_MANUFACTURERS."
where manufacturers_id = '".(int)$manu_id."'
");
$manu_name = xtc_db_fetch_array($manu_name_query,true);
$manu_name = (is_array($manu_name) ? implode('',$manu_name) : '');
}
// Description //
if( !empty($categories_meta['categories_meta_description']) )
{
// ggf. Herstellername hinzufügen
#$meta_descr = $categories_meta['categories_meta_description'].(($manu_name)?' - '.$manu_name:'');
$meta_descr = $categories_meta['categories_meta_description'];
$metaDesLength = false;
}
elseif( $categories_meta )
{
// ggf. Herstellername und Kategorientext hinzufügen
#$meta_descr = $categories_meta['categories_name'].(($manu_name)?' - '.$manu_name:'').(($categories_meta['categories_description'])?' - '.$categories_meta['categories_description']:'');
}
// Title //
if( !empty($categories_meta['categories_meta_title']) )
{
#$meta_title = metaTitle($addCatShopTitle,array($categories_meta['categories_meta_title'],$manu_name,$Page));
$meta_title = metaTitle($addCatShopTitle,array($categories_meta['categories_meta_title'],$Page));
}
elseif( $categories_meta )
{
$meta_title = metaTitle($addCatShopTitle,array($categories_meta['categories_name'],$manu_name,$Page));
}
elseif( $startpage )
{
$meta_title = metaTitle(false,array(ML_TITLE));
}
// Canonical //
if( xtc_not_null($cPath) )
{
$url_param_page = ( isset($_GET['page']) && intval($_GET['page'])==$_GET['page'] && $_GET['page'] > 1 ? '&page='.(int)$_GET['page'] : '' );
$canonical_url = xtc_href_link(FILENAME_DEFAULT, 'cPath='.$cPath.$url_param_page,$request_type,false);
}
elseif( $startpage )
{
$canonical_url = xtc_href_link(FILENAME_DEFAULT, '', $request_type);
}
// Robots //
if( xtc_not_null($cPath) )
{
if( isset($_GET['page']) && intval($_GET['page'])==$_GET['page'] && $_GET['page'] > 1 )
{
$meta_robots = 'noindex,follow'; // noindex bei kategorien ab seite 2
}
}
break;
// -----------------------------------------------------------------------------
// Daten holen: Inhalts-Seite (ContentManager)
// -----------------------------------------------------------------------------
case FILENAME_CONTENT :
// Robots //
if( isset($_GET['coID']) && in_array($_GET['coID'],$content_noindex) )
{
$meta_robots = 'noindex,follow'; // Noindex bei bestimmten Content Seiten
}
$contents_meta_query = xtc_db_query("
select
content_meta_title,
content_meta_description,
content_meta_keywords,
content_title,
content_heading,
content_text,
content_file
from
".TABLE_CONTENT_MANAGER."
where
content_group = '".(int)$_GET['coID']."'
and languages_id = '".(int)$_SESSION['languages_id']."'
");
$contents_meta = xtc_db_fetch_array($contents_meta_query,true);
if( count($contents_meta) > 0 )
{
// Eingebundene Dateien auslesen
if( !empty($contents_meta['content_file']) )
{
// Nur Text- oder HTML-Dateien erlauben
if( preg_match('/\.(?:txt|html?)$/i',$contents_meta['content_file']) )
{
$contents_meta['content_text'] .= ' '.implode(' ', @file(DIR_FS_CATALOG.'media/content/'.$contents_meta['content_file']));
}
}
// Title //
if( !empty($contents_meta['content_meta_title']) )
{
$meta_title = metaTitle($addContentShopTitle,array($contents_meta['content_meta_title']));
}
else
{
$meta_title = metaTitle($addContentShopTitle,array($contents_meta['content_title'],$contents_meta['content_heading']));
}
// Description //
if( !empty($contents_meta['content_meta_description']) )
{
$meta_descr = $contents_meta['content_meta_description'];
$metaDesLength = false;
}
else
{
#$meta_descr = ($contents_meta['content_heading'])?$contents_meta['content_heading'].': ':'';
#$meta_descr .= $contents_meta['content_text'];
}
}
// Canonical //
if( isset($_GET['coID']) )
{
$canonical_url = xtc_href_link(FILENAME_CONTENT,'coID='.$_GET['coID'],$request_type,false);
}
break;
// -----------------------------------------------------------------------------
// Title für Suchergebnisse
// -----------------------------------------------------------------------------
case FILENAME_ADVANCED_SEARCH_RESULT :
// ggf. Herstellernamen herausfinden
if( !empty($_GET['manufacturers_id']) )
{
$manu_name_query = xtDBquery("
select manufacturers_name
from ".TABLE_MANUFACTURERS."
where manufacturers_id = '".(int)$_GET['manufacturers_id']."'
");
$manu_name = xtc_db_fetch_array($manu_name_query,true);
$manu_name = (is_array($manu_name) ? implode('',$manu_name) : '');
}
// ggf. Kategorien-Namen herausfinden
if( !empty($_GET['categories_id']) )
{
$cat_name_query = xtDBquery("
select categories_name
from ".TABLE_CATEGORIES_DESCRIPTION."
where categories_id = '".(int)$_GET['categories_id']."'
and language_id = '".(int)$_SESSION['languages_id']."'
");
$cat_name = xtc_db_fetch_array($cat_name_query,true);
$cat_name = (is_array($cat_name) ? implode('',$cat_name) : '');
}
$meta_title = metaTitle($addSearchShopTitle,array($breadcrumbTitle,$Page,(isset($cat_name)?$cat_name:''),(isset($manu_name)?$manu_name:'')));
break;
// -----------------------------------------------------------------------------
// Title für Angebote
// -----------------------------------------------------------------------------
case FILENAME_SPECIALS :
$meta_title = metaTitle($addSpecialsShopTitle,array($breadcrumbTitle,$Page));
break;
// -----------------------------------------------------------------------------
// Title für Neue Artikel
// -----------------------------------------------------------------------------
case FILENAME_PRODUCTS_NEW :
$meta_title = metaTitle($addNewsShopTitle,array($breadcrumbTitle,$Page));
break;
// -----------------------------------------------------------------------------
// Title für sonstige Seiten
// -----------------------------------------------------------------------------
default:
$meta_title = metaTitle($addOthersShopTitle,array($breadcrumbTitle,$Page));
break;
// -----------------------------------------------------------------------------
} // end switch
// -----------------------------------------------------------------------------
// ...und wenn nix drin, dann nochmal kurz aufräumen
// -----------------------------------------------------------------------------
// Title //
if( empty($meta_title) )
{
$meta_title = '';
}
// Description //
if( empty($meta_descr) )
{
$meta_descr = '';
$metaDesLength = false;
}
// Robots //
if( empty($meta_robots) )
{
$meta_robots = '';
}
// Canonical //
if( empty($canonical_url) )
{
$canonical_url = '';
}
elseif( preg_match('#^https?://[^/]+/index\.php$#i',$canonical_url) )
{
$canonical_url = preg_replace('#^(https?://[^/]+/)index\.php$#i','$1',$canonical_url,1);
}
// -----------------------------------------------------------------------------
$meta_title = metaClean($meta_title);
if( !empty($meta_title) )
{
echo '<title>'.$meta_title.'</title>'."\n";
}
echo '<meta http-equiv="cache-control" content="no-cache" />'."\n";
if( !empty($_SESSION['language_charset']) )
{
echo '<meta http-equiv="content-type" content="text/html;charset='.$_SESSION['language_charset'].'" />'."\n";
}
if( !empty($_SESSION['language_code']) )
{
echo '<meta http-equiv="content-language" content="'.$_SESSION['language_code'].'" />'."\n";
echo '<meta name="language" content="'.$_SESSION['language_code'].'" />'."\n";
}
$meta_descr = metaClean($meta_descr,$metaDesLength);
if( !empty($meta_descr) )
{
echo '<meta name="description" content="'.$meta_descr.'" />'."\n";
}
if( !empty($meta_robots) )
{
echo '<meta name="robots" content="'.$meta_robots.'" />'."\n";
}
if( !empty($canonical_url) )
{
echo '<link rel="canonical" href="'.$canonical_url.'" />'."\n";
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment