WordPress REST API中register_rest_field未调用回调函数问题排查
以下是几个常见的排查方向,按优先级尝试:
确认自定义文章类型的REST支持是否正常
检查comp-tourseite这个自定义文章类型的注册代码,确保show_in_rest参数设置为true。如果该参数被改为false,或者其他插件/主题覆盖了这个设置,REST API不会返回该类型的内容,回调自然不会触发。检查权限回调是否缺失
WordPress 5.5+版本对REST权限检查更严格,如果register_rest_field没有设置permission_callback,可能会被默认权限规则拦截。可以临时添加'permission_callback' => '__return_true'到字段配置数组中测试,确认是否是权限问题(正式环境请替换为符合需求的权限判断函数)。验证字段是否被覆盖
尝试临时修改字段名(比如把parentpagename改成custom_parentpagename),如果修改后回调能触发,说明原字段名被其他插件或主题的代码覆盖了。调整钩子执行优先级
如果你的create_api_posts_meta_field函数在自定义文章类型注册之前就执行了,register_rest_field会找不到对应的文章类型。可以给add_action增加更高的优先级:add_action('rest_api_init', 'create_api_posts_meta_field', 20);(默认优先级是10,数字越大执行越晚,确保在自定义文章类型注册之后运行)
检查回调函数的签名
确认get_parent_page_for_api的函数签名符合WordPress要求,它需要接收三个参数:function get_parent_page_for_api( $value, $object, $field_name ) { // 你的业务代码 }如果函数签名不符合(比如只定义了一个参数),WordPress更新后可能无法正确调用该回调。
排查缓存问题
清除WordPress的页面缓存、插件缓存(比如Redis、WP Rocket等),以及CDN缓存。缓存可能会保留旧的REST响应结构,导致新的字段定义不生效。
辅助测试步骤
先确认create_api_posts_meta_field函数是否被执行:
function create_api_posts_meta_field() { error_log('REST字段注册函数已执行'); // 查看服务器日志是否有这条记录 register_rest_field( 'comp-tourseite', 'parentpagename', array( 'get_callback' => 'get_parent_page_for_api', 'schema' => null, 'permission_callback' => '__return_true', ) ); }
如果日志中没有这条记录,说明你的代码没有被正确加载(比如文件路径错误、函数被重命名或删除);如果日志存在,再按上面的步骤逐一排查。
内容的提问来源于stack exchange,提问作者Fewture

