Wordpress: Отлов ошибок при разработке плагинов

Wordpress: Отлов ошибок при разработке плагинов

Этот рецепт продемонстрирует приемы для выявления и устранения ошибок при создании плагина, который будет скрывать элемент из меню навигации для не зарегистрированных пользователей. Таким образом мы убьем сразу двух зайцев.

Приступим ...

  1. Перейдите в каталог плагинов WordPress: wp-content/plugins Создайте новую директорию для плагина под названием nav-menu-filter Зайдите в директорию плагина и создайте php-файл: nav-menu-filter.php Откройте ваш новый файл в текстовом редакторе и добавьте необходимый комментарий-заголовок:

    <?php 
      /* 
          Plugin Name: Nav Menu Filter 
          Plugin URI:
          Description: Прячет пункты меню от не зарегистрированных пользователей
          Version: 1.0
          Author: Somebody
          Author URI: http://xxxxxx.xx/
          License: GPLv2
      */
    
  2. Добавьте следующую строку кода, что бы зарегистрировать callback-функцию, которая выполнится когда WordPress подготавливает данные меню навигации для отображения на странице:

    add_filter( 'wp_nav_menu_objects', 'new_nav_menu_items', 10, 2 );
    
  3. Добавьте следующий кусок кода, реализующий функцию new_nav_menu_items. Заметьте, что я нарочно допустил ошибку в ключевом слове functio:

      functio new_nav_menu_items( $sorted_menu_items, $args ) {
      	echo '<pre>' . print_r( $sorted_menu_items, 1 ) . '<pre>';
      	return $sorted_menu_items;
      }
    
  4. Сохраняем файл

  5. Идем в админку нашего сайта во вкладку Plugins

  6. Находим наш плагин в списке и активируем его.

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

  7. Перейдите обратно в редактор кода и исправьте слово function и сохраните файл.

  8. Перейдите в админку и попробуйте активировать плагин еще раз. Теперь все должно получиться.

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

  10. Обновите страницу ​​сайта. Теперь вы увидите, что весь контент исчез, а браузер отображает пустую страницу с сообщением об ошибке, подобной той, что мы только что видели.

  11. Исправьте ошибку в коде, сохраните файл. Сайт придет в норму.

  12. В панели WordPress, перейдите на вкладку Внешний вид | меню Для экспериментов можно взять любое меню, отображающееся в шаблоне текущей темы и поместить в него ссылку (простого типа, где надо указывать адрес в ручную). Назовите её Private Area и задайте ей адрес /privatearea

  13. Сохраняем изменения нажав на кнопку Сохранить меню

  14. Обновите страницу ​​сайта. Сейчас мы увидим много распечатанной информации, прежде чем сможем увидеть далеко внизу наше меню. Этот вывод генерируется с помощью функции print_r и призван помочь нам понять, как организованы входные данные, переданные нашей callback-функции. Как только мы разберемся со структурой этих данных, мы сможем правильно внести изменения в эту информацию.

  15. Замените вызов функции print_r внутри нашей callback-функции фильтра следующим кодом:

    // Проверяем зарегистрирован ли юзер:
    if ( is_user_logged_in() == FALSE ) {
        // Цикл по всем полученным элементам:
        foreach ( $sorted_menu_items as $key => $sorted_menu_item ) {
            // Проверяем на совпадение название элемента меню
            if ( $sorted_menu_item->title == "Private Area" ) {
                // Если совпало - просто удаляем элемент
                unset( $sorted_menu_items[ $key ] );
            }
        }
    }
    
  16. Обновите страницу ​​сайта, и вы увидите, что большой распечатанный массив исчез. Если вы вошли в систему как администратор, вы увидите ссылку Private Area в вашем меню. Если вы разлогинитесь, то увидите, что пункт меню Private Area исчез из меню.

Как это работает ...

WordPress строит список всех доступных плагинов для отображения их в панели администратора, он не проверяет каждый раз, является ли PHP код каждого плагина правильным. На самом деле он делает это когда плагин активируется. В этот момен, любая ошибка синтаксиса будет сразу поймана и плагин останется неактивным, предотвращая выход из строя всего веб-сайта.

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

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

И последнее, но не менее важное: реализация callback-функции фильтра использует API WordPress функцию is_user_logged_in, чтобы понять, зарегистрирован ли юзер или нет, и показывать ли ему приватную ссылку или нет.

В дополнение к рассмотренным методам отладки, WordPress предлагает ряд встроенных инструментов для облегчения поиска неисправностей плагинов. Файл wp-config.php, расположенный в корне файловой структуры WordPress, в основном использоваться для хранения данных о конфигурации сайта, но он также может быть использован, чтобы установить в нем разные константы отладки.

Первая из них WP_DEBUG, если она имеет значение TRUE то при работе сайта будут отображаться все PHP ошибки, предупреждения и уведомления в верхней части страниц. Собственно это есть режим отладки.

 define ('WP_DEBUG', TRUE); 

Для предотвращения отладочных сообщений от воздействия на фронтенд сайта, вы можете скачать полезный плагин называется Debug Bar для сбора сообщений и отображения их в админке.

Другие полезные константы отладки, которые могут быть активированы в файле WP-config.php следующие:

WP_DEBUG_LOG: При значении TRUE включает сохранение всех отладочных сообщений в файл с именем debug.log в директории wp-content для последующего анализа.

WP_DEBUG_DISPLAY: Определяет, должны ли сообщения об ошибках отображаться на экране.

SAVEQUERIES: Сохранение всех запросов к базе данных в переменной, которая может быть показана в футере шаблона см. дополнительную информацию

Предыдущие статьи этого цикла:

  1. WordPress: С чего начинаются плагины
  2. WordPress: Добавление контента в тег head страниц
  3. WordPress: Функции для работы с путями
  4. WordPress: Использование хуков фильтров
  5. WordPress: Добавление содержимого в каждый пост при помощи фильтров
  6. WordPress: Изменение содержимого страницы при помощи фильтров

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


Защитный код
Обновить



Кто на сайте
Сейчас 34 гостей онлайн