Отключая стандартные метабоксы, мы фактически избавляемся изначально от лишнего функционала. При отключении метабоксов мы также отключаем сами поля, что позволяет существенно разгрузить таблицу wp_postmeta (особенно если у сайта несколько тысяч записей). Особенно актуально это для магазинов WC, т.к. у каждого товара до 30 метаполей, половина из которых обычно не используются.
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'));
[site-socialshare]
Спасибо за отличную статью! Не подскажете — почему у меня код «Функции отчистки метаполей БД при деавторизации» отображается кодом над шапкой сайта? 🙁 При этом на втором сайте всё заработало, база очищается при деавторизации.