You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

着陆页插件报错:Call to a member function wp_rewrite_rules() on null

排查与修复PHP致命错误:Call to a member function wp_rewrite_rules() on null

先直接拆解错误根源:你看到的致命错误,本质是调用url_to_postid()时,WordPress的重写规则系统还没初始化。url_to_postid()依赖全局变量$wp_rewrite,而这个变量在plugins_loaded钩子触发时还未完成实例化,导致调用它的方法时出现null错误。

结合你的代码逻辑,给你具体的排查和修复建议:

1. 调整代码加载的钩子时机

你当前用plugins_loaded加载这些函数,这个钩子触发得太早——WordPress的重写规则要等到init钩子之后才会完全初始化。把代码移到更晚的钩子即可解决核心问题:

// 替换原来的plugins_loaded钩子,改用init钩子
add_action( 'init', function() {
    // 在这里定义你的lsx_landing_page_style_check和lsx_check_landing_page函数
}, 10 );

如果你的逻辑是针对定制器的,也可以用customize_init钩子,它会在定制器初始化时触发,此时WordPress核心组件(包括重写规则)已经准备完毕。

2. 给url_to_postid()加前置检查

如果必须保留当前钩子时机,可以在调用url_to_postid()前,先确认$wp_rewrite是否可用:

function lsx_check_landing_page(){
    // ... 你的其他代码 ...

    if( false !== strpos( $url, '/go/' ) ){
        // 先检查重写系统是否就绪
        global $wp_rewrite;
        if ( isset( $wp_rewrite ) && is_object( $wp_rewrite ) ) {
            $landing_page = url_to_postid( $url );
            if( !empty( $landing_page ) ){
                return $landing_page;
            }
            return true;
        } else {
            // 重写未就绪时,直接返回false避免报错
            return false;
        }
    }
    return false;
}

3. 调试URL处理逻辑

有时候定制器或后台请求中,$_SERVER['REQUEST_URI']或wp_get_referer()可能返回异常值,导致url_to_postid()无法解析。可以临时加日志调试:

function lsx_check_landing_page(){
    $url = $_SERVER['REQUEST_URI'];
    // 输出当前URL到错误日志,方便排查
    error_log( '[Landing Page Check] Current URL: ' . $url );

    // ... 你的其他代码 ...
}

查看服务器错误日志,确认$url是否是预期的前端着陆页URL,避免传递后台定制器的URL给url_to_postid()。

4. 替代方案:不依赖重写规则的查询

如果需要在更早时机判断URL对应着陆页,可以直接用数据库查询替代url_to_postid(),比如假设你的着陆页是自定义文章类型:

function lsx_check_landing_page(){
    // ... 你的其他代码 ...

    if( false !== strpos( $url, '/go/' ) ){
        $path = trim( parse_url( $url, PHP_URL_PATH ), '/' );
        $path_parts = explode( '/', $path );
        
        // 提取/go/后的部分作为文章别名查询
        if ( isset( $path_parts[1] ) && $path_parts[0] === 'go' ) {
            $query = new WP_Query( array(
                'post_type' => 'landing-page', // 替换为你的着陆页文章类型
                'post_name' => $path_parts[1],
                'posts_per_page' => 1,
                'fields' => 'ids'
            ) );
            
            if ( $query->have_posts() ) {
                return $query->posts[0];
            }
            return true;
        }
    }
    return false;
}

这种方式绕过重写规则,适合在较早的钩子中执行。

内容的提问来源于stack exchange,提问作者viscosho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:18:05