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

为何WordPress内置函数get_page_by_title()在插件中未定义?

问题描述

在WordPress 6.1.1多站点环境中,一款自定义插件负责新增站点时创建默认文章/页面,调用get_page_by_title()函数时触发PHP致命错误:

PHP Fatal error: Uncaught Error: Call to undefined function get_page_by_title()

涉事代码如下:

function addPostOverview() {
    $title = 'Project Overview';
    $page = get_page_by_title($title, null, 'post');

    if (!empty($page)) {
        return;
    }

$post = array(
        'post_content' => 'Overview Example. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mauris lorem, tempor a erat a, vehicula ultricies diam. Suspendisse in leo aliquet, ornare sapien vitae, commodo mi. Nullam ornare, mi et volutpat accumsan, enim tellus aliquam quam, vitae molestie sapien magna quis est. Praesent et magna efficitur, ornare nunc eget, commodo nunc. Donec et erat ac urna pharetra luctus et sed mauris.', // The full text of the post.
        'post_name' => 'project-overview', // The name (slug) for your post
        'post_title' => $title, // The title of your post.
        'post_status' => 'publish', //[ 'draft' | 'publish' | 'pending'| 'future' | 'private' | custom registered status ] // Default 'draft'.
        'post_type' => 'post', // [ 'post' | 'page' | 'link' | 'nav_menu_item' | custom post type ] // Default 'post'.
        'comment_status' => 'closed', // Default is the option 'default_comment_status', or 'closed'.
        'post_category' => array(get_cat_ID('Project Page'))  // Default empty.
    );

    $postID = wp_insert_post($post, $wp_error);
}
addPostOverview();

当前环境:WordPress 6.1.1,PHP 8.1,多站点部署。

问题分析与解决方案

导致WordPress内置函数未定义的常见场景

  • 函数调用时机过早:WordPress有固定加载流程,多数核心函数需在特定钩子(如plugins_loaded)后才会被加载。若在全局作用域直接调用函数,此时核心文件尚未引入,就会触发未定义错误。
  • 多站点上下文未初始化:多站点环境中,站点切换逻辑未完成时调用函数,或插件未通过网络激活正确初始化,会导致当前站点的核心函数无法被访问。
  • 核心文件损坏/缺失:WordPress核心文件被篡改、缺失,导致包含目标函数的文件(如get_page_by_title()所在的wp-includes/post.php)未被正确加载。
  • 函数已被废弃(少见):部分旧函数在新版本中被移除,但get_page_by_title()在WP 6.1.1中仍属可用函数,此场景可排除。
  • PHP版本兼容问题:PHP 8.1与WP 6.1.1兼容,但参数错误或语法问题不会直接导致函数未定义,更多是触发运行时错误。

针对当前案例的修复方案

你的代码直接在插件全局作用域调用addPostOverview(),属于调用时机过早的典型问题——此时WordPress核心函数还未加载完成。结合多站点新增站点的场景,应将函数绑定到wpmu_new_blog钩子,该钩子会在新站点创建完成后触发,确保所有核心函数已加载,同时自动传入新站点ID,方便切换上下文。

修改后的代码示例:

function addPostOverview($blog_id) {
    // 切换到新创建的站点上下文
    switch_to_blog($blog_id);

    $title = 'Project Overview';
    $page = get_page_by_title($title, null, 'post');

    if (!empty($page)) {
        restore_current_blog();
        return;
    }

    $post = array(
        'post_content' => 'Overview Example. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mauris lorem, tempor a erat a, vehicula ultricies diam. Suspendisse in leo aliquet, ornare sapien vitae, commodo mi. Nullam ornare, mi et volutpat accumsan, enim tellus aliquam quam, vitae molestie sapien magna quis est. Praesent et magna efficitur, ornare nunc eget, commodo nunc. Donec et erat ac urna pharetra luctus et sed mauris.',
        'post_name' => 'project-overview',
        'post_title' => $title,
        'post_status' => 'publish',
        'post_type' => 'post',
        'comment_status' => 'closed',
        'post_category' => array(get_cat_ID('Project Page'))
    );

    // 第二个参数设为true,返回WP_Error对象便于排查错误
    $postID = wp_insert_post($post, true);

    // 切回原站点上下文
    restore_current_blog();
}
// 绑定到多站点新增站点的钩子
add_action('wpmu_new_blog', 'addPostOverview');

额外注意事项:

  • 必须使用switch_to_blog()和restore_current_blog()包裹操作,确保在新站点的独立上下文中执行,避免影响主站点或其他站点。
  • wp_insert_post()第二个参数设为true,可在创建失败时返回错误对象,方便定位问题(如分类不存在、内容非法等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:31:08