使用插件覆盖核心WordPress函数

时间:2010-12-02 作者:Dave Hunt

有没有办法覆盖核心功能Wordpress核心是否使用插件?我不需要注入代码,我需要用重新编写的版本完全替换函数。

具体函数是/wp admin/includes/nav menu中的wp\\u nav\\u menu item\\u post\\u type\\u meta\\u box()。php

基本上没有满足客户需求的功能,所以我需要用我创建的功能覆盖这个功能。我已经对函数进行了大量修改,我希望能够通过插件覆盖函数,而不是直接编辑文件。

我知道这可能并不比破解内核好多少,但这是一个临时的即时解决方案。

2 个回复
最合适的回答,由SO网友:EAMann 整理而成

不完全可以。您可以重写内置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 );
          }
      }
}

SO网友:Jon

这里有一个函数,允许您删除nav-menus.php 页通过删除元框,您还可以从“屏幕选项”选项卡中删除复选框选项。

一个独立的remove_meta_box() 函数调用不会起作用,因为正如埃曼所说,这些框是用户定义的。您需要先检查用户的管理状态,然后才能删除。

您可以在主题中放置此函数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\'  );

结束

相关推荐

Menu API not switching menus?

我正在使用菜单API,我想切换到其他菜单,但出于某种原因,它保留了第一个菜单这是我的密码在函数中。php add_action( \'init\', \'register_my_menus\',10 ); function register_my_menus() { register_nav_menu(\'main-navigation\', \'Main Navigation\'); } 下面是我的主题文件(header.ph