我正在试图获取wordpress管理中所有已注册元框的列表,特别是仪表板小部件。
现在,使用全局变量可以轻松实现这一点$wp_meta_boxes 并且只在仪表板页面上执行我需要的操作。
例如,如果我在自定义管理页或设置页上,我什么也得不到。我正在尝试获取仪表板小部件的列表,并为用户提供将它们放在不同自定义管理页面/仪表板上的选项。
获取这些元框还有几个其他类似的问题,我知道下面的代码是作为答案给出的,但是它也有同样的问题,如果不在仪表板页面上,它会返回一个空数组:
function get_meta_boxes( $screen = null, $context = \'advanced\' ) {
global $wp_meta_boxes;
if ( empty( $screen ) )
$screen = get_current_screen();
elseif ( is_string( $screen ) )
$screen = convert_to_screen( $screen );
$page = $screen->id;
return $wp_meta_boxes[$page][$context];
}
有人有什么想法吗?如果
$wp_meta_boxes 正在工作,我的设置有问题吗?还是有其他方法可以做到这一点?
任何帮助都将不胜感激!
SO网友:Tom J Nowell
这是因为仪表板小部件不直接使用metabox API,它们使用围绕它的API,并且只在上注册wp_dashboard_setup 和wp_network_dashboard_setup.
它们也被命名为仪表板小部件,而不是元盒,因此如果您谈论元盒,大多数用户将不知道您指的是什么。仪表板元盒可以引用WP Admin中的任何元盒。
这意味着在您的自定义管理页面上,这些挂钩不会启动,从而导致全局变量不包含仪表板小部件。
Additionally, 默认的WP小部件不会通过这些挂钩显示自己,而是添加到显示仪表板本身的相同功能中,wp_dashboard_setup. 此函数注册核心仪表板小部件,激发插件挂钩以添加它们自己的插件,然后触发metabox API来显示它们。
因此,您需要:
呼叫wp_dashboard_setup 在自定义页面上,将代码移动到wp_dashboard_setup 钩子,并确保它最后/最晚运行,根据您设置的选项添加和删除小部件。完全删除和替换主仪表板UI可能更容易,但API从来没有打算用于您试图对其执行的操作。
请记住,屏幕选项UI不会反映您的更改,可能会主动干扰您的操作。