
在 WordPress 插件或主题中使用 add_menu_page() 和 add_submenu_page() 时,若回调函数属于类方法,必须以数组形式 array($this, 'method_name') 传递,而非字符串函数名,否则会导致“函数未定义”错误。
在 wordpress 插件或主题中使用 `add_menu_page()` 和 `add_submenu_page()` 时,若回调函数属于类方法,必须以数组形式 `array($this, 'method_name')` 传递,而非字符串函数名,否则会导致“函数未定义”错误。
在您提供的代码中,add_menu_page() 和 add_submenu_page() 的第 5 个参数(即回调函数)当前被写为字符串 'skillupCustomMenuMain' 和 'skillupCustomMenuMainArchive'。这会使 WordPress 尝试调用全局作用域下的函数,而实际这两个方法是类 AdminMenuFormSubmission 的实例方法——因此必须显式绑定到当前对象实例。
✅ 正确写法如下(关键修改已加粗):
public function addCustomMenu()
{
add_menu_page(
'Forms',
'Form items',
'manage_options',
'skillup-custom-menu',
array($this, 'skillupCustomMenuMain'), // ✅ 类方法回调:数组格式
'dashicons-cart',
4
);
add_submenu_page(
'skillup-custom-menu',
'Archived submissions',
'Archive',
'manage_options',
'skillup-custom-menu-main-archive',
array($this, 'skillupCustomMenuMainArchive') // ✅ 同样需用数组格式
);
}⚠️ 注意事项:
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
- 字符串回调(如
'skillupCustomMenuMain')仅适用于独立函数(非类方法),WordPress 会通过call_user_func()直接调用; - 类方法回调必须使用
array($instance, 'method_name')格式,确保作用域和$this上下文正确; - 确保回调方法为
public(您的代码已满足); - 若页面需处理表单提交或权限校验,建议在回调方法开头添加
if (!current_user_can('manage_options')) wp_die(__('You do not have sufficient permissions.'));增强安全性。
? 扩展建议:为提升可维护性,可将页面钩子与渲染逻辑分离,例如通过 load-{page-hook} 动作预加载数据,或使用 wp_enqueue_script() 在特定菜单页加载专属资源。
至此,您的自定义菜单即可正常渲染,且 skillupCustomMenuMain() 与 skillupCustomMenuMainArchive() 将在对应页面请求时被正确执行。

















