298 Zeilen
9.7 KiB
PHP
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);
|
|
}
|
|
?>
|