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

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

Чтиво

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

ACF Custom Fields performance WordPress

Источник: https://www.kobzarev.com/wordpress/acf-optimization/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

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

%d такие блоггеры, как: