
安装和使用方法
1. 安装插件
-
将上面的代码保存为
zibll-sitemap-generator.php -
上传到
/wp-content/plugins/目录 -
在WordPress后台启用插件
2. 使用方法
-
自动生成:插件激活后会自动生成sitemap.xml
-
手动生成:在 设置 > 子比Sitemap 中手动生成
-
访问sitemap:访问
yoursite.com/sitemap.xml -
使用短代码:在文章中使用
[zibll_sitemap]显示网站地图
3. 功能特点
-
✅ 自动包含文章、页面、分类、标签
-
✅ 支持优先级和更新频率设置
-
✅ 内容更新时自动重新生成
-
✅ 后台管理界面
-
✅ 短代码支持
-
✅ SEO友好
这个插件专为子比主题优化,不会与主题功能冲突,且性能高效。
<?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);
}
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(1)
学习下怎么用