Очистка meta-ключей из таблицы Postmeta
Каждый раз при редактировании поста Вордпресс записывает в базу данных дату и время последнего редактирования записи, старые адреса ссылок и прочую ненужную информацию — все это несомненно загромождает базу данных и замедляет работу. Чтобы навести порядок во всем этом, не потребуется особых знаний и умений, достаточно всего лишь выполнить вот такой SQL запрос к базе данных WordPress в панели PhpMyAdmin:
DELETE FROM `wp_postmeta`
WHERE `meta_key` IN('_edit_lock', '_edit_last','_wp_old_slug')
Сделали бэкап базы данных? Отлично! Тогда можно приступать. Выполняя данный запрос, мы удаляем из таблицы wp_postmeta следующие ключи:
_edit_lock Оказывается, если для пользователей открыт доступ для написания постов на Вашем блоге, т.е. в консоли управления на вкладке «Параметры» в пункте «Общие» роль нового пользователя будет обозначена как Автор, то данный параметр будет отвечать за время, в течение которого он может изменять свое сообщение. Число 60 говорит о том, что у пользователя есть 60 минут на редактирование своего сообщения с момента публикации. Данный параметр я считаю абсолютно бесполезным в том случае, если владелец сайта является единственным автором статей.
_edit_last Данный параметр содержит информацию о времени последнего редактирования записи. Не несет в себе существенной смысловой нагрузки и его можно смело удалять.
_wp_old_slug Параметр содержит информацию о предыдущем адресе поста, если были изменения. WordPress хранит в базе данных старые адреса страниц и при их смене производит редирект на новый адрес, отдавая код 200 — как будто страница по-прежнему существует. Это может быть полезным, чтобы не потерять старые ссылки — но может и создавать проблемы, например, поисковики могут обнарудить одинаковое содержимое на «старой» и «новой» странице — а они такое не любят.
Любителям быстрой езды можно выполнить более широкий запрос:
DELETE FROM `wp_postmeta`
WHERE `meta_key` IN('_edit_lock', '_edit_last','_wp_old_slug','_wp_attachment_metadata')
_wp_attachment_metadata — это метаданные к загруженным картинкам. Среди прочего в них содержатся отсылки к сгенерированным тумбнайлам, что нужно для работы интерфейса медиабиблиотеки. Но на работу самого сайта отсутствие метаданных никак не повлияет — он только быстрее работать станет.
При необходимости метаданные можно пересоздать при помощи какого-нибудь плагина вроде Regenerate Tumbnail — в том числе пересоздать выборочно только для тех картинок, что вам нужны.
На самом деле предлагаемый скрипт можно использовать куда шире — вам лишь нужно найти, какие именно записи в таблице wp_postmeta являются мусорными и вам больше не нужны. Делается это вот так:
Собственно, идея очевидна — в PhpMyAdmin выбираете базу вордпресса, в ней таблицу wp_postmeta, и там для поля meta_key давите кнопочку «Обзор уникальных значений». У вас получится список этих самых уникальных ключей. Ну и вот смотрите на них и думайте — что это и зачем оно вам нужно.
Вот вам пара примеров, как можно организовать чистку мета-ключей:
DELETE FROM `wp_postmeta`
WHERE `meta_value` LIKE '_wpAjax%'
DELETE FROM `wp_postmeta`
WHERE `meta_key` LIKE '_nxs_snap%'
Конструкция LIKE используется для поиска вхождения в строке по шаблону:
'abc%' Любые строки, которые начинаются с букв «abc»
'abc_' Строки длиной строго 4 символа, причем первыми символами строки должны быть «abc»
'%z' Любая последовательность символов, которая обязательно заканчивается символом «z»
'%Rostov%' Любая последовательность символов, содержащая слово «Rostov» в любой позиции строки
'% % %' Текст, содержащий не менее 2-х пробелов, например, "World Wide Web"
Как видите, всё просто.
А вот такой запрос позволит вам удалить из wp_postmeta записи, не связанные ни с каким постом (ситуация встречается, когда посты удалили — а постмета к ним осталась):
DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
WHERE wp.ID IS NULL
Ну и для интересующихся — с уровня админа можно выполнить SQL прямо из Вордпресса через PHP вот так:
global $wpdb;
$sql = "DELETE pm FROM $wpdb->postmeta pm
LEFT JOIN $wpdb->posts wp ON wp.ID = pm.post_id
WHERE wp.ID IS NULL";
if( $wpdb->query( $sql ) )
echo 'Готово';
Способ пригодится, если вы любите писать плагины.