Instantly share code, notes, and snippets.
Created
May 17, 2012 22:56
-
Star
1
(1)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
-
Save Abromeit/2722140 to your computer and use it in GitHub Desktop.
xtcModified SEO Enhancements ^-^ /includes/modules/metatags.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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 ä ö | |
| - "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 = 65; // 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) | |
| // ----------------------------------------------------------------------------- | |
| $script_basename = basename($_SERVER['SCRIPT_NAME']); | |
| $meta_robots = 'index,follow'; | |
| if( in_array($script_basename,$files_noindex) ) | |
| { | |
| $meta_robots = 'noindex,follow'; | |
| } | |
| // ----------------------------------------------------------------------------- | |
| // MultiLanguage-Metas | |
| // ----------------------------------------------------------------------------- | |
| // Wenn wir auf der Startseite sind, Metas aus der Index-Seite holen | |
| if( | |
| $script_basename==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; | |
| //remove elements that would be empty | |
| $title = array_filter((array)$title,'metaClean'); | |
| // append shopname if $title && shopname are not empty | |
| if( $allow_appended_shopname && !empty($title) && metaClean(ML_TITLE) ) | |
| { | |
| $title[] = ML_TITLE; | |
| } | |
| // join all that stuff | |
| $res_tmp = array(); | |
| foreach($title as $k=>$v) | |
| { | |
| // if element is already contained in our title | |
| if( !empty($res) && strpos($res,$v) !== false ) | |
| continue; | |
| $res_tmp[] = $v; | |
| $res = implode($metaTitleSeparator,$res_tmp); | |
| // if new title length exceeds our maximum | |
| if( $k > 0 && strlen($res) > $metaTitleLength ) //fixme: not that precise, see metaClean() | |
| { | |
| array_pop($res_tmp); | |
| $res = implode($metaTitleSeparator,$res_tmp); | |
| break; | |
| } | |
| } | |
| return $res; | |
| } | |
| // ----------------------------------------------------------------------------- | |
| switch( $script_basename ) | |
| { | |
| // ----------------------------------------------------------------------------- | |
| // 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