Ставим правильные ссылки на телефонные номера
Многие бизнес-сайты показывают телефонные номера, чтобы их клиенты могли связаться с ними. В эпоху популярности настольных компьютеров пользователи записывали телефонный номер на бумажку и звонили с отдельного устройства.
Ошибка MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE
Если у вас возникла ошибка MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE
при заходе на сайт toster.ru
(или любой в будущем) в браузере FireFox, то лекарство ниже именно для вас.
Автообновление корзины WooCommerce
Простой сниппет для автоматическоого обновления корзины в WooCommerce при изменении количества товара.
Выравнивание блоков Gutenberg во всю ширину экрана
В редакторе блоков Gutenberg появились новые опции выравнивания: «По ширине содержимого» и «Во всю ширину«.
Дропдаун с количеством товара в WooCommerce
Как-то я переделывал сайт одного из своих клиентов на WooCommerce под названием CELIAS и меня попросили добавить дропдаун с выбором количества товаров.
Как задать свои идентификаторы для полей в Gravity Forms
По какой-то странной причине из коробки в Gravity Forms нет возможности задать свои идентификаторы для полей, чтобы потом было удобно с ними работать внутри хука gform_after_submission
, например.
Как отключить режим разработки в Redux Framework
В Redux Framework при активной опции WP_DEBUG = true
выводится новостной информер в консоли WordPress, баннер на странице настроек вашего плагина или темы и уведомление админу, что сайт находится в режиме разработки.
Как переименовать локальную и удалённую ветку в Git
Если вы случайно назвали ветку ошибочно и запушили её на удалённый репозиторий, выполните следующие три шага, прежде чем ваши коллеги успеют вылить на вас ушат с дерьмом за неправильное соблюдение соглашений об именованиях.
Почему не следует использовать query_posts() в WordPress
Если вы разрабатываете темы и плагины для WordPress, то вы наверняка встречались с функцией query_posts()
в многочисленных примерах и уроках в сети. В этой статье мы расскажем почему вам не следует никогда использовать эту функцию.
Основные и вторичные запросы
Основной запрос (или основной цикл) в WordPress это тот, который выполняется на раннем этапе загрузки ядра, он строится из запрошенного URL, настроек постоянных ссылок и т.д. Во время основного запроса WordPress определяет такие параметры как количество записей на страницу, используемый шаблон в теме и прочие. Основной запрос делает сам WordPress.
Вторичный запрос это тот, который выполняется дополнительно к основному. Например:
- Вывести в боковой колонке список самых популярных записей
- Вывести выделенные записи в слайдере на главной странице
- Вывести записи из той же категории в блоке «похожие записи»
Вторичные запросы выполняются с помощью класса WP_Query
, или с помощью одной из вспомогательных функций get_posts()
, query_posts()
и т.д. Если вы не знакомы с WP_Query
, советуем прочитать статью.
Основным отличием query_posts()
от других вспомогательных функций является то, что query_posts()
заменяет основной цикл на новый, вторичный цикл WordPress. Это значит, что в цикле с query_posts()
мы можем работать так же, как и в обычном основном цикле.
Для сравнения рассмотрим цикл для вывода популярных записей с помощью WP_Query
:
Этот же цикл с помощью query_posts()
:
Безусловно второй вариант выглядит немного чище и привычнее, поскольку такая конструкция чаще всего встречается при работе с основным циклом WordPress.
Именно поэтому разработчики часто думают, что query_posts()
изменяет основной запрос WordPress, но это не так. Функция query_posts()
заменяет основной цикл новым вторичным циклом, и происходит это после выполнения основного запроса.
$wp_query и $wp_the_query
После выполнения основного запроса WordPress помещает его результат в глобальную переменную $wp_the_query
, а в глобальной переменной $wp_query
хранится всего лишь ссылка на $wp_the_query
. Функции have_posts()
, the_post()
и прочие работают именно с глобальным объектом $wp_query
.
Чтобы в этом убедиться достаточно взглянуть на реализацию подобных функций:
Функция query_posts()
создает новый вторичный запрос с помощью WP_Query
и помещает результат в эту же глобальную переменную $wp_query
:
Таким образом функции, которые предназначены для работы с основным циклом WordPress начинают работать с нашим вторичным запросом, а основной запрос остался в глобальной переменной $wp_the_query
, ссылку на которую можно восстановить с помощью функции wp_reset_query()
.
После этого, функции have_posts()
и другие вновь работают с основным циклом WordPress, но разработчики часто об этом забывают, в результате чего перестает работать пагинация, некоторые виджеты и прочее.
Пагинация
Самым частым результатом использования query_posts()
является сломанная пагинация, когда например первые две страницы работают, а третья и четвертая возвращают ошибку 404. Давайте рассмотрим как, и почему это происходит.
По умолчанию WordPress показывает десять записей на одной странице. Допустим у нас всего двадцать записей, это всего две страницы. Изменить количество записей на страницу можно легко с помощью query_posts()
в начале нашего шаблона index.php или archive.php:
Таким образом на каждой странице у нас будет пять записей, а не десять, а наш плагин для пагинации будет отображать четыре страницы вместо двух. Все сходится, но при переходе на третью страницу мы получаем ошибку 404. Почему это происходит?
Напоминаем, что основной запрос WordPress происходит еще до того, как обрабатываются шаблоны index.php или archive.php, где происходит наша «подмена». В основном запросе количество записей на страницу — десять, и всего две страницы. Третей и четвертой страниц в основном запросе нет.
Именно основной запрос определяет какой шаблон темы будет использоваться, и при запросе третей или четвертой страницы WordPress будет использовать шаблон 404.php.
Изменение количества записей на страницу это самый простой и явный пример ошибок с query_posts()
. Гораздо сложнее подобные ошибки отловить, если вы например исключаете метку или категорию из списка записей на главной, или добавляете произвольный тип записей в поток.
Событие pre_get_posts
Наиболее правильным способом изменить основной цикл WordPress является событие pre_get_posts
, которое происходит перед каждым запросом WP_Query
. Работать с этим событием можно в плагине или в файле functions.php вашей темы:
Важно отметить, что pre_get_posts
вызывается для каждого запроса WP_Query
, включая основной запрос, навигационное меню, вторичные запросы в виджетах и прочее. С помощью метода is_main_query()
мы изменяем параметры только основного запроса, а с помощью проверки is_admin()
мы меняем запрос только на лицевой части сайта и не в административной панели.
Результат такого подхода тот же, что и с query_posts()
, но в этот раз будет работать пагинация, а загрузка страницы будет происходить быстрее, поскольку с pre_get_posts
мы действительно изменили основной запрос перед его выполнением и не выполняли вторичных запросов.
Альтернативы query_posts()
Если вам необходимо выполнить вторичный запрос в WordPress, воспользуйтесь функцией get_posts()
или конструкцией new WP_Query()
. При работе с ними ваш код будет более явным и понятным для читающих.
Когда вам необходимо изменить основной запрос WordPress перед его выполнением, самым простым способом является событие pre_get_posts
, или фильтр request
, который выполняется еще раньше, чем pre_get_posts
и только для основного запроса.
Если у вас возникли вопросы про query_posts()
или WP_Query, оставьте комментарий и мы обязательно вам ответим.
Визуально
Ссылки
- Оригинал статьи «Почему не следует использовать query_posts() в WordPress«. Автор Константин Ковшенин.
Повышение производительности запросов в WordPress путем удаления post__not_in
Используя post__not_in
в запросах, вы делаете работу внутреннего кеша практически бесполезной, особенно, когда список исключений является большим, это очень замедляет сам запрос и, как следствие, работу сайта в целом.
Как быстро удалить большую папку в linux
Представьте ситуацию, при которой вам нужно удалить огромную директорию, содержащую 100 гигабайт однобайтовых файлов. Какие варианты решения проблемы вы сможете сходу назвать?
Как получить покупателя в WooCommerce по номеру телефона
Если у вас из информации о покупателе есть только его телефоный номер, то этого достаточно, чтобы получить полную информацию о пользователе.
Так как из коробки данного функционала у WooCommerce нет — напишем простую функцию-хелпер.
Полезные хуки редактора Gutenberg
Gutenberg — это новый брендовый интерфейс от Automattic, который призван изменить способ взаимодействия пользователя с WordPress.
Как скрыть закладку помощи в WooCommerce
Все же в курсе, что у WooCommerce есть специальная закладка с помощью в дашборде WordPress?
Вот дерьмо, Git! — советы по решению проблем с Git
Git — жёсткий как первый анальный секс: прикрутить его очень легко, но вот выяснить, как исправить свои же ошибки, практически невозможно.
PHP: определение IP адреса пользователя
Задача определения IP адреса пользователя достаточно часто встречается (например, для создания записи в логе), поэтому привожу в упрощенном виде свой метод.
PHP: правильное слияние массивов
Чтобы добавить к массиву только те значения, которых в нем еще нет и пропустить совпадающие, достаточно найти отличия массивов и дописать нужное.
Битовые операции в PHP на примерах
Навеяно статьей об обработке критических ошибок в PHP. Обратил внимание, что несмотря на то, что коды ошибок в PHP специально заточены под битовые операции, тем не менее, что в примерах статьи, что в комментариях, для проверки кодов ошибок используются обычные операторы сравнения.
Расчет расстояний между городами по их координатам
Расчет расстояний между точками по их координатам на плоскости элементарен, на поверхности Земли — немного посложнее: мы рассмотрим измерение расстояния и начального азимута между точками без проекционных преобразований.
Число с ведущими нулями
Возникает необходимость выводить числа с ведущими нулями (например, дата вида 01.02.2010).