WordPress

Ошибка «WP_Scripts::localize был вызван неправильно» в WordPress

После обновления WordPress до 5.7 у многих стала появляться ошибка:

Функция WP_Scripts:localize вызвана неправильно. Параметр $l10n должен быть массивом. Для передачи произвольных данных в скрипты используйте функцию wp_add_inline_script ().

Что это за ошибка

Во-первых, важно понимать, что это не ошибка, а Notice — простое предупреждение, что что-то работает не так, но ничего фатального и критичного в этом нет. Обычно эта информация используется исключительно разработчиками для отладки.

Во-вторых, это сообщение появилось в версии 5.7 и отображается только в том случае, если у вас включён режим отладки: в wp-config.php у вас указано define ('WP_DEBUG', true).

В-третьих, ошибку скорее всего вызывает какой-то плагин или тема, которые ещё не обновились до полной поддержки версии 5.7.

Как убрать ошибку

Способов устранения ошибки несколько:

  1. Отключить плагины или темы, которые вызывают ошибку. Не самый подходящий способ решения проблемы, поэтому двигаемся дальше 🙂
  2. Отключить режим отладки
    Для этого в файле wp-config.php нужно указать define ('WP_DEBUG', false);.
  3. Если режим отладки всё же необходим, можно отключить только подобные сообщения об ошибках, а остальные полезные штуки отладки оставить. Сделать это можно так:
add_filter( 'doing_it_wrong_trigger_error', function () { return false; }, 10, 0 );

Нулевая страница в пагинации WordPress приводит к дублям страниц

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

https://domain.ru/category-name
https://domain.ru/category-name/page/0
https://domain.ru/category-name/page/00
https://domain.ru/category-name/page/000
... и так далее

Все такие УРЛы отдают 200 код ответа. С одной стороны, canonical у всех этих страниц выводится корректный — https://domain.ru/category-name. А с другой, никогда не знаешь как этот каноникал учтёт поисковик.

Путём исследования нашёл такое решение проблемы:

add_action( 'template_redirect', 'arutyunov_redirects_from_zero_number_pages', 1 );
function arutyunov_redirects_from_zero_number_pages() {
	global $wp_query;

	// Если в параметрах передан номер страницы, и он равен 0,
	// то «насильно» меняем query-параметр пагинации на 1,
	// в таком случае дефолтная Вордпрес-функция `redirect_canonical`
	// подумает, что пользователь открывает /page/1 и перенаправит
	// на страницу категории без page-параметра
	if( isset($wp_query->query['paged']) && intval($wp_query->query['paged']) === 0 ) {
		$wp_query->query_vars['paged'] = 1;
	}
}

Код нужно добавить в файл functions.php вашей темы.

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

На что стоит обратить внимание:

  • у экшена установлен приоритет 1, чтобы он сработал раньше, чем встроенная функция redirect_canonical;
  • параметр paged у query заполнен лишь в том случае, если мы передаём GET-параметр page
  • мы перезаписываем paged в query_vars, чтобы Вордпрес подумал, что мы пытаемся открыть /page/1, с которой по-умолчанию всегда срабатывает редирект на саму категорию.

Что за приставка WPSE у многих WordPress-функций

Часто в сети или в коде каких-то плагинов или тем можно встретить функции с подобным названием: wpse231448_sanitize_title_with_dashes. У разработчиков возникает резонный вопрос — что за префикс wpse, ещё и с какими-то цифрами.

На самом деле всё просто: WPSE расшифровывается как WordPress Stack Exchange. Это сайт с вопросами о разработке на ВордПресс. Префикс для таких функций позволяет:

  • понять, что вопрос об этой фиче обсуждался на WPSE,
  • цифры — это ID вопроса, и можно из названия функции получить ссылку на обсуждение и посмотреть контекст обсуждения; в моём примере ссылка получится такая: https://wordpress.stackexchange.com/questions/231 448/

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

Мне не удалось найти источников, с которых началась эта практика введения такого именования функций, но есть обсуждения о том, как расширить эту практику и добавить новых возможностей :-).