Основные уроки, извлеченные при оптимизации WordPress (для успеха клиентов)
Опубликовано: 2022-09-15Когда в последний раз у вас был момент облачной девятки?
С отличием сдал школу... или когда твоя девушка/парень принял твое предложение?
Две недели назад у меня было облако девять моментов! Я выступал на WordCamp Mumbai 2017 — крупнейшем WordCamp в Индии.
Эта тема была близка моему сердцу и чем я занимаюсь каждый день — извлеченные уроки по оптимизации WordPress для успеха клиентов.
О проблемах, с которыми я столкнулся при работе с большими базами данных WordPress, и о том, как я их решал.
Что побудило меня выступить на WordCamp Mumbai?
Разработка плагина WordPress — отличный опыт обучения. Вы можете расширить превосходную структуру, сосредоточиться на написании кода, который решает проблемы клиентов, и работать с отличными членами команды.
В StoreApps разработчики не только пишут код, но и поддерживают клиентов. Решение запросов клиентов дало мне один из самых важных уроков.
Так что все это моя повседневная рутина, и это довольно интересно.
Но знаете, что для меня более захватывающее? Работа с большими базами данных и решение сложных проблем с базами данных!
Нашими плагинами пользуются более 35000 пользователей. И я видел много проблем при работе с крупными магазинами WooCommerce и популярными сайтами WordPress.
К счастью, я смог решить эти проблемы и многому научился.
Но подождите, как и я, сотни других разработчиков столкнутся с аналогичными проблемами при работе с WordPress и WooCommerce.
Поэтому я решил поделиться своими уроками с другими.
А что может быть лучше, чем возможность выступить на крупнейшем в Индии WordCamp!
Три проблемы, из-за которых я не спал по ночам (с решениями и извлеченными из них уроками)
Наконец, вот три проблемы, о которых я говорил. Итак, давайте начнем с них один за другим.
Сокращение времени загрузки страницы с 3 минут до миллисекунд…
Проблема
Я столкнулся с ситуацией с плагином Smart Coupons, когда простой функционал отображения купонов на важных страницах магазина (т.е. корзина, страница оформления заказа и страницы моей учетной записи) останавливал процесс оформления заказа.
Smart Coupons — это плагин для массового создания и обработки купонов и подарочных сертификатов для магазина WooCommerce.
Решение
Теперь использование WP Query привело бы к нескольким JOIN , поскольку для отображения доступных купонов для конкретного пользователя требуется оценка нескольких метаусловий.
Итак, вместо того, чтобы использовать идеальный способ запросов к базе данных, то есть WP Query, я написал пользовательские запросы SQL .
Кроме того, в пользовательских запросах я сделал следующее:
- Вместо того, чтобы проверять все метаусловия в одном запросе MySQL, я просто вычислил первое метаусловие .
- После этого я сохранил разделенный запятыми список post_ids (идентификаторов купонов) в таблице параметров.
- А затем я просто уменьшил карту того же набора post_id, оценив каждое из других мета-условий.
Я делал это до тех пор, пока не получил окончательный набор post_id, которые нужно было отобразить для конкретного пользователя.
Улучшение решения
Это решило проблемы с загрузкой страницы. Однако, чтобы получить загрузку страницы менее чем за миллисекунды, как предложил наш друг, мне пришлось переопределить проблему.
Вместо того, чтобы показывать все купоны, на которые имеет право пользователь,
Я установил ограничение на количество купонов , которые будут отображаться пользователям на страницах корзины и оформления заказа.
Как ошибка тайм-аута стала самой продаваемой функцией нашего плагина?
Проблема
Для обработки очень больших обновлений базы данных я написал пользовательские запросы, так как использование основных функций WordPress может привести к огромным накладным расходам.
Пример: если кому-то нужно было снизить цены на все товары в своем магазине на 40%, то ему просто нужно выбрать «Цена», «уменьшить на 40%» и нажать кнопку «Обновить». Это легко возможно с помощью нашего плагина Smart Manager, разработанного для упрощения массовых обновлений в ваших магазинах WooCommerce.
Но процесс пакетного обновления начал останавливаться и выдавать ошибки тайм-аута всякий раз, когда кто-либо пытался обновить 1000 продуктов или весь магазин за раз .
Сначала я начал искать оптимизацию запросов, но это не помогло.
Моя ситуация была похожа на участницу Takeshi's Castle. Как бы я ни старался, я продолжал падать в воду.
Решение
Говорят, что иногда нужно отойти от проблемы и взглянуть на проблему с высоты птичьего полета , чтобы найти точную причину.
Я сделал то же самое и понял, что на самом деле проблема была
не на уровне запроса, а на уровне запроса .
Итак, что я сделал, так это то, что вместо одного запроса, выполняющего все обновления, я разбил одно и то же на несколько последовательных вызовов AJAX , выполняющих меньшие пакеты обновлений, что полностью устранило ошибки тайм-аута.
Улучшение решения
Теперь этот подход разбиения одного запроса на несколько меньших запросов AJAX не только решил ошибку тайм-аута, но и улучшил UX пакетного обновления .
Теперь менеджер магазина был проинформирован о ходе обновления, что просто повысило их доверие к продукту.
Кроме того, тот же подход позволил Smart Manager обрабатывать пакетные обновления для магазина WooCommerce любой формы и размера и сделал Smart Manager одним из самых продаваемых плагинов StoreApps.
Как среда общего хостинга заставила нас переписать наш плагин?
Проблема
Для любого плагина отчетности очень важно предоставлять не только точные, но и быстрые отчеты статистики. Теперь для получения статистики отчетов требуется несколько запросов, связанных с объединением двух основных таблиц WordPress, т. е. сообщений и постмета.
Как уже было видно выше, JOIN такие дорогие .
В Smart Reporter (наше решение для создания отчетов для WooCommerce) мы показывали 20 различных статистических данных отчетов при просмотре одной страницы, а также при загрузке страницы.
Решение
Таким образом, я следовал тому же подходу, что и большинство решений для создания отчетов, который заключался в создании сводной таблицы , т.е. пользовательской таблицы с плоской структурой.
Эта таблица будет содержать сводку всех данных, необходимых плагину, и, таким образом, исключить использование соединений и сократить время загрузки страницы.
Кроме того, для обновления этих сводных таблиц мы использовали действия и фильтры WordPress.
Резюме уроков
- Следуйте лучшим практикам как можно больше
- Нет запросов в цикле
- Избегайте больших сложных соединений
- Делайте больше на уровне MySQL, чем на уровне PHP
- Углубитесь в код
- Сводка/Пользовательские/Временные таблицы
- Внимание к UX — отзывчивость, уведомления…
- Вы решаете правильную проблему?
Какой твой выбор?
Я уверен, что вы имели дело с некоторыми огромными проблемами и нашли решения для них. Дайте нам знать об этом в нашем разделе комментариев ниже. Это было бы очень ценно для читателей.