Как автоматически создать sitemap.xml в CMS MODx

21.02.2010, рубрики: MODx | Теги: , , , , | 1 043 комментария »

Если вы хотите чтобы ваш сайт понравился поисковым машинам от Yandex и Google, необходимо динамически создавать файл sitemap.xml.

Рассмотрим пример автоматического создания файла sitemap.xml в CMS MODx.

Для его установки необходимо создать сниппет sitemap и скопировать в него содержимое:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<?php
# $startid [ int ]
# Id of the 'root' document from which the sitemap
# starts.
# Default: 0

$startid = (isset($startid)) ? $startid : 0;

# $format [ sp | txt | ror ]
# Which format of sitemap to use:
# - sp <- Sitemap Protocol used by Google
# - txt <- text file with list of URLs
# TODO - ror <- Resource Of Resources
# Default: sp

$format = (isset($format) && ($format != 'ror')) ? $format : 'sp';

# $priority [ str ]
# Name of TV which sets the relative priority of
# the document. If there is no such TV, this
# parameter will not be used.
# Default: sitemap_priority

$priority = (isset($priority)) ? $priority : 'sitemap_priority';

# $changefreq [ str ]
# Name of TV which sets the change frequency. If
# there is no such TV this parameter will not be
# used.
# Default: sitemap_changefreq

$changefreq = (isset($changefreq)) ? $changefreq : 'sitemap_changefreq';

# $excludeTemplates [ str ]
# Documents based on which templates should not be
# included in the sitemap. Comma separated list
# with names of templates.
# Default: empty

$excludeTemplates = (isset($excludeTemplates)) ? $excludeTemplates : array();

# $excludeTV [ str ]
# Name of TV (boolean type) which sets document
# exclusion form sitemap. If there is no such TV
# this parameter will not be used.
# Default: 'sitemap_exclude'

$excludeTV = (isset($excludeTV)) ? $excludeTV : 'sitemap_exclude';

# $xsl [ str ]
# URL to the XSL style sheet
# or
# $xsl [ int ]
# doc ID of the XSL style sheet

$xsl = (isset($xsl)) ? $xsl : '';
if (is_numeric($xsl)) { $xsl = $modx->makeUrl($xsl); }


# $excludeWeblinks [ bool ]
# Should weblinks be excluded?
# You may not want to include links to external sites in your sitemap,
# and Google gives warnings about multiple redirects to pages
# within your site.
# Default: false
$excludeWeblinks = (isset($excludeWeblinks)) ? $excludeWeblinks : false;


/* End parameters
----------------------------------------------- */


# get list of documents
# ---------------------------------------------
$docs = getDocs($modx,$startid,$priority,$changefreq,$excludeTV);


# filter out documents by template or TV
# ---------------------------------------------
// get all templates
$select = $modx->db->select("id, templatename", $modx->getFullTableName('site_templates'));
while ($query = $modx->db->getRow($select)) {
    $allTemplates[$query['id']] = $query['templatename'];
}

$remainingTemplates = $allTemplates;

// get templates to exclude, and remove them from the all templates list
if (!empty ($excludeTemplates)) {
   
    $excludeTemplates = explode(",", $excludeTemplates);   
   
    // Loop through each template we want to exclude
    foreach ($excludeTemplates as $template) {
        $template = trim($template);
       
        // If it's numeric, assume it's an ID, and remove directly from the $allTemplates array
        if (is_numeric($template) && isset($remainingTemplates[$template])) {
            unset($remainingTemplates[$template]);
        } else if (trim($template) && in_array($template, $remainingTemplates)) { // If it's text, and not empty, assume it's a template name
            unset($remainingTemplates[array_search($template, $remainingTemplates)]);          
        }
    } // end foreach
}

$output= array();
// filter out documents which shouldn't be included
foreach ($docs as $doc)
{
    if (isset($remainingTemplates[$doc['template']]) && !$doc[$excludeTV] && $doc['published'] && $doc['template']!=0 && $doc['searchable']) {
        if (!$excludeWeblinks || ($excludeWeblinks && $doc['type'] != 'reference')) {
            $output[] = $doc;      
        }
    }
}
$docs = $output;
unset ($output, $allTemplates, $excludeTemplates);


# build sitemap in specified format
# ---------------------------------------------

switch ($format)
{
    // Next case added in version 1.0.4
    case 'ulli': // UL List
        $output .= "<ul class="sitemap">\n";
        // TODO: Sort the array on Menu Index
        // TODO: Make a nested ul-li based on the levels in the document tree.
        foreach ($docs as $doc)
        {
            $s  = "  <li class="sitemap">";
            $s .= "<a href="[(site_url)][~" . $doc['id'] . "~]" class="sitemap">" . $doc['pagetitle'] . "</a>";
            $s .= "</li>\n";
            $output .= $s;
        } // end foreach
        $output .= "</ul>\n";
        break;
       
    case 'txt': // plain text list of URLs

        foreach ($docs as $doc)
        {
            $url = '[(site_url)][~'.$doc['id'].'~]';

            $output .= $url."\n";
        } // end foreach
        break;

    case 'ror': // TODO
    default: // Sitemap Protocol

   
    $output = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
    if ($xsl != '') {
        $output .='<?xml-stylesheet type="text/xsl" href="'.$xsl.'"?>'."\n";
    }
    $output .='<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
   
   
    foreach ($docs as $doc) {
        $url = '[(site_url)][~'.$doc['id'].'~]';
        $date = $doc['editedon'];
        $date = date("Y-m-d", $date);
        $docPriority = ($doc[$priority]) ? $doc[$priority] : 0; // false if TV doesn't exist
        $docChangefreq = ($doc[$changefreq]) ? $doc[$changefreq] : 0; // false if TV doesn't exist

        $output .= "\t".'<url>'."\n";
        $output .= "\t\t".'<loc>'.$url.'</loc>'."\n";
        $output .= "\t\t".'<lastmod>'.$date.'</lastmod>'."\n";
        $output .= ($docPriority) ? ("\t\t".'<priority>'.$docPriority.'</priority>'."\n") : ''; // don't output anything if TV doesn't exist
        $output .= ($docChangefreq) ? ("\t\t".'<changefreq>'.$docChangefreq.'</changefreq>'."\n") : ''; // don't output anything if TV doesn't exist
        $output .= "\t".'</url>'."\n";
    } // end foreach
    $output .= '</urlset>';

} // end switch

return $output;

# functions
# ---------------------------------------------

# gets (inherited) value of template variable
function getTV($modx,$docid,$doctv)
{
/* apparently in 0.9.2.1 the getTemplateVarOutput function doesn't work as expected and doesn't return INHERITED value; this is probably to be fixed for next release; see http://modxcms.com/bugs/task/464
    $output = $modx->getTemplateVarOutput($tv,$docid);
    return $output[$tv];
*/

   
    while ($pid = $modx->getDocument($docid,'parent'))
    {
        $tv = $modx->getTemplateVar($doctv,'*',$docid);
        if (($tv['value'] && substr($tv['value'],0,8) != '@INHERIT') or !$tv['value']) // tv default value is overriden (including empty)
        {
            $output = $tv['value'];
            break;
        }
        else // there is no parent with default value overriden
        {
            $output = trim(substr($tv['value'],8));
        }
        $docid = $pid['parent']; // move up one document in document tree
    } // end while
   
    return $output;
}

# gets list of published documents with properties
function getDocs($modx,$startid,$priority,$changefreq,$excludeTV)
{
    // get children documents
    $docs = $modx->getActiveChildren($startid,'menuindex','asc','id,editedon,template,published,searchable,pagetitle,type');
    // add sub-children to the list
    foreach ($docs as $key => $doc)
    {
        $id = $doc['id'];
        $docs[$key][$priority] = getTV($modx,$id,$priority); // add priority property
        $docs[$key][$changefreq] = getTV($modx,$id,$changefreq); // add changefreq property
        $docs[$key][$excludeTV] = getTV($modx,$id,$excludeTV); // add excludeTV property
       
        if ($modx->getActiveChildren($id))
            $docs = array_merge($docs, getDocs($modx,$id,$priority,$changefreq,$excludeTV));
    } // end foreach
    return $docs;
}
?>

Для этого нам потребуется:

1. Создать TV параметры sitemap_changefreq и sitemap_priority
sitemap_changefreq
Тип: DropDown List Menu
Возможные значения: always||hourly||daily||weekly||monthly||yearly||never
Значение по умолчанию: поставьте наиболее актуальный для вашего сайта период обновления.

sitemap_priority
Тип: DropDown List Menu
Возможные значения: .1||.2|| .3|| .5|| .6|| .7|| .8|| .9 || 1
Значение по умолчанию: .5 (можете поставить любое другое).

2. Создать новый документ в корне сайта

3. Установить Псевдоним: sitemap.xml

4. Выбрать шаблон (blank) в настройках документа-общие

5. Если HTML-редактор контента включен, отключить его

6. Выбрать тип содержимого text/xml в настройках страницы

7. В контент внести [[sitemap]]

8. Обновить сайт.

Возникает вопрос: как исключить из google sitemap некоторые страницы. Сниппет sitemapподдерживает два способа исключения документов:

— по TV-параметру

Необходимо создать TV-параметр sitemap_exclude типа DropDown List Menu с возможными значениями 0||1 и значением по умолчанию 0 для всех шаблонов. Далее выбрать для него значение 1 на всех страницах, которые не должны отображаться в карте сайта.

— по имени шаблона

В вызове можно указать шаблоны или идентификаторы шаблонов страниц, которые не должны отображаться в карте сайта. Код вызова будет примерно таким:

1
[[sitemap? &excludeTemplates=`myTemplateName,3,4`]]

via: http://www.mgordeev.ru/2009/08/modxsitemap/


1 043 комментария на запись “Как автоматически создать sitemap.xml в CMS MODx”

  1. 1 KimHycle сказала в 13:08, 12.01.2022:

    tadalafil mexico

  2. 2 sildenafil pronunciation сказала в 14:23, 12.01.2022:

    sildenafil pronunciation

    sildenafil pronunciation

  3. 3 Lqgnhf сказала в 22:52, 12.01.2022:

    doxycycline us — generic prednisolone 40mg order generic levothyroxine

  4. 4 TedHycle сказала в 14:55, 13.01.2022:

    antabuse pills online

  5. 5 CarlHycle сказала в 15:33, 13.01.2022:

    can you buy sildenafil over the counter

  6. 6 canadian pharmacy tadalafil сказала в 22:22, 13.01.2022:

    canadian pharmacy tadalafil

    canadian pharmacy tadalafil

  7. 7 cialis 2019 сказала в 7:07, 14.01.2022:

    cialis 2019

    cialis 2019

  8. 8 stromectol medicine сказала в 11:38, 14.01.2022:

    cialis da 20 vendita cialis online italia cialis?trackid=sp-006 quanto costa cialis in farmacia

  9. 9 NickHycle сказала в 21:25, 14.01.2022:

    buy generic viagra canadian pharmacy

  10. 10 KimHycle сказала в 9:47, 15.01.2022:

    buy cialis online in india

  11. 11 AnnaHycle сказала в 16:57, 15.01.2022:

    cialis cheapest price

  12. 12 JoeHycle сказала в 19:34, 15.01.2022:

    buy cialis online australia

  13. 13 JaneHycle сказала в 0:51, 16.01.2022:

    generic cialis 20 mg

  14. 14 JaneHycle сказала в 2:02, 16.01.2022:

    cialis soft generic

  15. 15 MiaHycle сказала в 13:14, 16.01.2022:

    how to get cialis prescription online

  16. 16 tadalafil 30mg tablet сказала в 23:05, 16.01.2022:

    tadalafil 30mg tablet

    tadalafil 30mg tablet

  17. 17 JimHycle сказала в 0:13, 17.01.2022:

    stromectol price

  18. 18 KimHycle сказала в 5:12, 17.01.2022:

    ivermectin 1mg

  19. 19 lowest price sildenafil сказала в 21:56, 17.01.2022:

    lowest price sildenafil

    lowest price sildenafil

  20. 20 Thissefef сказала в 19:56, 18.01.2022:

    arse takin

    chwawa.com/blog/475480/ch...urchase-reviews/ noroclav price united kingdom

    cane stanford wage

  21. 21 KiaHycle сказала в 23:55, 18.01.2022:

    tadalafil soft

  22. 22 JaneHycle сказала в 1:53, 19.01.2022:

    cheap viagra 100mg canada

  23. 23 MiaHycle сказала в 2:11, 19.01.2022:

    price of viagra generic

  24. 24 IvyHycle сказала в 4:04, 19.01.2022:

    estrace canadian

  25. 25 TedHycle сказала в 11:55, 19.01.2022:

    ivermectin in india

  26. 26 SamHycle сказала в 16:17, 19.01.2022:

    viagra tablet india

  27. 27 interactions for azithromycin сказала в 18:15, 19.01.2022:

    interactions for azithromycin

    interactions for azithromycin

  28. 28 MiaHycle сказала в 19:32, 19.01.2022:

    glucophage online pharmacy

  29. 29 WimHycle сказала в 19:35, 19.01.2022:

    ivermectin 1mg

  30. 30 Peloven сказала в 1:25, 20.01.2022:

    chewing up viagra

  31. 31 CarlHycle сказала в 4:34, 20.01.2022:

    sildenafil uk pharmacy

  32. 32 YonHycle сказала в 4:44, 20.01.2022:

    sildenafil 100mg free shipping

  33. 33 JackHycle сказала в 14:57, 20.01.2022:

    buy cialis online safely

  34. 34 KiaHycle сказала в 19:20, 20.01.2022:

    generic viagra mastercard

  35. 35 Uymowx сказала в 19:34, 20.01.2022:

    tizanidine online — toradol order online order colchicine 0.5mg online

  36. 36 AnnaHycle сказала в 0:28, 21.01.2022:

    discount cialis australia

  37. 37 AnnaHycle сказала в 1:05, 21.01.2022:

    buy cheap viagra pills online

  38. 38 ZakHycle сказала в 9:42, 21.01.2022:

    cost for cialis 5mg

  39. 39 JackHycle сказала в 17:29, 21.01.2022:

    generic viagra sildenafil

  40. 40 MiaHycle сказала в 4:41, 22.01.2022:

    cialis daily online pharmacy

  41. 41 AmyHycle сказала в 1:14, 23.01.2022:

    ivermectin 2%

  42. 42 MaryHycle сказала в 13:31, 23.01.2022:

    real cialis for sale

  43. 43 meloxicam vs ibuprofen safety сказала в 13:36, 24.01.2022:

    meloxicam vs ibuprofen safety

    meloxicam vs ibuprofen safety


Оставить комментарий


  • три × три =