Mercurial
comparison .cms/mod/sitemap.mod.php @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 <?php | |
2 | |
3 $cms["modules"]["sitemap.mod.php"] = array( | |
4 "name" => "sitemap_module_name", | |
5 "description" => "sitemap_module_description", | |
6 "files" => array( | |
7 ".cms/mod/sitemap.mod.php", | |
8 ".cms/css/sitemap.css", | |
9 ".cms/js/sitemap.js", | |
10 ".cms/lang/ru_RU.UTF-8/sitemap.mod.php", | |
11 ".cms/lang/en_US.UTF-8/sitemap.mod.php", | |
12 ".cms/lang/uk_UA.UTF-8/sitemap.mod.php", | |
13 ), | |
14 ); | |
15 | |
16 // Return if module disabled | |
17 if ( ! empty( $cms["config"]["sitemap.mod.php"]["disabled"] ) ) { | |
18 | |
19 return; | |
20 | |
21 } else { | |
22 | |
23 // Default Settings | |
24 | |
25 if ( empty( $cms["config"]["sitemap.mod.php"]["update_interval"] ) ) { | |
26 $cms["config"]["sitemap.mod.php"]["update_interval"] = 60; | |
27 } | |
28 | |
29 if ( ! isset( $cms["config"]["sitemap.mod.php"]["exclude"] ) ) { | |
30 $cms["config"]["sitemap.mod.php"]["exclude"] = ""; | |
31 } | |
32 | |
33 if ( ! isset( $cms["config"]["sitemap.mod.php"]["domain"] ) ) { | |
34 $cms["config"]["sitemap.mod.php"]["domain"] = ""; | |
35 } | |
36 | |
37 if ( ! isset( $cms["config"]["sitemap.mod.php"]["include"] ) ) { | |
38 $cms["config"]["sitemap.mod.php"]["include"] = ""; | |
39 } | |
40 | |
41 if ( empty( $cms["config"]["sitemap.mod.php"]["gen"] ) ) { | |
42 $cms["config"]["sitemap.mod.php"]["gen"] = "dynamic"; | |
43 } | |
44 | |
45 if ( ! isset( $cms["config"]["sitemap.mod.php"]["lastrun"] ) ) { | |
46 $cms["config"]["sitemap.mod.php"]["lastrun"] = ""; | |
47 } | |
48 | |
49 if ( is_admin() ) { | |
50 hook_add_fn( "admin", "cms_sitemap_admin" ); | |
51 hook_add_fn( "admin_header", "cms_sitemap_admin_header" ); | |
52 } | |
53 | |
54 if ( $cms["config"]["sitemap.mod.php"]["gen"] === "static" ) { | |
55 hook_add_fn( "cron", "cms_sitemap_cron" ); | |
56 } | |
57 | |
58 $cms["urls"]["^{$cms['base_path']}sitemap.xml$"] = "sitemap.xml"; | |
59 hook_add_fn( "sitemap.xml", "cms_sitemap_xml" ); | |
60 | |
61 } | |
62 | |
63 function cms_sitemap_admin_header() { | |
64 global $cms; | |
65 $conf = $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"]; | |
66 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
67 echo "<link rel=stylesheet href='{$cms['base_path']}css/sitemap.css'>"; | |
68 echo "<script src='{$cms['base_path']}js/sitemap.js'></script>"; | |
69 } | |
70 } | |
71 | |
72 function cms_sitemap_cron() { | |
73 global $cms; | |
74 if ( $cms["config"]["sitemap.mod.php"]["lastrun"] < date( "Y-m-d H:i:s", time() - $cms["config"]["sitemap.mod.php"]["update_interval"] * 60) ) { | |
75 unlink( "{$cms['site_dir']}/sitemap.xml" ); | |
76 $cms["config"]["sitemap.mod.php"]["lastrun"] = date( "Y-m-d H:i:s"); | |
77 cms_save_config(); | |
78 } | |
79 } | |
80 | |
81 function cms_sitemap_xml() { | |
82 global $cms; | |
83 header( "Content-Type: text/xml" ); | |
84 $sitemap = cms_sitemap_generate(); | |
85 echo $sitemap; | |
86 if ( $cms["config"]["sitemap.mod.php"]["gen"] === "static" ) { | |
87 file_put_contents( "{$cms['site_dir']}/sitemap.xml", $sitemap ); | |
88 } | |
89 } | |
90 | |
91 function cms_sitemap_update() { | |
92 global $cms; | |
93 // disable remove file | |
94 if ( ! empty( $cms["config"]["sitemap.mod.php"]["disabled"] ) ) { | |
95 return; | |
96 } | |
97 | |
98 $file = "{$cms['site_dir']}/sitemap.xml"; | |
99 if ( file_exists( $file ) ) unlink( $file ); | |
100 } | |
101 | |
102 function cms_sitemap_generate() { | |
103 global $cms; | |
104 if ( empty( $cms["base"] ) ) cms_base_connect(); | |
105 if ( empty( $cms["base"] ) ) return; | |
106 if ( mysqli_connect_error() ) return; | |
107 | |
108 if ( $cms["config"]["sitemap.mod.php"]["gen"] === "static" && ! empty( $cms["config"]["sitemap.mod.php"]["domain"] ) ) { | |
109 $domain = $cms["config"]["sitemap.mod.php"]["domain"]; | |
110 } else { | |
111 $domain = "{$cms['url']['scheme']}://{$cms['url']['host']}"; | |
112 } | |
113 | |
114 // Формат массива | |
115 // $cms["sitemap"]["https://site.com/link"] = array( | |
116 // "lastmod" => "2022-08-27T21:25:17+03:00" || "", | |
117 // "changefreq" => "weekly", | |
118 // "priority" => "0.8" | |
119 // ); | |
120 $cms["sitemap"] = array(); | |
121 | |
122 $exclude = explode( "\n", $cms["config"]["sitemap.mod.php"]["exclude"] ); | |
123 foreach( $exclude as $n => $link ) { | |
124 if ( empty( $link ) ) { | |
125 unset( $exclude[$n] ); | |
126 } | |
127 } | |
128 | |
129 $date = date( "Y-m-d H:i:s" ); | |
130 $q = "SELECT `title`, `url`, `created`, `modified`, `published` FROM `pages` WHERE `created`<='{$date}' ORDER BY `created` DESC"; | |
131 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
132 while ( $page = mysqli_fetch_assoc( $res ) ) { | |
133 if ( $page["published"] && ! in_array( $page["url"], $exclude ) ) { | |
134 if ( $modified = max( strtotime( $page["created"] ), (int) $page["modified"] ) ) { | |
135 $modified = date( "c", $modified ); | |
136 } else { | |
137 $modified = ""; | |
138 } | |
139 $link = $domain . $cms["base_path"] . $page["url"]; | |
140 if ( ! isset( $cms["sitemap"][$link] ) ) { | |
141 $cms["sitemap"][$link] = array( "lastmod" => $modified ); | |
142 } | |
143 } | |
144 } | |
145 } | |
146 | |
147 // Обязательные для включения ссылки | |
148 foreach( explode( "\n", $cms["config"]["sitemap.mod.php"]["include"] ) as $link ) { | |
149 $link = trim( $link ); | |
150 if ( ! empty( $link ) ) { | |
151 $cms["sitemap"][$link] = array( "lastmod" => "" ); | |
152 } | |
153 } | |
154 | |
155 do_hook( "sitemap" ); | |
156 | |
157 // Генерация файла | |
158 $content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"; | |
159 foreach( $cms["sitemap"] as $url => $attr ) { | |
160 if ( empty( $attr["lastmod"] ) ) { | |
161 $lastmod = ""; | |
162 } else { | |
163 $lastmod = "<lastmod>{$attr['lastmod']}</lastmod>"; | |
164 } | |
165 if ( empty( $attr["changefreq"] ) ) { | |
166 $changefreq = ""; | |
167 } else { | |
168 $changefreq = "<changefreq>{$attr['changefreq']}</changefreq>"; | |
169 } | |
170 if ( empty( $attr["priority"] ) ) { | |
171 $priority = ""; | |
172 } else { | |
173 $priority = "<priority>{$attr['priority']}</priority>"; | |
174 } | |
175 $content .= "<url><loc>{$url}</loc>{$lastmod}{$changefreq}{$priority}</url>\n"; | |
176 } | |
177 $content .= "</urlset>"; | |
178 return $content; | |
179 } | |
180 | |
181 | |
182 function cms_sitemap_admin() { | |
183 global $cms; | |
184 | |
185 $conf = $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"]; | |
186 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
187 | |
188 // Save settings | |
189 if ( ! empty( $_POST["save_settings_sitemap"] ) ) { | |
190 $list = preg_split( "/\r\n|\n\r|\r|\n/u", $_POST["exclude"] ); | |
191 $base_url = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}"; | |
192 foreach ( $list as $key => $value ) { | |
193 // remove domain | |
194 $list[$key] = trim( str_replace( $base_url, "", $value ) ); | |
195 if ( substr( $list[$key], 0, 1 ) === "/" ) $list[$key] = substr( $list[$key], 1 ); | |
196 } | |
197 $list = implode( "\n", $list ); | |
198 $cms["config"]["sitemap.mod.php"]["gen"] = $_POST["gen"]; | |
199 $cms["config"]["sitemap.mod.php"]["exclude"] = $list; | |
200 $cms["config"]["sitemap.mod.php"]["include"] = $_POST["include"]; | |
201 $cms["config"]["sitemap.mod.php"]["domain"] = rtrim( $_POST["domain"], "/" ); | |
202 $cms["config"]["sitemap.mod.php"]["update_interval"] = trim( $_POST["update_interval"] ); | |
203 cms_save_config(); | |
204 if ( $cms["config"]["sitemap.mod.php"]["gen"] === "dynamic" ) { | |
205 unlink( "{$cms['site_dir']}/sitemap.xml" ); | |
206 } | |
207 cms_sitemap_update(); | |
208 header( "Location: {$cms['base_path']}{$cms['config']['admin.mod.php']['admin_url']}" ); | |
209 $cms["hooks"]["admin"]["next"] = ""; // Предотвратить выдачу админки | |
210 return; | |
211 } | |
212 | |
213 // Create menu item if not exists | |
214 if ( empty( $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"] ) ) { | |
215 $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"] = array( | |
216 "title" => "sitemap_module_name", | |
217 "sort" => 60, | |
218 "section" => "settings", | |
219 ); | |
220 cms_save_config(); | |
221 } | |
222 | |
223 $ch["static"] = ""; | |
224 $ch["dynamic"] = ""; | |
225 $ch[ $cms["config"]["sitemap.mod.php"]["gen"] ] = "checked"; | |
226 | |
227 $sitemap = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}sitemap.xml"; | |
228 | |
229 $page = " | |
230 <div class=sitemap>" . __( "view_sitemap" ) . " <a href='{$sitemap}' target=_blank>{$sitemap}</a></div> | |
231 | |
232 <form method=post> | |
233 <div class=xml-wrapper-hidden> | |
234 <div>" . __( "excluded_links" ) . "</div> | |
235 <textarea name=exclude rows=12 autocomplete=off>{$cms['config']['sitemap.mod.php']['exclude']}</textarea> | |
236 <div class=save_2_col> | |
237 <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> | |
238 <div class=select-dropdown> | |
239 <div class=field-search> | |
240 <input class=search-field autocomplete=off placeholder='" . __( "placeholder" ) . "'> | |
241 </div> | |
242 <ul class=list-search> | |
243 | |
244 </ul> | |
245 </div> | |
246 </div> | |
247 </div> | |
248 <div class=xml-wrapper-link> | |
249 <div>" . __( "included_links" ) . "</div> | |
250 <textarea name=include rows=12 autocomplete=off>{$cms['config']['sitemap.mod.php']['include']}</textarea> | |
251 <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> | |
252 </div> | |
253 <div class=xml-static-dynamic> | |
254 <div>" . __( "sitemap_gen" ) . "</div> | |
255 <label><input name=gen type=radio value=dynamic {$ch['dynamic']}> " . __( "dynamic" ) . "</label> | |
256 <label><input name=gen type=radio value=static {$ch['static']}> " . __( "static" ) . "</label> | |
257 <div> </div> | |
258 <div>" . __( "domain" ) . "</div> | |
259 <input type=text name=domain value='{$cms['config']['sitemap.mod.php']['domain']}' placeholder='http://example.com'> | |
260 <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> | |
261 </div> | |
262 <div class=xml-static-cron> | |
263 <div>" . __( "update_freq" ) . "</div> | |
264 <p>" . __( "static_freq" ) . " <input type=text name=update_interval value={$cms['config']['sitemap.mod.php']['update_interval']}> " . __( "minutes" ) . "</p> | |
265 <p>" . __( "url_for_cron" ) . ": {$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}{$cms['config']['admin.mod.php']['cron_url']}</p> | |
266 <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> | |
267 </div> | |
268 </form> | |
269 | |
270 <div class=sitemap-manual> | |
271 <div>" . __( "help" ) . "</div> | |
272 <p>" . __( "help_p1" ) . "</p> | |
273 <p>" . __( "help_p2" ) . "</p> | |
274 </div> | |
275 "; | |
276 | |
277 $cms["admin_pages"]["sitemap"] = $page; | |
278 | |
279 } | |
280 } |