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

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

HIT

17.02.2019

1452

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

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

  • Похожие записи
  • Комментарии
  • Вложения
Интересные фишки для Woocommerce

Интересные фишки для Woocommerce

Продолжаем серию интересных доработок для Woocmmerce. Выведем дату последней покупки товара У товара такого мета поля нет, нужно сопоставлять наименования (перебирая заказы). Для этого создаем запрос на перебор БД: В Читать далее »

Отключить кнопку Купить (чекбокс)

Отключить кнопку Купить (чекбокс)

Сделаем возможность у некоторых товаров отключать кнопку купить. Добавляем поле (чекбокс) Скрываем кнопку Добавить в корзину в карточке товара Изменяем кнопку В корзину в категориях Тут не получится отключить хуком, Читать далее »

Дополнительные статусы заказа

Дополнительные статусы заказа

Создадим дополнительные пользовательские статусы заказа. Custom Order Status for WooCommerce (10 000) Плагин от Tyche Softwares. Есть бесплатная и Pro версии. Стоимость Pro-версии: Один магазин – $39.00 5 магазинов – $99.00 Безлимит – $149.00 В бесплатной Читать далее »

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

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

  1. Павел

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

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