用插件覆盖核心WordPress函数
-
16-10-2019 - |
题
有没有办法覆盖核心功能是使用插件的WordPress核心?我不需要注入代码,我需要将功能完全替换为重写版本。
特定函数是/wp-admin/includes/nav-menu.php
基本上,缺乏无法满足客户需求的功能,因此我需要用我创建的功能来覆盖此功能。我已经对该功能进行了重大修改,并且我希望能够通过插件与我自己的函数覆盖该功能,而不是直接编辑文件。
我知道这可能并不比入侵核心要好得多,但是它是临时的立即解决方案。
解决方案
不是真的,不。您可以覆盖内置的PHP功能,但不能覆盖用户定义的功能。
但是,所有这些函数都可以定义一个元框。为什么不定义自己的?
一旦定义并添加了自己的元盒,您就可以致电 remove_meta_box
删除标准一个:
remove_meta_box( 'add-POSTTYPENAME', 'nav-menus', 'side');
最初使用循环为每个自定义帖子类型添加了元框。元框的ID定义为 add-{$id}
在哪里 $id
是后类型的名称。因此,您可以通过执行类似的循环或仅针对特定的帖子类型来删除所有帖子类型的元框。由你决定。
然后,只需为所需的帖子类型添加您的自定义元框即可。这是添加原始参考的功能:
function wp_nav_menu_post_type_meta_boxes() {
$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
if ( ! $post_types )
return;
foreach ( $post_types as $post_type ) {
$post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );
if ( $post_type ) {
$id = $post_type->name;
add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
}
}
}
其他提示
这是一个函数,可以使您可以删除WP定义的元框(甚至默认) nav-menus.php
页。通过删除元框,您还可以从“屏幕选项”选项卡中删除复选框选项。
独立的 remove_meta_box()
功能调用行不通,因为正如Eamann所说,这些盒子是用户定义的。您需要检查用户的管理状态,然后才能删除。
您可以将此功能放在主题中 functions.php
没有改变 wp-admin
文件。
function hide_meta_in_custom_menu_admin() {
global $pagenow;
global $current_user;
get_currentuserinfo();
$user_login=$current_user->user_login;
if($user_login=="scholar") {
//nothing
} else {
if (is_admin() && $pagenow=='nav-menus.php') {
remove_meta_box('add-custom-links', 'nav-menus', 'side');
remove_meta_box('nav-menu-theme-locations', 'nav-menus', 'side');
remove_meta_box('add-category', 'nav-menus', 'side');
}
}
}
add_action( 'admin_head', 'hide_meta_in_custom_menu_admin' );
更简单的代码,用于删除任何用户。
function hide_meta_in_nav_menu() {
global $pagenow;
if (is_admin() && $pagenow=='nav-menus.php') {
remove_meta_box('add-custom-links', 'nav-menus', 'side');
remove_meta_box('nav-menu-theme-locations', 'nav-menus', 'side');
remove_meta_box('add-category', 'nav-menus', 'side');
}
}
add_action( 'admin_head', 'hide_meta_in_nav_menu' );