ConLite/conlite/plugins/chains/createmetatags/include.chain.content.creat...

298 Zeilen
9.7 KiB
PHP

<?php
/**
* Project:
* ConLite CMS
*
* Description:
* Generate metatags for current article if they are not set in article properties
*
* @package ConLite Core
* @subpackage Chains
* @version $Id$:
* @author Ortwin Pinke
*
* based on CONTENIDO 4.8.15 [2011-07-31]
* @author Andreas Lindner, Unknown
* @copyright four for business AG <www.4fb.de>
* @license http://www.contenido.org/license/LIZENZ.txt
* @link http://www.4fb.de
* @link http://www.contenido.org
*
*/
/**
* No direct call
*/
if(!defined('CON_FRAMEWORK')) {
die('Illegal call');
}
// Compatibility for php < 5.3 using closures or not, @todo remove if we only support PHP >= 5.3
if(version_compare(PHP_VERSION, "5.3", "<")) {
cInclude("plugins", "chains/createmetatags/includes/keyword_density_php52.php");
} else {
cInclude("plugins", "chains/createmetatags/includes/keyword_density.php");
}
cInclude("plugins", "chains/createmetatags/classes/class.metatag.creator.html5.php");
function cecCreateMetatags($metatags) {
global $cfg, $lang, $idart, $client, $cfgClient, $idcat, $idartlang;
$bIsHTML5 = ((getEffectiveSetting('generator', 'html5', 'false') == 'false') ? false : true);
if($bIsHTML5) {
$aConfig = array(
'cachetime' => 3600,
'cachedir' => $cfgClient[$client]['path']['frontend'] . "cache/"
);
$oHtml5MetaCreator = new MetaTagCreatorHtml5($metatags, $aConfig);
return $oHtml5MetaCreator->generateMetaTags();
}
//Basic settings
$cachetime = 3600; // measured in seconds
$cachedir = $cfgClient[$client]['path']['frontend'] . "cache/";
if (!is_array($metatags)) {
$metatags = array();
}
$hash = 'metatag_'.md5($idart.'/'.$lang);
$cachefilename = $cachedir.$hash.'.tmp';
#Check if rebuilding of metatags is necessary
$reload = true;
$fileexists = false;
if (file_exists($cachefilename)) {
$fileexists = true;
$diff = time() - filemtime($cachefilename);
if ($diff > $cachetime) {
$reload = true;
} else {
$reload = false;
}
}
if ($reload) {
//(Re)build metatags
$db = new DB_ConLite();
#Get encoding
$sql = "SELECT * FROM ".$cfg['tab']['lang']." WHERE idlang=".(int)$lang;
$db->query($sql);
if ($db->next_record()) {
$sEncoding = strtoupper($db->f('encoding'));
} else {
$sEncoding = "ISO-8859-1";
}
#Get idcat of homepage
$sql = "SELECT a.idcat
FROM
".$cfg['tab']['cat_tree']." AS a,
".$cfg['tab']['cat_lang']." AS b
WHERE
(a.idcat = b.idcat) AND
(b.visible = 1) AND
(b.idlang = ".Contenido_Security::toInteger($lang).")
ORDER BY a.idtree LIMIT 1";
$db->query($sql);
if ($db->next_record()) {
$idcat_homepage = $db->f('idcat');
}
$availableTags = conGetAvailableMetaTagTypes();
#Get first headline and first text for current article
$oArt = new Article ($idart, $client, $lang);
#Set idartlang, if not set
if ($idartlang == '') {
$idartlang = $oArt->getIdArtLang();
}
$arrHead1 = $oArt->getContent("htmlhead");
$arrHead2 = $oArt->getContent("head");
if (!is_array($arrHead1)) {
$arrHead1 = array();
}
if (!is_array($arrHead2)) {
$arrHead2 = array();
}
$arrHeadlines = array_merge($arrHead1, $arrHead2);
foreach ($arrHeadlines as $key => $value) {
if ($value != '') {
$sHeadline = $value;
break;
}
}
$sHeadline = strip_tags($sHeadline);
$sHeadline = substr(str_replace(chr(13).chr(10),' ',$sHeadline),0,100);
$arrText1 = $oArt->getContent("html");
$arrText2 = $oArt->getContent("text");
if (!is_array($arrText1)) {
$arrText1 = array();
}
if (!is_array($arrText2)) {
$arrText2 = array();
}
$arrText = array_merge($arrText1, $arrText2);
foreach ($arrText as $key => $value) {
if ($value != '') {
$sText = $value;
break;
}
}
$sText = strip_tags(urldecode($sText));
$sText = keywordDensity ('', $sText);
//Get metatags for homeapge
$arrHomepageMetaTags = array();
$sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE (idcat=".Contenido_Security::toInteger($idcat_homepage).") AND(idlang=".Contenido_Security::toInteger($lang).")";
$db->query($sql);
if($db->next_record()){
$iIdArtLangHomepage = $db->f('startidartlang');
#get idart of homepage
$sql = "SELECT idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang =".Contenido_Security::toInteger($iIdArtLangHomepage);
$db->query($sql);
if ($db->next_record()) {
$iIdArtHomepage = $db->f('idart');
}
$t1 = $cfg["tab"]["meta_tag"];
$t2 = $cfg["tab"]["meta_type"];
$sql = "SELECT ".$t1.".metavalue,".$t2.".metatype FROM ".$t1.
" INNER JOIN ".$t2." ON ".$t1.".idmetatype = ".$t2.".idmetatype WHERE ".
$t1.".idartlang =".$iIdArtLangHomepage.
" ORDER BY ".$t2.".metatype";
$db->query($sql);
while ($db->next_record()) {
$arrHomepageMetaTags[$db->f("metatype")] = $db->f("metavalue");
}
$oArt = new Article ($iIdArtHomepage, $client, $lang);
$arrHomepageMetaTags['pagetitle'] = $oArt->getField('title');
}
//Cycle through all metatags
foreach ($availableTags as $key => $value) {
$metavalue = conGetMetaValue($idartlang, $key);
if (strlen($metavalue) == 0){
//Add values for metatags that don't have a value in the current article
switch(strtolower($value["name"])){
case 'author':
//Build author metatag from name of last modifier
$oArt = new Article ($idart, $client, $lang);
$lastmodifier = $oArt->getField("modifiedby");
$oUser = new User();
$oUser->loadUserByUserID(md5($lastmodifier));
$lastmodifier_real = $oUser->getRealname(md5($lastmodifier));
$iCheck = CheckIfMetaTagExists($metatags, 'author');
$metatags[$iCheck]['name'] = 'author';
$metatags[$iCheck]['content'] = $lastmodifier_real;
break;
case 'date':
//Build date metatag from date of last modification
$oArt = new Article ($idart, $client, $lang);
$lastmodified = $oArt->getField("lastmodified");
$iCheck = CheckIfMetaTagExists($metatags, 'date');
$metatags[$iCheck]['name'] = 'date';
$metatags[$iCheck]['content'] = $lastmodified;
break;
case 'description':
//Build description metatag from first headline on page
$iCheck = CheckIfMetaTagExists($metatags, 'description');
$metatags[$iCheck]['name'] = 'description';
$metatags[$iCheck]['content'] = $sHeadline;
break;
case 'keywords':
$iCheck = CheckIfMetaTagExists($metatags, 'keywords');
$metatags[$iCheck]['name'] = 'keywords';
$metatags[$iCheck]['content'] = $sText;
break;
case 'revisit-after':
case 'robots':
case 'expires':
//Build these 3 metatags from entries in homepage
$sCurrentTag = strtolower($value["name"]);
$iCheck = CheckIfMetaTagExists($metatags, $sCurrentTag);
$metatags[$iCheck]['name'] = $sCurrentTag;
$metatags[$iCheck]['content'] = $arrHomepageMetaTags[$sCurrentTag];
break;
}
}
}
// save metatags in cache file
file_put_contents($cachefilename, serialize($metatags));
} else {
#Get metatags from file system cache
$metatags = unserialize(file_get_contents($cachefilename));
}
return $metatags;
}
/**
* Checks if the metatag allready exists inside the metatag list.
*
* @param array|mixed $arrMetatags List of metatags or not a list
* @param string $sCheckForMetaTag The metatag to check
* @return int Position of metatag inside the metatag list or the next
* available position
*/
function CheckIfMetaTagExists($arrMetatags, $sCheckForMetaTag) {
if (!is_array($arrMetatags) || count($arrMetatags) == 0) {
// metatag list ist not set or empty, return initial position
return 0;
}
// loop thru existing metatags and check against the listitem name
foreach ($arrMetatags as $pos => $item) {
if ($item['name'] == $sCheckForMetaTag) {
// metatag found -> return the position
return $pos;
}
}
// metatag doesn't exists, return next position
return count($arrMetatags);
}
?>