Рубрика: WordPress » Проблемы »

Функция has_cap вызвана с устаревшим аргументом

После установки плагина WordPress появляется сообщение об использовании функции has_cap с устаревшим аргументом, но этой функции нет в коде плагина. Что нужно изменить в плагине?

Где устаревший аргумент?

Notice: Функция has_cap вызвана с аргументом, который считается устаревшим с версии 2.0! Использование уровней пользователей в плагинах и темах считается устаревшим. Используйте роли и возможности.. in /.../....../wp-includes/functions.php on line 2712

Файл .../wp-includes/functions.php - это не файл плагина, а файл WordPress, но в него в функцию has_cap()  передается устаревший аргумент из кода плагина.

Нужно найти, где в коде плагина задан уровень пользователя вместо возможности пользователя.

Что искать?

Устаревший аргумент - Уровень пользователя (User Level) - числовой, а сейчас в WordPress используются роли (Admin - администратор, Subscriber - подписчик и др.) и возможности (capabilities) , например, edit_posts - редактирование записей, read - читать, read_private_posts - читать личные записи (см. Roles and Capabilities в WordPress Codex)

Аргумент capability (возможность) задается в плагине  или теме, например, в функциях добавления административной страницы темы или плагина   add_theme_page()add_options_page()add_menu_page(), add_submenu_page().

Понятно, что должно быть задано, кто может иметь доступ к административным страницам плагина, например, вот синтаксис одной из функций добавления админ-страницы:

add_menu_page ($page_title, $menu_title,
               $capability, $menu_slug,
               $function, $icon_url, $position);

Третий параметр $capability задает, что для доступа пользователь должен иметь роль с указанной возможностью.  Если значение $capability задано неверно, получаем ошибку.

Примеры исправления

Неправильно использовать числовое значение уровня пользователя (устаревшее - deprecated) или строковое значение роли. Функции добавления меню и подменю принимают строковое значение возможности (например, edit_pages - редактирование страниц), а не роли пользователей.

//Неверно: роль задана как число 8
add_menu_page( 'MyPage', 'MyPage', 8, 'mypage',
                array(&$this, 'mainAdmin'), null, 6);
//Правильно: возможность 'edit_pages'
add_menu_page( 'MyPage', 'MyPage', 'edit_pages', 'mypage',
               array(&$this, 'mainAdmin'), null, 6);

//Неверно: строковое значение роли 'administrator'
add_submenu_page('mypage', 'MyLines', 'Lines', 'administrator',
                 'my-lines', array(&$this, 'linesPage'));
//Правильно:
add_submenu_page('mypage', 'MyLines', 'Lines', 'edit_pages',
                 'my-lines', array(&$this, 'linesPage'));

Еще пример.

В плагине Dictionary Box устаревший аргумент в функции добавления страницы настроек (опций):

function dictionary_box_options_page() {
add_options_page('Dictionary Box Options', 'Dictionary Box', 10, 'dictionary-
box/options.php');
}

Вместо 10 напишем 'manage_options' - возможность изменять настройки:

function dictionary_box_options_page() {
add_options_page('Dictionary Box Options', 'Dictionary Box', 'manage_options',
'dictionary-box/options.php');
}
Опубликовано в рубрике Проблемы | с метками , , , . |

11 комментариев: Функция has_cap вызвана с устаревшим аргументом

  1. doctorinfo говорит:

    Да, так и было add_submenu_page с 8-кой, поменял 8-ку на administrator. Большое спасибо, WordPress - рулит.

  2. Andris говорит:

    Проблема была в плагине RusToLat
    add_options_page('RusToLat', 'RusToLat', 8, __FILE__, 'rtl_options_page');
    заменил на
    add_options_page('RusToLat', 'RusToLat', 'edit_pages', __FILE__, 'rtl_options_page');
    Огромное спасибо

    • sanches812 говорит:

      +1 - проблема в RusToLat
      заменил как написано! "дуло пропало"! спасибо!

  3. Багтестер говорит:

    Да, во многих плагинах такая проблема. Ads WordPRess, RusToLat, Qiwi Button и ещё во многих пришлось применить выше написанное 🙂 Спасибо за полезную информацию!

  4. Вадим говорит:

    Благодарю за полезный пост! все получилось кому интересно смотрите скрин где нужно в коде плагина менять пересменные

  5. Алексей говорит:

    Не совсем понял где искать проблему когда отображается ошибка.
    У меня висит сообщение об ошибке: Функция has_cap вызвана....../wp-includes/functions.php on line 3495

    В линии 3495 указанного файла речь идет как раз о совместимости.

    Как узнать какой плагин не соответствует? У меня их много, все не перелопатишь.

    • Admin говорит:

      Ошибка появляется после активации плагина. Если новые плагины в последнее время не подключались, и неизвестно, из-за какого плагина появилась ошибка, можно отключать и включать плагины по одному, пока ошибка не исчезнет. Может оказаться, что таких плагинов несколько.

  6. Артур говорит:

    Огромное спасибо! помогло!

  7. Plawitel говорит:

    Плагин WP Page Numbers поправил файл wp-page-numbers.php.
    В строке add_submenu_page('options-general.php', 'WP Page Numbers Options', 'Page Numbers', 'manage_options', __FILE__, 'wp_page_numbers_settings'); заменил 10 и ошибка ушла.
    Спасибо!

  8. Тимур говорит:

    Спасибо друг! Мир твоему коду!

  9. Александр говорит:

    Спасибо! Помогло!!!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *