安装和使用方法

1. 安装插件

  1. 将上面的代码保存为 zibll-sitemap-generator.php

  2. 上传到 /wp-content/plugins/ 目录

  3. 在WordPress后台启用插件

2. 使用方法

  • 自动生成:插件激活后会自动生成sitemap.xml

  • 手动生成:在 设置 > 子比Sitemap 中手动生成

  • 访问sitemap:访问 yoursite.com/sitemap.xml

  • 使用短代码:在文章中使用 [zibll_sitemap] 显示网站地图

3. 功能特点

  • ✅ 自动包含文章、页面、分类、标签

  • ✅ 支持优先级和更新频率设置

  • ✅ 内容更新时自动重新生成

  • ✅ 后台管理界面

  • ✅ 短代码支持

  • ✅ SEO友好

这个插件专为子比主题优化,不会与主题功能冲突,且性能高效。

[hidecontent type=”reply” desc=”隐藏内容:评论后查看”]

<?php
/**
 * Plugin Name: 子比Sitemap网站地图生成器
 * Plugin URI: https://blog.wmr7.com/
 * Description: 专为子比主题设计的自动Sitemap网站地图生成插件,助力站长网站收录
 * Version: 1.0.0
 * Author: 白川
 * License: GPL v2 or later
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

class ZibllSitemapGenerator {
    
    public function __construct() {
        add_action('init', array($this, 'init'));
        add_action('save_post', array($this, 'generate_sitemap_on_update'));
        add_action('created_category', array($this, 'generate_sitemap_on_taxonomy_update'));
        add_action('delete_post', array($this, 'generate_sitemap_on_update'));
    }
    
    public function init() {
        add_action('wp_ajax_generate_sitemap', array($this, 'ajax_generate_sitemap'));
        add_action('wp_ajax_nopriv_generate_sitemap', array($this, 'ajax_generate_sitemap'));
        
        // 注册短代码
        add_shortcode('zibll_sitemap', array($this, 'sitemap_shortcode'));
        
        // 添加管理菜单
        add_action('admin_menu', array($this, 'add_admin_menu'));
        
        // 监听sitemap访问
        add_action('template_redirect', array($this, 'handle_sitemap_request'));
    }
    
    /**
     * 添加管理菜单
     */
    public function add_admin_menu() {
        add_options_page(
            '子比Sitemap设置',
            '子比Sitemap',
            'manage_options',
            'zibll-sitemap',
            array($this, 'admin_page')
        );
    }
    
    /**
     * 管理页面
     */
    public function admin_page() {
        if (isset($_POST['generate_sitemap'])) {
            $this->generate_sitemap();
            echo '<div class="notice notice-success"><p>Sitemap生成成功!</p></div>';
        }
        
        $sitemap_url = home_url('/sitemap.xml');
        ?>
        <div class="wrap">
            <h1>子比主题Sitemap生成器</h1>
            
            <div class="card">
                <h2>生成Sitemap</h2>
                <p>点击下方按钮手动生成sitemap.xml文件:</p>
                <form method="post">
                    <?php wp_nonce_field('generate_sitemap_action', 'generate_sitemap_nonce'); ?>
                    <input type="submit" name="generate_sitemap" class="button button-primary" value="生成Sitemap">
                </form>
            </div>
            
            <div class="card">
                <h2>Sitemap地址</h2>
                <p>您的sitemap地址:<a href="<?php echo $sitemap_url; ?>" target="_blank"><?php echo $sitemap_url; ?></a></p>
                <p>将此地址提交到Google Search Console和Bing Webmaster Tools。</p>
            </div>
            
            <div class="card">
                <h2>包含内容</h2>
                <ul>
                    <li>文章 (post)</li>
                    <li>页面 (page)</li>
                    <li>分类目录</li>
                    <li>标签</li>
                    <li>自定义文章类型(如果有)</li>
                </ul>
            </div>
            
            <div class="card">
                <h2>短代码使用</h2>
                <p>在文章或页面中使用以下短代码显示网站地图:</p>
                <code>[zibll_sitemap]</code>
            </div>
        </div>
        
        <style>
        .card {
            background: #fff;
            border: 1px solid #ccd0d4;
            margin: 20px 0;
            padding: 20px;
            border-radius: 4px;
        }
        .card h2 {
            margin-top: 0;
        }
        </style>
        <?php
    }
    
    /**
     * 处理sitemap.xml访问
     */
    public function handle_sitemap_request() {
        if (isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] === '/sitemap.xml') {
            $this->output_sitemap();
            exit;
        }
    }
    
    /**
     * 生成sitemap内容
     */
    public function generate_sitemap() {
        $sitemap_content = $this->build_sitemap_content();
        $upload_dir = wp_upload_dir();
        $sitemap_file = $upload_dir['basedir'] . '/sitemap.xml';
        
        file_put_contents($sitemap_file, $sitemap_content);
        
        // 更新选项记录生成时间
        update_option('zibll_sitemap_last_updated', current_time('timestamp'));
    }
    
    /**
     * 构建sitemap内容
     */
    private function build_sitemap_content() {
        $bloginfo = get_bloginfo('name');
        $home_url = home_url();
        
        $sitemap = '<?xml version="1.0" encoding="UTF-8"?>';
        $sitemap .= '<?xml-stylesheet type="text/xsl" href="' . $home_url . '/sitemap-style.xsl"?>';
        $sitemap .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
        
        // 首页
        $sitemap .= $this->build_url_item($home_url . '/', '1.0', 'daily');
        
        // 文章
        $posts = get_posts(array(
            'post_type' => 'post',
            'post_status' => 'publish',
            'numberposts' => -1
        ));
        
        foreach ($posts as $post) {
            $url = get_permalink($post->ID);
            $modified = get_the_modified_time('Y-m-d\TH:i:s+00:00', $post->ID);
            $sitemap .= $this->build_url_item($url, '0.8', 'weekly', $modified);
        }
        
        // 页面
        $pages = get_pages();
        foreach ($pages as $page) {
            $url = get_permalink($page->ID);
            $modified = get_the_modified_time('Y-m-d\TH:i:s+00:00', $page->ID);
            $sitemap .= $this->build_url_item($url, '0.7', 'monthly', $modified);
        }
        
        // 分类目录
        $categories = get_categories();
        foreach ($categories as $category) {
            $url = get_category_link($category->term_id);
            $sitemap .= $this->build_url_item($url, '0.6', 'weekly');
        }
        
        // 标签
        $tags = get_tags();
        foreach ($tags as $tag) {
            $url = get_tag_link($tag->term_id);
            $sitemap .= $this->build_url_item($url, '0.5', 'weekly');
        }
        
        $sitemap .= '</urlset>';
        
        return $sitemap;
    }
    
    /**
     * 构建URL项
     */
    private function build_url_item($url, $priority, $changefreq, $lastmod = '') {
        if (empty($lastmod)) {
            $lastmod = date('Y-m-d\TH:i:s+00:00');
        }
        
        $item = "  <url>\n";
        $item .= "    <loc>" . esc_url($url) . "</loc>\n";
        $item .= "    <lastmod>" . $lastmod . "</lastmod>\n";
        $item .= "    <changefreq>" . $changefreq . "</changefreq>\n";
        $item .= "    <priority>" . $priority . "</priority>\n";
        $item .= "  </url>\n";
        
        return $item;
    }
    
    /**
     * 输出sitemap
     */
    public function output_sitemap() {
        $upload_dir = wp_upload_dir();
        $sitemap_file = $upload_dir['basedir'] . '/sitemap.xml';
        
        // 如果文件不存在或超过7天,重新生成
        if (!file_exists($sitemap_file) || 
            (time() - filemtime($sitemap_file)) > 604800) {
            $this->generate_sitemap();
        }
        
        if (file_exists($sitemap_file)) {
            header('Content-Type: application/xml; charset=utf-8');
            readfile($sitemap_file);
        } else {
            // 实时生成
            $sitemap_content = $this->build_sitemap_content();
            header('Content-Type: application/xml; charset=utf-8');
            echo $sitemap_content;
        }
        exit;
    }
    
    /**
     * 文章更新时重新生成sitemap
     */
    public function generate_sitemap_on_update($post_id) {
        // 避免无限循环
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
        if (wp_is_post_revision($post_id)) return;
        
        // 延迟执行,避免影响保存性能
        wp_schedule_single_event(time() + 60, 'generate_delayed_sitemap');
    }
    
    /**
     * 分类更新时重新生成sitemap
     */
    public function generate_sitemap_on_taxonomy_update($term_id) {
        wp_schedule_single_event(time() + 60, 'generate_delayed_sitemap');
    }
    
    /**
     * 短代码显示sitemap
     */
    public function sitemap_shortcode($atts) {
        $atts = shortcode_atts(array(
            'type' => 'all' // all, posts, pages, categories
        ), $atts);
        
        ob_start();
        echo '<div class="zibll-sitemap">';
        
        if ($atts['type'] === 'all' || $atts['type'] === 'posts') {
            echo '<h3>文章</h3><ul>';
            $posts = get_posts(array('numberposts' => -1));
            foreach ($posts as $post) {
                echo '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></li>';
            }
            echo '</ul>';
        }
        
        if ($atts['type'] === 'all' || $atts['type'] === 'pages') {
            echo '<h3>页面</h3><ul>';
            $pages = get_pages();
            foreach ($pages as $page) {
                echo '<li><a href="' . get_permalink($page->ID) . '">' . get_the_title($page->ID) . '</a></li>';
            }
            echo '</ul>';
        }
        
        if ($atts['type'] === 'all' || $atts['type'] === 'categories') {
            echo '<h3>分类目录</h3><ul>';
            $categories = get_categories();
            foreach ($categories as $category) {
                echo '<li><a href="' . get_category_link($category->term_id) . '">' . $category->name . '</a></li>';
            }
            echo '</ul>';
        }
        
        echo '</div>';
        return ob_get_clean();
    }
    
    /**
     * AJAX生成sitemap
     */
    public function ajax_generate_sitemap() {
        if (!current_user_can('manage_options')) {
            wp_die('权限不足');
        }
        
        $this->generate_sitemap();
        wp_send_json_success('Sitemap生成成功');
    }
}

// 初始化插件
new ZibllSitemapGenerator();

// 注册激活钩子
register_activation_hook(__FILE__, 'zibll_sitemap_activate');
function zibll_sitemap_activate() {
    $plugin = new ZibllSitemapGenerator();
    $plugin->generate_sitemap();
}

// 注册停用钩子
register_deactivation_hook(__FILE__, 'zibll_sitemap_deactivate');
function zibll_sitemap_deactivate() {
    $upload_dir = wp_upload_dir();
    $sitemap_file = $upload_dir['basedir'] . '/sitemap.xml';
    if (file_exists($sitemap_file)) {
        unlink($sitemap_file);
    }
}

 

[/hidecontent]

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。