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

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

HIT

17.02.2019

1749

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'));

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

  • Похожие записи
  • Комментарии
  • Вложения
Upgrade WC

Upgrade WC

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

/
Хлебные крошки WC

Хлебные крошки WC

Хлебные крошки WC имеют свои особенности. Их невозможно заменить стандартными хлебными крошками, т.к. в них еще не предусмотрена система для иерархических таксономий. Выводим хлебные крошки Первым делом надо назначить хлебные Читать далее »

Отработка брошенных корзин

Отработка брошенных корзин

По самым различным причинам посетитель сайта может бросить оформление заказа на последнем шаге. Возможно этому посетителю нужно напомнить об оставленной корзине и предложить некий бонус. Abandoned Cart Lite for WooCommerce Читать далее »

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

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

  1. Павел

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

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