Оптимизация плагина ACF

Безусловно, плагин Advanced Custom Fields(ACF) будет лидером среди плагинов для добавления произвольных полей ввода в WordPress.

У него тысячи контрибьюторов, которые находят и фиксят ошибки, занимаются оптимизацией производительности, но есть, что подкрутить.

Суть данной оптимизации заключается в переносе инициализации полей ввода из базы данных в РНР, скрытии GUI плагина, удалению ненужных записей в базе данных и отключении плагина во фронтенде.

Экспорт полей ввода в РНР

Для начала экспортируем имеющиеся поля ввода в виде PHP кода. Для чего переходим по пути Группы полей ввода → Инструменты, отмечаем чекбокс Выбрать все и нажимаем кнопку Генерировать РНР.

Копируем полученный код и вставляем его в файл functions.php активной темы, используя рекомендуемый хук acf/init:

add_action( 'acf/init', function() { acf_add_local_field_group( array(...));});

Отключение 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() || wp_is_jsonp_request()) { return $plugins; } foreach( $plugins as $key => $plugin) {     if( 'advanced-custom-fields-pro/acf.php' === $plugin) {            unset( $plugins[ $key ]);        }    }     return $plugins;}add_filter( 'option_active_plugins', 'mihdan_disable_acf_on_frontend');

Сейчас, чтобы вывести поля ввода необходимо использовать стандартные возможности ядра get_post_meta, get_term_meta, get_user_meta вместо возможности get_filed из набора ACF.

Чтиво

  • Hide the ACF menu
  • Register fields via PHP
  • WP-CLI Handbook

Комментарии приветствуются.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *