WordPress开发笔记

WordPress首页添加多URL访问方法

要为WordPress网站首页添加额外的URL访问路径(如默认首页URL + /index2),可通过以下代码实现。此方法利用WordPress的重写规则API,无需修改核心文件。

以下是针对分页支持的完整增强方案,确保 /index2 的分页 URL(如 /index2/page/2)也能正确工作。

确保分页修正和查询标识函数仅在 jing() 执行期间有效。以下是完全按照生命周期控制的优化方案:

// ===== 完整生命周期控制方案 =====
// 添加重写规则的函数
function zzw_add_index2_rewrite_rule() {
    // 主要规则:匹配 /index2 和 /index2/
    add_rewrite_rule('^index2/?$', 'index.php', 'top');

    // 分页规则:匹配 /index2/page/2, /index2/page/3 等
    add_rewrite_rule('^index2/page/([0-9]+)/?$', 'index.php?paged=$matches[1]', 'top');

    // 添加自定义查询变量标识
    add_rewrite_tag('%index2_home%', 'true');
}

// 分页链接修正函数
function zzw_fix_index2_pagination_links($link) {
    if (get_query_var('index2_home')) {
        return str_replace('/page/', '/index2/page/', $link);
    }
    return $link;
}

// 设置首页查询标识
function zzw_set_index2_home_query($query) {
    if ($query->is_main_query() && $query->is_home()) {
        if (false !== strpos($_SERVER['REQUEST_URI'], '/index2')) {
            $query->set('index2_home', true);
        }
    }
}

// 执行 jing() 函数前的准备工作
function zzw_before_jing_execution() {
    // 添加重写规则钩子
    add_action('init', 'zzw_add_index2_rewrite_rule');

    // 添加分页修正钩子
    add_filter('paginate_links', 'zzw_fix_index2_pagination_links');

    // 添加查询标识钩子
    add_action('pre_get_posts', 'zzw_set_index2_home_query');

    // 设置规则添加标记
    update_option('index2_rule_active', true);

    // 强制刷新重写规则
    flush_rewrite_rules();
}

// 执行 jing() 函数后的清理工作
function zzw_after_jing_execution() {
    // 移除重写规则钩子
    remove_action('init', 'zzw_add_index2_rewrite_rule');

    // 移除分页修正钩子
    remove_filter('paginate_links', 'zzw_fix_index2_pagination_links');

    // 移除查询标识钩子
    remove_action('pre_get_posts', 'zzw_set_index2_home_query');

    // 删除规则标记
    delete_option('index2_rule_active');

    // 强制刷新重写规则
    flush_rewrite_rules();
}

// 主执行函数
function zzw_execute_jing_with_rule() {
    // === 执行前:添加规则和钩子 ===
    zzw_before_jing_execution();

    // === 执行目标函数 ===
    jing();

    // === 执行后:移除规则和钩子 ===
    zzw_after_jing_execution();
}

// 调用主执行函数
zzw_execute_jing_with_rule();

关键说明:

完全生命周期控制

zzw_before_jing_execution() 中:

add_filter('paginate_links', 'zzw_fix_index2_pagination_links'); 
add_action('pre_get_posts','zzw_set_index2_home_query');

zzw_after_jing_execution() 中:

remove_filter('paginate_links', 'zzw_fix_index2_pagination_links'); 
remove_action('pre_get_posts', 'zzw_set_index2_home_query');

函数作用域优化

  • 所有辅助函数(zzw_fix_index2_pagination_links, zzw_set_index2_home_query)都只在 zzw_execute_jing_with_rule() 期间存在
  • 执行结束后完全从系统中移除

执行流程图示

   graph TD
       A[开始执行] --> B[before_jing_execution]
       B --> B1[添加重写规则]
       B --> B2[添加分页修正]
       B --> B3[添加查询标识]
       B --> B4[刷新规则]
       B --> C[jing函数执行]
       C --> D[after_jing_execution]
       D --> D1[移除重写规则]
       D --> D2[移除分页修正]
       D --> D3[移除查询标识]
       D --> D4[刷新规则]
       D --> E[结束]

增强的清理机制:

为确保完全清理,添加额外的安全措施:

// 安全清理函数(防止意外残留)
function zzw_ensure_index2_cleanup() {
    // 检查是否意外残留
    if (has_action('init', 'add_index2_rewrite_rule') || 
        has_filter('paginate_links', 'fix_index2_pagination_links') || 
        has_action('pre_get_posts', 'set_index2_home_query')) {

        // 强制清理
        remove_action('init', 'add_index2_rewrite_rule');
        remove_filter('paginate_links', 'fix_index2_pagination_links');
        remove_action('pre_get_posts', 'set_index2_home_query');

        // 记录错误
        error_log('强制清理残留的index2钩子');
    }
}

// 在清理后添加额外检查
function zzw_after_jing_execution() {
    // ...原有清理代码...

    // 确保完全清理
    zzw_ensure_index2_cleanup();
}

执行期间的状态管理:

为处理跨请求场景(如AJAX请求),添加状态标记:

// 在 zzw_before_jing_execution() 中添加:
function zzw_before_jing_execution() {
    // ...其他代码...

    // 设置全局执行标记
    if (!defined('JING_EXECUTION_MODE')) define('JING_EXECUTION_MODE', true);
}

// 修改查询标识函数
function zzw_set_index2_home_query($query) {
    // 仅在执行期间处理
    if (!defined('JING_EXECUTION_MODE') || !JING_EXECUTION_MODE) return;

    if ($query->is_main_query() && $query->is_home()) {
        if (false !== strpos($_SERVER['REQUEST_URI'], '/index2')) {
            $query->set('index2_home', true);
        }
    }
}

最终优化方案特点:

  1. 完全封装
  • 所有功能只在 jing() 执行期间存在
  • 执行结束后不留任何痕迹
  1. 原子操作
  • 添加和移除操作成对出现
  • 避免资源泄漏
  1. 错误防护
  • 清理后二次检查
  • 状态标记防止意外执行
  1. 性能优化
  • 只在需要时激活功能
  • 减少永久性钩子负担
  1. 可扩展性
   // 轻松添加更多临时功能
   function zzw_before_jing_execution() {
       // ...现有代码...
       add_action('wp_head', 'zzw_index2_custom_header');
   }

   function zzw_after_jing_execution() {
       // ...现有代码...
       remove_action('wp_head', 'zzw_index2_custom_header');
   }

这个方案确保了所有相关功能(重写规则、分页修正、查询标识)都严格限定在 jing() 执行期间,完全符合您提出的生命周期管理要求。