Ошибка: Объявление MyClass::start_lvl() должно быть совместимо с Walker_Nav_Menu::start_lvl()

9 апр. 2013 г., 05:28:31
Просмотры: 30.8K
Голосов: 18

В настоящее время я работаю с сайтом WordPress, и каждый раз, когда в панели администратора я перехожу на страницу Внешний вид > Меню, появляется следующая ошибка:

ErrorException: Runtime Notice: Declaration of Walker_Nav_Menu_Edit::start_lvl() should be compatible with that of Walker_Nav_Menu::start_lvl() in wp-admin/includes/nav-menu.php line 203

Похоже, это какая-то проблема совместимости PHP. На моей локальной машине для разработки установлен PHP 5.3.10.

Какой будет лучший способ исправить эту проблему?

0
Все ответы на вопрос 3
3
32

Из класса class Walker_Nav_Menu:

function start_lvl( &$output, $depth = 0, $args = array() )

Ваш дочерний класс обязан использовать ту же сигнатуру: три аргумента, первый из которых передается по ссылке. Любые отличия вызовут ошибку, с которой вы столкнулись.

Обратите внимание, что $args по умолчанию является пустым массивом, но вы получаете экземпляр stdClass, а не массив. Так устроен WordPress.

9 апр. 2013 г. 07:29:35
Комментарии

Я понимаю. Это класс WordPress, не мне его менять. Мой вопрос в том, как лучше обойти проблему (желательно без вмешательства во внутренности WP)...

Luke Luke
9 апр. 2013 г. 07:41:41

Вам не предлагают вмешиваться в ядро WordPress. Вам нужно изменить способ объявления вашего метода в расширенном классе, чтобы он соответствовал тому, как это сделано в оригинальном классе WordPress.

s_ha_dum s_ha_dum
9 апр. 2013 г. 16:17:28

Понял. Ошибка сбила меня с толку. Сначала показалось, что проблема в ядре WP, но на самом деле она указывает на определение сигнатуры, а не на место возникновения проблемы.

Luke Luke
10 апр. 2013 г. 02:04:14
5
18

Замените в классе Walker_Nav_Menu эти строки

function start_el(&$output, $category, $depth, $args) {

на

function start_el(&$output, $category, $depth = 0, $args = array(), $current_object_id = 0) {

function end_lvl(&$output, $depth, $args) {

на

function end_lvl(&$output, $depth = 0, $args = array()) {

function start_lvl(&$output, $depth, $args) {

на

function start_lvl(&$output, $depth = 0, $args = array()) {

function end_el(&$output, $category, $depth, $args) {

на

function end_el(&$output, $category, $depth = 0, $args = array()) {
23 сент. 2017 г. 13:09:07
Комментарии

Можете также объяснить, как это работает, вместо простого добавления кода, и чем это отличается от принятого ответа?

bravokeyl bravokeyl
23 сент. 2017 г. 13:45:14

Да; Ответ был обновлён в 2015 году, и он не работает в новых версиях WordPress ссылка

Mohammad Abedi Mohammad Abedi
23 сент. 2017 г. 16:54:55

Да, было бы здорово получить объяснение ответа.

bravokeyl bravokeyl
23 сент. 2017 г. 20:18:35

Это спасло мне задницу, определённо правильный ответ, если у вас 4 сообщения об ошибках для функций start_el, end_el, start_lvl, end_lvl

Stephen Stephen
8 июн. 2018 г. 19:29:40

Где или как мы попадаем в класс Walker_Nav_Menu??? Я не знаю, где и как он выбирается!!!!!

riemannium riemannium
14 нояб. 2019 г. 00:14:00
0

У меня была такая же ситуация. Вы получаете старые коды walker для навигационного меню, и система указывает, что нужно сделать при включенном wp_debug(true).

Menu_Frontend::start_lvl(&$output, $depth) должен быть совместим с Walker_Nav_Menu::start_lvl(&$output, $depth = 0, $args = NULL) в C:\xampp\htdocs\shopnet\wp-content\themes\Viteeo\hades_framework\helper\megamenu.php на строке 314

Как видите, нужно изменить строку кода, на которую ссылается PHP. В указанной выше ошибке следует заменить start_lvl(&$output, $depth) на start_lvl(&$output, $depth = 0, $args = NULL). Остальные процессы остаются такими же. Но не забудьте добавить открывающую скобку функции { в конце, вот так: NULL) {

5 апр. 2020 г. 14:54:09