Перезапись основных функций Wordpress с помощью плагинов


Есть ли способ перезаписать основную функцию ядра Wordpress с помощью плагина? Мне не нужно вводить код, мне нужно полностью заменить функцию переписанной версией.

Конкретная функция - wp_nav_menu_item_post_type_meta_box() в /wp-admin/includes/nav-menu.php

В основном отсутствует функциональность, которая не отвечает потребностям клиентов, поэтому мне нужно перезаписать эту функцию той, которую я создал. Я внес серьезные изменения к функции, и я хочу иметь возможность перезаписать функцию своей собственной с помощью плагина вместо непосредственного редактирования файла.

Я знаю, что это, вероятно, не намного лучше, чем взлом ядра, однако это временное немедленное решение.

Author: Dave Hunt, 2010-12-02

2 answers

Не совсем, нет. Вы можете переопределять встроенные функции PHP, но не определяемые пользователем функции.

Однако все, что делает эта функция, - это определяет мета-поле. Почему бы не определить свой собственный?

Как только вы определили и добавили свой собственный мета-блок, вы можете позвонить remove_meta_box, чтобы удалить стандартный:

remove_meta_box( 'add-POSTTYPENAME', 'nav-menus', 'side');

Мета-поле изначально добавляется для каждого пользовательского типа записи с помощью цикла. Идентификатор мета-поля определяется как 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 );
          }
      }
}
 7
Author: EAMann, 2010-12-02 18:40:32

Вот функция, которая позволит вам удалить мета-поля, определенные wp (даже по умолчанию), внутри страницы 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'  );
 0
Author: Jon, 2012-11-16 01:09:07