Безусловно, плагин 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/