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

为何Elementor Pro自定义函数部分场景正常部分报TypeError

问题根因

报错的核心原因是get_post_fields()回调函数存在返回null的分支,和你打印出来的数组结构无关:Elementor在控件注册初始化阶段就会调用该方法获取select下拉选项,此时还未加载用户保存的控件配置,$selected_post_type为空,触发了你代码里无返回值的return;逻辑,返回的null被传入sanitize_settings()方法,触发类型错误。你做var_dump验证时是在配置已加载、选中了对应post type的场景下测试,所以能拿到正常结构的数组,没覆盖到初始化阶段的空返回分支。

原有代码还存在三个额外隐患:

  • 循环查询全量文章收集自定义字段,会产生重复字段值,同时带来不必要的数据库性能开销
  • 动态字段名传入esc_html__()翻译函数无实际作用,翻译函数仅对代码中定义的静态字符串生效
  • 单WP_Query场景下用wp_reset_query()会全局覆盖主查询状态,容易引发其他内容渲染异常
修复代码

调整后所有分支均保证返回数组类型,同时优化查询性能、避免全局状态污染:

/**
 * Get a list of the custom field names from the selected post type
 */
protected function get_post_fields(){
    // 先初始化默认选项数组,保证任何分支返回值都是数组类型
    $field_names = [
        '' => esc_html__( 'Select a field', 'OWSM-table-widget' ),
    ];

    // 读取配置时增加空值兜底,避免读取不存在的数组键报错
    $my_settings = $this->get_settings_for_display();
    $selected_post_type = !empty($my_settings['data_source']) ? $my_settings['data_source'] : '';

    // 未选中post type时直接返回默认选项数组,禁止空return
    if (empty($selected_post_type)) {
        return $field_names;
    }

    // 优化查询:仅需查询1篇已发布文章即可获取该post type的自定义字段,关闭分页计数提升性能
    $wanted_posts = new WP_Query([
        'post_type' => $selected_post_type,
        'posts_per_page' => 1,
        'post_status' => 'publish',
        'no_found_rows' => true,
    ]);

    if($wanted_posts->have_posts()) {
        $wanted_posts->the_post();
        $getPostCustom = get_post_custom();
        foreach($getPostCustom as $name => $value) {
            // 跳过下划线开头的隐藏字段,同时做键名去重避免重复选项
            if (strpos($name, "_") !== 0 && !isset($field_names[$name])){
                $field_names[$name] = esc_html($name);
            }
        }
        // 仅重置当前查询的post数据,不影响全局主查询
        wp_reset_postdata();
    }

    return $field_names;
}
开发注意事项
  • 所有提供给Elementor控件的选项回调函数,必须强制保证返回值为数组类型,任何条件判断分支都不能出现无返回值、返回null/非数组值的情况,哪怕没有可选项也要返回空数组。
  • 不要在控件选项回调中执行全量内容查询,这类回调会在编辑器加载、设置变更时多次触发,重查询会明显拖慢编辑器响应速度。
  • 翻译函数__()、esc_html__()仅适用于代码里写死的静态字符串,动态生成的内容直接用转义函数(如esc_html())做安全处理即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:48:35