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 }