Безусловно, плагин Advanced Custom Fields (ACF) является лидером среди плагинов для добавления произвольных полей в WordPress.
У него тысячи контрибьюторов, которые находят и фиксят ошибки, занимаются оптимизацией производительности, но всегда есть, что подкрутить.
Суть данной оптимизации заключается в переносе инициализации полей из базы данных в РНР, скрытии GUI плагина, удалению ненужных записей в базе данных и отключении плагина во фронтенде.
Экспорт полей в РНР
Для начала экспортируем имеющиеся поля в виде PHP кода. Для чего переходим по пути Группы полей → Инструменты, отмечаем чекбокс Выбрать все и нажимаем кнопку Генерировать РНР.
Копируем полученный код и вставляем его в файл functions.php
вашей активной темы.
Отключение GUI в ACF
Так как все поля у нас теперь инициализируются через РНР, то управлять ими через админку нам более не требуется, поэтому отключим данный интерфейс при помощи хука acf/settings/show_admin
внутри файла functions.php
вашей активной темы:
add_filter( 'acf/settings/show_admin', '__return_false' );
Теперь и админка WordPress и сам сайт будут делать ровно в два раза меньше запросов в базу данных для получения полей.
Удаление лишних записей в базе данных
Внутренняя архитектура плагина ACF такова, что для хранения одного поля у одного поста используется две метазаписи в базе данных. Одна содержит информацию о самом поле, вторая — значение этого поля.
После переноса всех полей в само приложение информация о поле в базе данных нам больше не нужна, поэтому мы может ее удалить.
Перед началом работы с базой данных — сделайте её полный бекап.
Бекап делаем при помощи WP-CLI:
wp db export
После создания бекапа, открываем консоль MySQL, куда будем вводить SQL запросы:
wp db cli
Удаление полей у записей
Ищем поля, которые начинаяются на _field_
и удаляем их:
DELETE FROM wp_postmeta WHERE meta_key like '_field_%' LIMIT 100000;
Удаление полей у пользователей
Ищем поля, которые начинаяются на _field_
и удаляем их:
DELETE FROM wp_usermeta WHERE meta_key like '_field_%' LIMIT 100000;
Отключение плагина ACF во фронтенде
Перед отключением плагина убедитесь, что у вас нет сложных составных полей с повторителями, хотя и это ограничение можно обойти.
Копируем следующий код и вставляем его в файл _disable-acf-on-frontend.php
(подчеркивание в начале нужно, чтобы файл подключился в самом начале загрузки плагинов WordPress) в папке wp-content/mu-plugins
:
/** * Удаляем плагин ACF во фронтенде * * @param array $plugins Массив всех плагинов * @return array */ function mihdan_disable_acf_on_frontend( $plugins ) { if ( is_admin() || wp_is_json_request ) { return $plugins; } foreach( $plugins as $key => $plugin ) { if ( 'advanced-custom-fields-pro/acf.php' === $plugin ) { unset( $plugins[$i] ); } } return $plugins; } add_filter( 'option_active_plugins', 'mihdan_disable_acf_on_frontend' );
Теперь, чтобы вывести поля нужно использовать стандартные функции ядра get_post_meta
, get_term_meta
, get_user_meta
вместо функции get_filed
из набора ACF.
Чтиво
Комментарии приветствуются.
Источник: https://www.kobzarev.com/wordpress/acf-optimization/