Рубрики
Wordpress

Плагин создал X символов неожиданного вывода при активации в WordPress

Как избежать неожиданного вывода

При разработке своего плагина можно столкнуться с тем, что при активации появляется сообщение наподобие «Плагин генерировал X символов неожиданного вывода при активации».

Наиболее распространенных причин данной ошибки три:

  • Не верно указана кодировка файла;
  • После закрывающего php тега стоит пробел или таб;
  • Ошибка в коде, например в SQL запросе, при создании таблиц.

Кодировка файла — причина неожиданного вывода

Если у вас ошибка неожиданного вывода в этом, то скорее всего вы пользуетесь программой наподобие Notepad++. Вам не нужно дополнительно указывать BOM(Byte order mark), так как он уже определен. Поэтому в качестве кодировки укажите UTF-8 без BOM.

Нечитаемый символ после закрывающего тега

Если в файле не предполагается вывод данных, то вам не нужно в конце файла указывать ?>. Например файл не является шаблоном, а вывод осуществляется только из функций.

После того, как вы закрыли php тег, а потом случайно добавили пробел, то он будет выведен. Это и станет причиной ошибки, так как был осуществлен вывод. Поэтому, создавая файлы, без непосредственного вывода, не завершайте их закрывающим php тегом. Просто не закрывайте тег и все.

Пример неправильного завершения файла, не являющегося шаблоном:

<?php
function someName(){
  // код файла
}
?>

Правильный пример:

<?php
function someName(){
  // код файла
}

Так как тег php не закрыт, все пробелы, переводы строки и прочие не читаемые символы, не являющиеся операторами будут игнорироваться и не будут считаться выводом.

Ошибка в коде

Для отлова ошибки в коде необходимо включить вывод ошибок. В файле wp-config.php добавьте следующие значения:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );

В этом случае все ошибки сервера попадут в лог. Расположение этого файла зависит от настроек, обычно он в папке wp-content.

Вы можете создать отдельный файл, для отлова данный ошибки:

function create_error_log() {
	$out = ob_get_contents();
	if ( ! empty( $out ) ) {
		file_put_contents( ABSPATH . '/error_log_' . date( 'Y_m_d_H_i_s' ) . '.html', $out );
	}
}

Функцию нужно выполнить после того, как отработали другие функции, которые срабатывают при активации плагина:

function activation() {
    // код каких-то функций тут
    get_error_log();
}

register_activation_hook( __FILE__, 'activation' );

При возникновении ошибки, в корне сайта будет создаваться файл с именем error_log_<дата и время активации>.html. Файл будет содержащий данные об ошибке неожиданного вывода.