Mercurial
diff .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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.cms/mod/sitemap.mod.php Fri Oct 11 22:40:23 2024 +0000 @@ -0,0 +1,280 @@ +<?php + +$cms["modules"]["sitemap.mod.php"] = array( + "name" => "sitemap_module_name", + "description" => "sitemap_module_description", + "files" => array( + ".cms/mod/sitemap.mod.php", + ".cms/css/sitemap.css", + ".cms/js/sitemap.js", + ".cms/lang/ru_RU.UTF-8/sitemap.mod.php", + ".cms/lang/en_US.UTF-8/sitemap.mod.php", + ".cms/lang/uk_UA.UTF-8/sitemap.mod.php", + ), +); + +// Return if module disabled +if ( ! empty( $cms["config"]["sitemap.mod.php"]["disabled"] ) ) { + + return; + +} else { + + // Default Settings + + if ( empty( $cms["config"]["sitemap.mod.php"]["update_interval"] ) ) { + $cms["config"]["sitemap.mod.php"]["update_interval"] = 60; + } + + if ( ! isset( $cms["config"]["sitemap.mod.php"]["exclude"] ) ) { + $cms["config"]["sitemap.mod.php"]["exclude"] = ""; + } + + if ( ! isset( $cms["config"]["sitemap.mod.php"]["domain"] ) ) { + $cms["config"]["sitemap.mod.php"]["domain"] = ""; + } + + if ( ! isset( $cms["config"]["sitemap.mod.php"]["include"] ) ) { + $cms["config"]["sitemap.mod.php"]["include"] = ""; + } + + if ( empty( $cms["config"]["sitemap.mod.php"]["gen"] ) ) { + $cms["config"]["sitemap.mod.php"]["gen"] = "dynamic"; + } + + if ( ! isset( $cms["config"]["sitemap.mod.php"]["lastrun"] ) ) { + $cms["config"]["sitemap.mod.php"]["lastrun"] = ""; + } + + if ( is_admin() ) { + hook_add_fn( "admin", "cms_sitemap_admin" ); + hook_add_fn( "admin_header", "cms_sitemap_admin_header" ); + } + + if ( $cms["config"]["sitemap.mod.php"]["gen"] === "static" ) { + hook_add_fn( "cron", "cms_sitemap_cron" ); + } + + $cms["urls"]["^{$cms['base_path']}sitemap.xml$"] = "sitemap.xml"; + hook_add_fn( "sitemap.xml", "cms_sitemap_xml" ); + +} + +function cms_sitemap_admin_header() { + global $cms; + $conf = $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"]; + if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { + echo "<link rel=stylesheet href='{$cms['base_path']}css/sitemap.css'>"; + echo "<script src='{$cms['base_path']}js/sitemap.js'></script>"; + } +} + +function cms_sitemap_cron() { + global $cms; + if ( $cms["config"]["sitemap.mod.php"]["lastrun"] < date( "Y-m-d H:i:s", time() - $cms["config"]["sitemap.mod.php"]["update_interval"] * 60) ) { + unlink( "{$cms['site_dir']}/sitemap.xml" ); + $cms["config"]["sitemap.mod.php"]["lastrun"] = date( "Y-m-d H:i:s"); + cms_save_config(); + } +} + +function cms_sitemap_xml() { + global $cms; + header( "Content-Type: text/xml" ); + $sitemap = cms_sitemap_generate(); + echo $sitemap; + if ( $cms["config"]["sitemap.mod.php"]["gen"] === "static" ) { + file_put_contents( "{$cms['site_dir']}/sitemap.xml", $sitemap ); + } +} + +function cms_sitemap_update() { + global $cms; + // disable remove file + if ( ! empty( $cms["config"]["sitemap.mod.php"]["disabled"] ) ) { + return; + } + + $file = "{$cms['site_dir']}/sitemap.xml"; + if ( file_exists( $file ) ) unlink( $file ); +} + +function cms_sitemap_generate() { + global $cms; + if ( empty( $cms["base"] ) ) cms_base_connect(); + if ( empty( $cms["base"] ) ) return; + if ( mysqli_connect_error() ) return; + + if ( $cms["config"]["sitemap.mod.php"]["gen"] === "static" && ! empty( $cms["config"]["sitemap.mod.php"]["domain"] ) ) { + $domain = $cms["config"]["sitemap.mod.php"]["domain"]; + } else { + $domain = "{$cms['url']['scheme']}://{$cms['url']['host']}"; + } + + // Формат массива + // $cms["sitemap"]["https://site.com/link"] = array( + // "lastmod" => "2022-08-27T21:25:17+03:00" || "", + // "changefreq" => "weekly", + // "priority" => "0.8" + // ); + $cms["sitemap"] = array(); + + $exclude = explode( "\n", $cms["config"]["sitemap.mod.php"]["exclude"] ); + foreach( $exclude as $n => $link ) { + if ( empty( $link ) ) { + unset( $exclude[$n] ); + } + } + + $date = date( "Y-m-d H:i:s" ); + $q = "SELECT `title`, `url`, `created`, `modified`, `published` FROM `pages` WHERE `created`<='{$date}' ORDER BY `created` DESC"; + if ( $res = mysqli_query( $cms["base"], $q ) ) { + while ( $page = mysqli_fetch_assoc( $res ) ) { + if ( $page["published"] && ! in_array( $page["url"], $exclude ) ) { + if ( $modified = max( strtotime( $page["created"] ), (int) $page["modified"] ) ) { + $modified = date( "c", $modified ); + } else { + $modified = ""; + } + $link = $domain . $cms["base_path"] . $page["url"]; + if ( ! isset( $cms["sitemap"][$link] ) ) { + $cms["sitemap"][$link] = array( "lastmod" => $modified ); + } + } + } + } + + // Обязательные для включения ссылки + foreach( explode( "\n", $cms["config"]["sitemap.mod.php"]["include"] ) as $link ) { + $link = trim( $link ); + if ( ! empty( $link ) ) { + $cms["sitemap"][$link] = array( "lastmod" => "" ); + } + } + + do_hook( "sitemap" ); + + // Генерация файла + $content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n"; + foreach( $cms["sitemap"] as $url => $attr ) { + if ( empty( $attr["lastmod"] ) ) { + $lastmod = ""; + } else { + $lastmod = "<lastmod>{$attr['lastmod']}</lastmod>"; + } + if ( empty( $attr["changefreq"] ) ) { + $changefreq = ""; + } else { + $changefreq = "<changefreq>{$attr['changefreq']}</changefreq>"; + } + if ( empty( $attr["priority"] ) ) { + $priority = ""; + } else { + $priority = "<priority>{$attr['priority']}</priority>"; + } + $content .= "<url><loc>{$url}</loc>{$lastmod}{$changefreq}{$priority}</url>\n"; + } + $content .= "</urlset>"; + return $content; +} + + +function cms_sitemap_admin() { + global $cms; + + $conf = $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"]; + if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { + + // Save settings + if ( ! empty( $_POST["save_settings_sitemap"] ) ) { + $list = preg_split( "/\r\n|\n\r|\r|\n/u", $_POST["exclude"] ); + $base_url = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}"; + foreach ( $list as $key => $value ) { + // remove domain + $list[$key] = trim( str_replace( $base_url, "", $value ) ); + if ( substr( $list[$key], 0, 1 ) === "/" ) $list[$key] = substr( $list[$key], 1 ); + } + $list = implode( "\n", $list ); + $cms["config"]["sitemap.mod.php"]["gen"] = $_POST["gen"]; + $cms["config"]["sitemap.mod.php"]["exclude"] = $list; + $cms["config"]["sitemap.mod.php"]["include"] = $_POST["include"]; + $cms["config"]["sitemap.mod.php"]["domain"] = rtrim( $_POST["domain"], "/" ); + $cms["config"]["sitemap.mod.php"]["update_interval"] = trim( $_POST["update_interval"] ); + cms_save_config(); + if ( $cms["config"]["sitemap.mod.php"]["gen"] === "dynamic" ) { + unlink( "{$cms['site_dir']}/sitemap.xml" ); + } + cms_sitemap_update(); + header( "Location: {$cms['base_path']}{$cms['config']['admin.mod.php']['admin_url']}" ); + $cms["hooks"]["admin"]["next"] = ""; // Предотвратить выдачу админки + return; + } + + // Create menu item if not exists + if ( empty( $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"] ) ) { + $cms["config"]["sitemap.mod.php"]["menu"]["sitemap"] = array( + "title" => "sitemap_module_name", + "sort" => 60, + "section" => "settings", + ); + cms_save_config(); + } + + $ch["static"] = ""; + $ch["dynamic"] = ""; + $ch[ $cms["config"]["sitemap.mod.php"]["gen"] ] = "checked"; + + $sitemap = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}sitemap.xml"; + + $page = " +<div class=sitemap>" . __( "view_sitemap" ) . " <a href='{$sitemap}' target=_blank>{$sitemap}</a></div> + +<form method=post> + <div class=xml-wrapper-hidden> + <div>" . __( "excluded_links" ) . "</div> + <textarea name=exclude rows=12 autocomplete=off>{$cms['config']['sitemap.mod.php']['exclude']}</textarea> + <div class=save_2_col> + <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> + <div class=select-dropdown> + <div class=field-search> + <input class=search-field autocomplete=off placeholder='" . __( "placeholder" ) . "'> + </div> + <ul class=list-search> + + </ul> + </div> + </div> + </div> + <div class=xml-wrapper-link> + <div>" . __( "included_links" ) . "</div> + <textarea name=include rows=12 autocomplete=off>{$cms['config']['sitemap.mod.php']['include']}</textarea> + <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> + </div> + <div class=xml-static-dynamic> + <div>" . __( "sitemap_gen" ) . "</div> + <label><input name=gen type=radio value=dynamic {$ch['dynamic']}> " . __( "dynamic" ) . "</label> + <label><input name=gen type=radio value=static {$ch['static']}> " . __( "static" ) . "</label> + <div> </div> + <div>" . __( "domain" ) . "</div> + <input type=text name=domain value='{$cms['config']['sitemap.mod.php']['domain']}' placeholder='http://example.com'> + <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> + </div> + <div class=xml-static-cron> + <div>" . __( "update_freq" ) . "</div> + <p>" . __( "static_freq" ) . " <input type=text name=update_interval value={$cms['config']['sitemap.mod.php']['update_interval']}> " . __( "minutes" ) . "</p> + <p>" . __( "url_for_cron" ) . ": {$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}{$cms['config']['admin.mod.php']['cron_url']}</p> + <button name=save_settings_sitemap value=save>" . __( "save" ) . "</button> + </div> +</form> + +<div class=sitemap-manual> + <div>" . __( "help" ) . "</div> + <p>" . __( "help_p1" ) . "</p> + <p>" . __( "help_p2" ) . "</p> +</div> + "; + + $cms["admin_pages"]["sitemap"] = $page; + + } +}