Почему страница настроек моего плагина может не загружаться?

30 мар. 2011 г., 00:43:22
Просмотры: 5.23K
Голосов: 1

У меня возникла проблема на одном сайте, где установлен мой плагин. Страница "настроек" не загружается. Когда я нажимаю на "настройки", страница загружается, но после блока "Upgrade to 3.1" экран становится пустым, как будто там стоит die().

У меня есть два файла: plugin.php и plugin-admin.php

В plugin.php у меня есть код для настройки админ-страницы:

$my_dir = plugins_url('/img', __FILE__);
add_options_page( 
    'Настройки MY!', 
    'Настройки MY!', 
    'manage_options', 
    'my-plugin-admin.php', 
    'my_settings_admin', 
    $my_dir.'/favicon.png', 'top'
);
register_setting( 'my_settings_options', 'my_settings', 'my_settings_validate' );

function my_settings_admin(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
    include_once dirname(__FILE__) . '/my-plugin-admin.php';
}

define( 'my_BASENAME', plugin_basename( __FILE__ ) );
define( 'my_BASEFOLDER', plugin_basename( dirname( __FILE__ ) ) );
define( 'my_FILENAME', str_replace( my_BASEFOLDER.'/', '', plugin_basename(__FILE__)));

Ссылка "My Settings" отображается в меню "Настройки" корректно, и ссылка ведет на правильную страницу, но скрипт не загружается, и никакие трассировки внутри my-plugin-admin.php не работают.

Есть идеи?

ОБНОВЛЕНИЕ: с помощью t31os я обновил функцию, которая исправляет проблему:

function my_settings_admin(){
    include_once dirname(__FILE__) . '/my-plugin-admin.php';
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

Мне просто нужно было переместить wp_rewrite и flush_rules после оператора include. Хотя я не знаю, почему это помогло.

2
Комментарии

Возможно, проблема в вызове flush rules? Попробуйте без него? (Просто предположение)..

t31os t31os
30 мар. 2011 г. 01:05:00

@t31os: Бинго. Пожалуйста, оформите это как ответ, если хотите, и я проголосую за него и отмечу как решение. Мне пришлось закомментировать flush rules. Почему?

Scott B Scott B
30 мар. 2011 г. 06:55:53
Все ответы на вопрос 2
1

Если бы мне пришлось предположить причину проблемы, моей первой мыслью был бы вызов flush rules.

Как сказал Andy, включение debug очень помогает, и если вы действительно не хотите видеть ошибки, вы всегда можете использовать лог отладки, добавив следующее в ваш конфигурационный файл..

define('WP_DEBUG', true);          // Включить режим отладки
define('WP_DEBUG_LOG', true);      // Логировать ошибки в wp-content/debug.log
define('WP_DEBUG_DISPLAY', false); // Отключить отображение ошибок

Что касается проблемы с отсутствием редиректа при обновлении настроек, обычно это происходит, когда nonce отсутствует или некорректен, хотя в вашем случае может быть что-то другое.

Были ли какие-то ошибки при включенном debug? (или в логе, если вы используете этот метод?)

30 мар. 2011 г. 12:06:38
Комментарии

Спасибо. Это сработало. Мне просто нужно было переместить правила flush после оператора include. Хотя я пока не понимаю, почему так.

Scott B Scott B
30 мар. 2011 г. 18:04:40
2

Когда я использую предоставленный код, я вижу пункт меню "MY! Settings" как верхний элемент в меню Настройки, и у него неожиданный URL.

Вызов add_options_page должен быть обёрнут в функцию, подключённую к действию admin_menu.

function my_admin_menu() {
    add_options_page(
        'MY! Settings', // Заголовок страницы
        'MY! Settings', // Название пункта меню
        'manage_options', // Необходимые права доступа
        'my-admin', // URL-слаг страницы
        'my_settings_admin' // Функция для вывода содержимого страницы
    );
}
add_action( 'admin_menu', 'my_admin_menu' );

В целом, используйте define( 'WP_DEBUG', true ) в вашем wp-config.php, чтобы видеть ошибки и предупреждения.

30 мар. 2011 г. 04:24:21
Комментарии

Спасибо, Энди, я поместил это внутрь функции, моя ошибка, что не уточнил это.

Scott B Scott B
30 мар. 2011 г. 06:23:48

Проблема, как указал t31os, в правилах сброса. Мне пришлось разместить их после include once, а не до. Теперь скрипт загружается. Однако, при включенном режиме отладки, мои клики для сохранения настроек перенаправляют на options.php, а не обратно к настройкам плагина, как ожидалось.

Scott B Scott B
30 мар. 2011 г. 07:18:24