/ Wordpress / Отключаем стандартные метабоксы

Отключаем стандартные метабоксы

HIT

17.02.2019

1830

1

Отключая стандартные метабоксы, мы фактически избавляемся изначально от лишнего функционала. При отключении метабоксов мы также отключаем сами поля, что позволяет существенно разгрузить таблицу wp_postmeta (особенно если у сайта несколько тысяч записей). Особенно актуально это для магазинов WC, т.к. у каждого товара до 30 метаполей, половина из которых обычно не используются.

Вычитал в одном из чатов ответ разработчика Woocommerce. Он объясняет что сохранение пустых значений предусмотренно специально, т.к. само поле может запрашиваться во многих других функциях WC. Странно, почему они не могут запрашивать предварительную проверку существует ли данное значение, а не создавать десятки тысяч пустых метаполей.

SQL запрос на получение списка всех ключей в таблице wp_postmeta:

SELECT DISTINCT meta_key FROM `wp_postmeta`

Отключаем метабоксы WordPress

function remove_my_metaboxes() {
	remove_meta_box( 'categorydiv','post','normal' );       // Categories Metabox 
	remove_meta_box( 'submitdiv','post','normal' );         // Categories Metabox 
	remove_meta_box( 'postcustom','page','normal' );        // Custom Fields Metabox 
	remove_meta_box( 'postcustom','post','normal' );        // Custom Fields Metabox 
	remove_meta_box( 'commentstatusdiv','page','normal' );  // Comments Metabox 
	remove_meta_box( 'commentsdiv','post','normal' );       // Comments Metabox 
	remove_meta_box( 'trackbacksdiv','page','normal' );     // Talkback Metabox 
	remove_meta_box( 'trackbacksdiv','post','normal' );     // Trackback Metabox
	remove_meta_box( 'authordiv','page','normal' );         // Author Metabox 
	remove_meta_box( 'authordiv','post','normal' );         // Author Metabox 
	remove_meta_box( 'postexcerpt','post','normal' );       // Excerpt Metabox 
	remove_meta_box( 'postexcerpt','page','normal' );       // Excerpt Metabox 
	remove_meta_box( 'revisionsdiv','post','normal' );      // Revisions Metabox 
	remove_meta_box( 'slugdiv','page','normal' );           // Slug Metabox 
	remove_meta_box( 'slugdiv','post','normal' );           // Slug Metabox 
	remove_meta_box( 'formatdiv','post','normal' );         // Formats Metabox 
	remove_meta_box( 'postimagediv','post','normal' );      // Featured Image Metabox 
	remove_meta_box( 'tagsdiv-post_tag','post','normal' );  // Tags Metabox
	remove_meta_box( 'commentstatusdiv','post','normal' );  // Comments Status Metabox
}
add_action('admin_menu','remove_my_metaboxes');

Отключаем метабоксы Woocommerce

Идентификатор метабокса можно так, находим в коде нужный нам div с классом postbox. Его id и будет идентификатором этого метабокса.

add_action( 'add_meta_boxes' , 'remove_my_meta_boxes', 40 );
function remove_my_meta_boxes() {
    //remove_meta_box( 'woocommerce-product-images', 'product', 'side'); // Отключить блок доп. изображения
	//remove_meta_box( 'tagsdiv-product_tag', 'product', 'side' ); // Отключить блок метки товара
	//remove_meta_box( 'postexcerpt' , 'product' , 'normal' ); // Отключить блок краткое описание
    //remove_meta_box( 'commentsdiv' , 'product' , 'normal' ); // Отключить блок обзоры
	
	//remove_meta_box( 'woocommerce-product-data' , 'product' , 'normal' ); // !Отключить блок данные товара
}

Последняя строка отключает весь товарный бокс woocommerce. Функция для того чтобы оключить какую-либо вкладку из бокса WC:

function remove_linked_products($tabs){
	unset($tabs['general']);
	unset($tabs['inventory']);
	unset($tabs['shipping']);
	unset($tabs['linked_product']);
	unset($tabs['attribute']);
	unset($tabs['advanced']);
	
	return($tabs);
}

add_filter('woocommerce_product_data_tabs', 'remove_linked_products', 10, 1);

Но отключение вкладки полей не отклюючает сохранения этих полей с пустыми значениями.

Отключение некоторых полей функциями:

add_filter( 'wc_product_sku_enabled', '__return_false' ); // Отключить SKU
add_filter( 'wc_product_weight_enabled', '__return_false' ); // Отключить Вес
add_filter( 'wc_product_dimensions_enabled', '__return_false' ); // Отключить ШхВхГ

Но даже при отключении полей, пустые метаполя все равно создаются.

Очистка лишних meta_key

Остается только отчищать лишние поля через БД, но при обновлении товаров они снова будут появлятся. Сценарий запроса SQL на удаление полей WC:

Перед подобной процедурой необходимо сделать резервную копию базы данных, а также определить все ли перечисленные поля не используются на конкретном сайте
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_weight';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_length';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_width';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_height';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_wc_average_rating';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_wc_rating_count';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_product_version';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_stock';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_stock_status';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_backorders';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_manage_stock';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_sold_individually';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_sale_price_dates_to';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_sale_price_dates_from';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_purchase_note';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_tax_class';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_wc_review_count';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_upsell_ids';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_crosssell_ids';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_download_limit';
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_download_expiry';

DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_edit_last'
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_edit_lock'
DELETE FROM `wp_postmeta` WHERE meta_key LIKE '_wp_old_slug'

Удаление бесполезных полей (про которые мы точно знаем что на данном сайте не используются) можно автоматизировать функцией выхода из системы:

// Функция отчистки метаполей БД при деавторизации
function delete_useless_post_meta() {
   global $wpdb;
   $table = $wpdb->prefix.'postmeta';
   $wpdb->delete ($table, array('meta_key' => '_length'));
   $wpdb->delete ($table, array('meta_key' => '_width'));
   $wpdb->delete ($table, array('meta_key' => '_height'));
}
add_action('wp_logout','delete_useless_post_meta');

Рекомендуют также и эти таблицы чистить:

$wpdb->delete ($table, array('meta_key' => '_edit_last'));
$wpdb->delete ($table, array('meta_key' => '_edit_lock'));
$wpdb->delete ($table, array('meta_key' => '_wp_old_slug'));

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Подкатегория за подкатегорией

Подкатегория за подкатегорией

В одной из ранних статей мы отдельно от основного вывода WC выводили подкатегории. В этой статье мы усложним код вывода категорий и сделаем у категорий и вывод товаров. Это даст Читать далее »

Переход на WC 3.0

Переход на WC 3.0

Когда видишь в панели плагинов обновление woocommerce до версии 3.0 — ощущение как будто резко наступил Новый год! Что же нового в версии 3.0: изучаем, тестим, разбираемся. Галерея изображений Теперь Читать далее »

Upgrade WC

Upgrade WC

Очередная серия улучшений (upgrade) плагина WC. Буду добавлять по мере изучения новые решения. Поиск по SKU (артикулу) Из коробки WC не ищет по артикулам (SKU). Но достаточно установить плагин Search Читать далее »

/

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

1 комментарий

  1. Павел

    Спасибо за отличную статью! Не подскажете — почему у меня код «Функции отчистки метаполей БД при деавторизации» отображается кодом над шапкой сайта? 🙁 При этом на втором сайте всё заработало, база очищается при деавторизации.

Отключаем стандартные метабоксы
Статусы заказов
Рекомендации для васСтатусы заказовOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.