Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some small bugs fixed. The frequency update parameter was added. #13

Merged
merged 1 commit into from Dec 23, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
241 changes: 202 additions & 39 deletions core/components/shopkeeper3/elements/snippets/snippet.sitemap.php
@@ -1,5 +1,4 @@
<?php

/**
* snippet shk_sitemap
*
Expand Down Expand Up @@ -27,34 +26,64 @@
&classNames=`modResource,ShopContent`
&contexts=`web,catalog`
]]
3. Excluding resources

excluding resources with ids 17,23,31,16:

[[shk_sitemap?
&packageNames=`modResource,shop`
&classNames=`modResource,ShopContent`
&contexts=`web,catalog`
&excludeModResIds=`17,23,31,16`
]]
and excluding resources with ids 17,23,31,16 and 1 level childs of resources with ids 17,11,23,14
[[shk_sitemap?
&packageNames=`modResource,shop`
&classNames=`modResource,ShopContent`
&contexts=`web,catalog`
&excludeModResIds=`17,23,31,16`
&excludeModContIds=`17,11,23,14`
]]




*/

$config = array(
'packageNames' => 'modResource,shop',
'classNames' => 'modResource,ShopContent',
'contexts' => 'web,catalog'
'contexts' => 'web,catalog',
'site_url'=> $modx->getOption('site_url'),
'site_start'=> $modx->getOption('site_start', null, 1),
'excludeModResIds'=>'17,23,31,16,19,20',
'excludeModContIds'=>'17,11,23,14'
);

$config = array_merge( $config, $scriptProperties );
$contentType = $modx->getObject('modContentType',array('name'=>'HTML'));
$config['urlSuffix'] = $contentType->getExtension();
$config['containerSuffix'] = $modx->getOption('container_suffix');
$config['urlSuffix']= $contentType->getExtension();
$config['containerSuffix']=$modx->getOption('container_suffix');
$config = array_merge( $config, $scriptProperties );


$packageNames = explode(',',$config['packageNames']);
$classNames = explode(',',$config['classNames']);
$contexts = explode(',',$config['contexts']);

$output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">" . PHP_EOL;
$output = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;

if(!function_exists('getMapQuery')){
function getMapQuery($className,$select){
function getMapQuery($className,$select,$where){
global $modx;
$query = $modx->newQuery($className);
$query->select($select);
$query->where( array( 'published' => 1, 'hidemenu' => 0 ) );
$query->where($where);
$query->sortby('id','ASC');
if ( $query->prepare() && $query->stmt->execute() ){
$query_out= array();
//$modx->log(modX::LOG_LEVEL_ERROR, $query->toSql());
$query_out=$query->stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($query_out as $r){
if (!isset($resources[$r['id']])) $resources[$r['id']]=array();
foreach ($select as $s){
Expand All @@ -65,49 +94,183 @@ function getMapQuery($className,$select){
return $resources;
}
}
if (!function_exists('datediff')) {
/**
* @param string $interval Can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The
datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
* @param $datefrom
* @param $dateto
* @param bool $using_timestamps
* @return float|int|string
* @package googlesitemap
*/
function datediff($interval, $datefrom, $dateto, $using_timestamps = false) {
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
$difference = $dateto - $datefrom; /* Difference in seconds */
switch($interval) {
case 'yyyy': /* Number of full years */
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;

$packageNames = explode(',',$config['packageNames']);
$classNames = explode(',',$config['classNames']);
$contexts = explode(',',$config['contexts']);
case 'q': /* Number of full quarters */
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$quarters_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;

case 'm': /* Number of full months */
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;

case 'y': /* Difference between day numbers */
$datediff = date('z',$dateto) - date('z',$datefrom);
break;

case 'd': /* Number of full days */
$datediff = floor($difference / 86400);
break;

case 'w': /* Number of full weekdays */
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); /* Complete weeks */
$first_day = date('w', $datefrom);
$days_remainder = floor($days_difference % 7);
/* Do we have a Saturday or Sunday in the remainder? */
$odd_days = $first_day + $days_remainder;
if ($odd_days > 7) { /* Sunday */
$days_remainder--;
}
if ($odd_days > 6) { /* Saturday */
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;

case 'ww': /* Number of full weeks */
$datediff = floor($difference / 604800);
break;

case 'h': /* Number of full hours */
$datediff = floor($difference / 3600);
break;

case 'n': /* Number of full minutes */
$datediff = floor($difference / 60);
break;

default: /* Number of full seconds (default) */
$datediff = $difference;
break;
}
return $datediff;
}
}


foreach ( $packageNames as $key => $packageName ){

$parentName = $packageName == 'modResource' ? "parent" : "resource_id";
$select = array('id','alias','editedon',$parentName);
$select = array('id','alias','editedon','createdon',$parentName);
if( $packageName != 'modResource' ){
$modelpath = $modx->getOption('core_path') . 'components/' . $packageName . '/model/';
$modx->addPackage($packageName, $modelpath);
}
else{
$select = array_merge( $select, array('context_key','isfolder') );
}

$resources = getMapQuery($classNames[$key],$select);
}

$where=array( 'published' => 1 );
if($config['excludeModResIds'] && $packageName == 'modResource'){
$ids=array('id:NOT IN' => explode(',',$config['excludeModResIds'] ));
array_push($where,$ids);
}
if($config['excludeModContIds']&& $packageName == 'modResource'){
$ids=array('parent:NOT IN' => explode(',',$config['excludeModContIds'] ));
array_push($where,$ids);
}
$resources = getMapQuery($classNames[$key],$select,$where);
if(!empty($resources)){
foreach ( $resources as $resource ){

if (!isset($resource['context_key'])) $resource['context_key'] = !empty( $contexts[$key] ) ? $contexts[$key] : $contexts[0];
if ( $resource[$parentName] != 0 ){
$url = $modx->makeUrl($resource[$parentName],$resource['context_key'],'','full');
}
else{
$url = $modx->getOption('site_url');
}
$url .= $resource['alias'];
$url .= !empty( $resource['isfolder'] ) ? $config['containerSuffix'] : $config['urlSuffix'];
$editedon = !empty( $resource['editedon'] ) ? $resource['editedon'] : $resource['createdon'];
$date = strftime( '%Y-%m-%d', $editedon );
$output .= "
<url>
<loc>{$url}</loc>
<lastmod>{$date}</lastmod>
<priority>0.9</priority>
<changefreq>monthly</changefreq>
</url>";
}
if(!empty($resource['alias'])){
if (!isset($resource['context_key'])) {
$resource['context_key'] = !empty( $contexts[$key] ) ? $contexts[$key] : $contexts[0];
}
if ( $resource[$parentName] != 0 ){
$url = $modx->makeUrl($resource[$parentName],$resource['context_key'],'','full');
}
else{
$url = $config['site_url'];
}

$url .=substr($url, -1)=='/' ? $resource['alias'] : '/'.$resource['alias'];
$url .= !empty( $resource['isfolder'] ) ? $config['containerSuffix'] : $config['urlSuffix'];

if ($packageName == 'modResource'&& $resource['id']==$config['site_start']){
$url=$config['site_url'];
}

$date = !empty( $resource['editedon'] ) ? $resource['editedon'] : $resource['createdon'];
$date = strftime( '%Y-%m-%d', $date );
$date = date("Y-m-d", strtotime($date));

/* Get the date difference */
$datediff = datediff("d", $date, date("Y-m-d"));
if ($datediff <=1) {
$priority = '1.0';
$update = 'daily';
} elseif (($datediff >1) && ($datediff<=7)) {
$priority = '0.75';
$update = 'weekly';
} elseif (($datediff >7) && ($datediff<=30)) {
$priority = '0.50';
$update = 'weekly';
} else {
$priority = '0.25';
$update = 'monthly';
}

$output .= "
<url>
<loc>{$url}</loc>
<lastmod>{$date}</lastmod>
<priority>{$priority}</priority>
<changefreq>{$update}</changefreq>
</url>";
}
}
}
}
unset($key);

$output .= PHP_EOL . "</urlset>";

return $output;
return $output;