PHP生成sitemap.xml地图函数

前端技术 2023/09/08 PHP

复制代码 代码如下:

<?php

/**
 *    网站地图更新控制器
 *
 *    @author    Garbin
 *    @usage    none
 */
class SitemapApp extends FrontendApp
{
    function __construct()
    {
        $this->SitemapApp();
    }
    function SitemapApp()
    {
        parent::__construct();
        $this->_google_sitemmap_file = ROOT_PATH . \'/data/google_sitemmap.xml\';
    }

    function index()
    {
        if (!Conf::get(\'sitemap_enabled\'))
        {
            return;
        }
        $from = empty($_GET[\'from\']) ? \'google\' : trim($_GET[\'from\']);
        switch ($from)
        {
            case \'google\':
                $this->_output_google_sitemap();
            break;
        }
    }

    /**
     *    输出Google sitemap
     *
     *    @author    Garbin
     *    @return    void
     */
    function _output_google_sitemap()
    {
        header(\"Content-type: application/xml\");
        echo $this->_get_google_sitemap();
    }

    /**
     *    获取Google sitemap
     *
     *    @author    Garbin
     *    @return    string
     */
    function _get_google_sitemap()
    {
        $sitemap = \"\";
        if ($this->_google_sitemap_expired())
        {
            /* 已过期,重新生成 */

            /* 获取有更新的项目 */
            $updated_items = $this->_get_updated_items($this->_get_google_sitemap_lastupdate());

            /* 重建sitemap */
            $sitemap = $this->_build_google_sitemap($updated_items);

            /* 写入文件 */
            $this->_write_google_sitemap($sitemap);
        }
        else
        {
            /* 直接返回旧的sitemap */
            $sitemap = file_get_contents($this->_google_sitemmap_file);
        }

        return $sitemap;
    }

    /**
     *    判断Google sitemap是否过期
     *
     *    @author    Garbin
     *    @return    boolean
     */
    function _google_sitemap_expired()
    {
        if (!is_file($this->_google_sitemmap_file))
        {
            return true;
        }
        $frequency = Conf::get(\'sitemap_frequency\') * 3600;
        $filemtime = $this->_get_google_sitemap_lastupdate();

        return (time() >= $filemtime + $frequency);
    }

    /**
     *    获取上次更新日期
     *
     *    @author    Garbin
     *    @return    int
     */
    function _get_google_sitemap_lastupdate()
    {
        return is_file($this->_google_sitemmap_file) ? filemtime($this->_google_sitemmap_file) : 0;
    }

    /**
     *    获取已更新的项目
     *
     *    @author    Garbin
     *    @return    array
     */
    function _get_updated_items($timeline = 0)
    {
        $timeline && $timeline -= date(\'Z\');
        $limit = 5000;
        $result = array();
        /* 更新的店铺 */
        $model_store =& m(\'store\');
        $updated_store = $model_store->find(array(
            \'fields\'    => \'store_id, add_time\',
            \'conditions\' => \"add_time >= {$timeline} AND state=\" . STORE_OPEN,
            \'limit\'     => \"0, {$limit}\",
        ));

        if (!empty($updated_store))
        {
            foreach ($updated_store as $_store_id => $_v)
            {
                $result[] = array(
                    \'url\'       => SITE_URL . \'/index.php?app=store&id=\' . $_store_id,
                    \'lastmod\'   => date(\"Y-m-d\", $_v[\'add_time\']),
                    \'changefreq\'=> \'daily\',
                    \'priority\'  => \'1\',
                );
            }
        }
        /* 更新的文章 */
        $model_article =& m(\'article\');
        $updated_article = $model_article->find(array(
            \'fields\'    => \'article_id, add_time\',
            \'conditions\'=> \"add_time >= {$timeline} AND if_show=1\",
            \'limit\'     => \"0, {$limit}\",
        ));
        if (!empty($updated_article))
        {
            foreach ($updated_article as $_article_id => $_v)
            {
                $result[] = array(
                    \'url\'       => SITE_URL . \'/index.php?app=article&act=view&article_id=\' . $_article_id,
                    \'lastmod\'   => date(\"Y-m-d\", $_v[\'add_time\']),
                    \'changefreq\'=> \'daily\',
                    \'priority\'  => \'0.8\',
                );
            }
        }

        /* 更新的商品 */
        $model_goods =& m(\'goods\');
        $updated_goods = $model_goods->find(array(
            \'fields\'        => \'goods_id, last_update\',
            \'conditions\'    => \"last_update >= {$timeline} AND if_show=1 AND closed=0\",
            \'limit\'         => \"0, {$limit}\",
        ));
        if (!empty($updated_goods))
        {
            foreach ($updated_goods as $_goods_id => $_v)
            {
                $result[] = array(
                    \'url\'       => SITE_URL . \'/index.php?app=goods&id=\' . $_goods_id,
                    \'lastmod\'   => date(\"Y-m-d\", $_v[\'last_update\']),
                    \'changefreq\'=> \'daily\',
                    \'priority\'  => \'0.8\',
                );
            }
        }

        return $result;
    }

    /**
     *    生成Google sitemap
     *
     *    @author    Garbin
     *    @param     array $items
     *    @return    string
     */
    function _build_google_sitemap($items)
    {
        $sitemap = \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\r\\n<urlset xmlns=\\\"http://www.sitemaps.org/schemas/sitemap/0.9\\\">\\r\\n\";
        $sitemap .= \"    <url>\\r\\n        <loc>\" . htmlentities(SITE_URL, ENT_QUOTES) . \"</loc>\\r\\n        <lastmod>\" . date(\'Y-m-d\', gmtime()) . \"</lastmod>\\r\\n        <changefreq>always</changefreq>\\r\\n        <priority>1</priority>\\r\\n    </url>\";
        if (!empty($items))
        {
            foreach ($items as $item)
            {
                $sitemap .= \"\\r\\n    <url>\\r\\n        <loc>\" . htmlentities($item[\'url\'], ENT_QUOTES) . \"</loc>\\r\\n        <lastmod>{$item[\'lastmod\']}</lastmod>\\r\\n        <changefreq>{$item[\'changefreq\']}</changefreq>\\r\\n        <priority>{$item[\'priority\']}</priority>\\r\\n    </url>\";
            }
        }
        $sitemap .= \"\\r\\n</urlset>\";

        return $sitemap;
    }

    /**
     *    写入Google sitemap文件
     *
     *    @author    Garbin
     *    @param     string $sitemap
     *    @return    void
     */
    function _write_google_sitemap($sitemap)
    {
        file_put_contents($this->_google_sitemmap_file, $sitemap);
    }
}

?>

本文地址:https://www.stayed.cn/item/22283

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。