Обложка к записи Оптимизация плагина ACF
Время для прочтения: 2 мин. 30 сек.

Оптимизация плагина 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.

Чтиво

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

ВКонтакте
Pinterest
Telegram
WhatsApp

Комментарии