Вопрос или проблема
Я использую функцию add_submenu_page(), чтобы добавить несколько опций в мой плагин. На хостинге Linux все работает как должно, на хостинге Windows эти 5 подменю почему-то имеют одинаковую ссылку, и когда я на них нажимаю, страница просто перезагружается. В чем может быть проблема? Оба хоста используют одну и ту же версию PHP. Вот код:
$this->page_hooks['link1'] = add_submenu_page(__FILE__, __('link1', 'domain'), __('link1', 'domain'), $acl_table['manage_link1'], 'wp-plugin-link1', array($this, 'on_manage_link1'));
$this->page_hooks['link2'] = add_submenu_page(__FILE__, __('link2', 'domain'), __('link2', 'domain'), $acl_table['manage_link2'], 'wp-plugin-link2', array($this, 'on_manage_link2'));
$this->page_hooks['link3'] = add_submenu_page(__FILE__, __('link3', 'domain'), __('link3', 'domain'), $acl_table['manage_link3'], 'wp-plugin-link3', array($this, 'on_manage_link3'));
$this->page_hooks['link4'] = add_submenu_page(__FILE__, __('link4', 'domain'), __('link4', 'domain'), 'manage_options', 'wp-plugin-link4', array($this, 'on_link4'));
$this->page_hooks['link5'] = add_submenu_page(__FILE__, __('link5', 'domain'), __('link5', 'domain'), 'manage_options', 'wp-plugin-link5', array($this, 'on_link5'));
Мне кажется, что связанная функция, которая вызывает сам файл страницы, одинакова для всех пяти случаев использования add_submenu_page(). Трудно сказать без кода.
<?php add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function ); ?>
Переменная $function должна быть разной для всех пяти случаев, что означает, что вам нужно еще четыре функции или методы класса. У вас уже должна быть одна, просто дублируйте ее и укажите включение в другие файлы страниц или измените содержание функций, если вы не включаете файлы.
WordPress Codex: add_submenu_page()
Обновление
Вы пробовали без использования $this->page_hooks[‘link5’] и упрощения вещей? Я не помню, чтобы использовал add_submenu_page() таким образом. Хотя я использую его в цикле, так как моя структура/данные меню находятся в массиве в моем плагине…
add_submenu_page($n, $c2p_mpt_arr[$k]['title'], $c2p_mpt_arr[$k]['menu'], $required_capability, $c2p_mpt_arr[$k]['slug'], array($this,'page_' . $k) );
Мне удалось найти решение. Проблема была с __FILE__
, Windows не воспринимал это как переменную, это было просто NULL
. Я изменил это на родительский слаг, и теперь все работает нормально.
Ответ или решение
Проблема с тем, что ссылки в админском меню вашего плагина просто обновляют страницу, как правило, указывает на ошибки в реализации функции add_submenu_page()
. Рассмотрим основные аспекты, которые могут вызывать такую ситуацию, учитывая ваш код и замечания.
1. Какая ошибка могла произойти?
Использование FILE
Вы отметили, что проблема была связана с использованием переменной __FILE__
. На хостингах под Windows значение этой константы могло быть интерпретировано как NULL
, что является дорогостоящей ошибкой. Как результат, страницы, ассоциированные с вашими подменю, не запускались должным образом, а просто происходило обновление главной страницы админ-интерфейса.
Решение:
Измените __FILE__
на корректный родительский слаг, как вы это сделали, чтобы обеспечить правильное связывание подменю с главной страницей плагина.
2. Проверка функции обратного вызова
Ваши функции обратного вызова, такие как on_manage_link1
, on_manage_link2
и т. д., должны быть уникальными для каждого подменю. Все функции должны быть правильно определены и должны вызываться в зависимости от выбранного подменю. Убедитесь, что каждая функция делает свое дело и не используется в нескольких местах.
Пример правильного вызова:
$this->page_hooks['link1'] = add_submenu_page('parent_slug', 'Link 1', 'Link 1', 'manage_options', 'wp-plugin-link1', array($this, 'on_manage_link1'));
3. Проверка аргументов
Также стоит проверить все аргументы, которые вы передаете в функцию add_submenu_page()
. Убедитесь, что параметр $capability
корректно показывает требуемую возможность для каждой подстраницы. Например, у вас есть и manage_link1
, и manage_options
. Это может привести к тому, что не все пользователи смогут видеть все подменю.
4. Сравнение окружений
Так как у вас работают оба хостинга на одной и той же версии PHP, следите за различиями в конфигурации сервера и установке PHP. Windows и Linux могут обрабатывать определенные функции или настройки по-разному, например:
- Настройки путей
- Регистронезависимость файловых систем
- Конфигурации .htaccess или php.ini (в случае Windows использование IIS)
5. Дебаггинг
Чтобы диагностировать проблему, попробуйте вывести отладочную информацию. Вставьте вывод для проверки значений переменных. Например:
if ( is_admin() ) {
error_log('Current page slug: ' . $current_screen->base); // Проверка текущего экрана
}
Заключение
Эти меры позволят вам углубиться в проблему и выявить корень неисправности. Определив правильные параметры и убедившись, что каждая функция рабочая, вы сможете решить проблему, мешающую корректной работе вашего плагина. Успехов в дальнейшем развитии вашего проекта!