WordPress调用add_action时出现call_user_func_array回调未找到错误怎么办
错误根因
你定义的wp_api_savee_prices_metabox、wp_api_price_metabox_handler两个回调函数都嵌套在wp_api_add_price_metabox函数内部,属于局部作用域函数。全局挂载save_post钩子时,外层的wp_api_add_price_metabox还未执行,内部函数尚未被创建,因此WordPress无法找到对应的回调函数触发报错。
修复方案
将所有回调函数移至全局作用域定义即可解决问题,同时补充WordPress元数据保存所需的安全校验逻辑,避免非法提交、CSRF攻击等问题,修复后完整代码如下:
<?php // 注册元框 function wp_api_add_price_metabox($post_type, $post) { add_meta_box( 'wpapimetabox', 'قیمت مطلب', 'wp_api_price_metabox_handler', 'post', 'normal', 'default' ); } // 元框渲染回调 function wp_api_price_metabox_handler($post) { // 输出nonce字段做安全校验 wp_nonce_field('wp_api_save_price_action', 'wp_api_price_nonce'); // 取出已保存的值回填 $saved_price = get_post_meta($post->ID, 'wp_api_prices', true); ?> <label for="txt1">قیمت را وارد کنید:</label> <input type="text" id="txt1" name="wp_api_post_prices" value="<?php echo esc_attr($saved_price); ?>"> <?php } // 元数据保存回调 function wp_api_savee_prices_metabox($post_id) { // 跳过自动保存 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // 校验用户权限 if (!current_user_can('edit_post', $post_id)) { return; } // 校验nonce防止CSRF攻击 if (!isset($_POST['wp_api_price_nonce']) || !wp_verify_nonce($_POST['wp_api_price_nonce'], 'wp_api_save_price_action')) { return; } // 过滤输入后保存数据 if (isset($_POST['wp_api_post_prices'])) { update_post_meta($post_id, 'wp_api_prices', sanitize_text_field($_POST['wp_api_post_prices'])); } } add_action('add_meta_boxes', 'wp_api_add_price_metabox', 10, 2); add_action('save_post', 'wp_api_savee_prices_metabox');
功能验证
替换原有代码后刷新文章编辑页,即可看到价格输入框,提交保存文章后,对应元数据会正常存入数据库,可通过get_post_meta(文章ID, 'wp_api_prices', true)调取保存的价格值。
内容的提问来源于stack exchange,提问作者pouya pazhoohandeh
相关产品推荐
相关产品推荐

