Очистка 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 'Готово';

Способ пригодится, если вы любите писать плагины.

Настоящий материал самостоятельно опубликован в нашем сообществе пользователем proper на основании действующей редакции Пользовательского Соглашения. Если вы считаете, что такая публикация нарушает ваши авторские и/или смежные права, вам необходимо сообщить об этом администрации сайта на EMAIL abuse@newru.org с указанием адреса (URL) страницы, содержащей спорный материал. Нарушение будет в кратчайшие сроки устранено, виновные наказаны.

You may also like...


Комментарии