Структура и таблицы базы данных WordPress

Приветствую своих читателей в новом году, пора приступать к работе! Рано или поздно вебмастеру пригодятся технические знания об устройстве WordPress, из каких файлов состоит тема и для каких функций они предназначены, как организована структура базы данных.

База данных WordPress

Сегодня моя новая статья будет посвящена базе данных MySQL, которая является неотъемлемой частью платформы WordPress. Поскольку WordPress самостоятельно взаимодействует с базой данных, то обычные пользователи не должны сильно волноваться о её структуре. Однако, вам может быть интересно узнать, как WordPress хранит свои данные и зависимости, если пишете свой плагин.

Мысль написать статью на эту тему меня посетила отнюдь не случайно. В один прекрасный день на одной из страниц был оставлен полезный развёрнутый комментарий, не имеющий абсолютно никакого отношения к её содержанию, но запись с подходящей для обсуждения темой на блоге имелась.

Внимание! Любое изменение базы данных может привести к необратимым последствиям и нарушению работы сайта. Все действия выполняются на свой страх и риск. Обязательно делайте резервное копирование!

Поэтому я решил исправить ситуацию и перенести комментарий на другую релевантную страницу 😉 В базе данных в таблице wp_comments я нашёл этот комментарий и отредактировал строку таблицы, изменив значение поля comment_post_ID. Просто сменил ID записи к которой был отправлен комментарий на ID другой записи. После сохранения изменений в базе данных комментарий был успешно перенесён на другую страницу.

Таблицы, из которых состоит база данных WordPress

Сразу после установки WordPress база данных содержит таблицы, имена которых начинаются с префикса. При установке CMS появляется возможность задать свой префикс — это рекомендуется в целях повышения безопасности сайта.

Таблицы базы данных WordPress

Стандартный префикс wp_ при установке WordPress допускается не изменять. Если планируете создавать несколько сайтов с использованием одной общей базой данных, то обязательно для каждой установки задавайте разный префикс для таблиц 💡

  1. wp_commentmeta
  2. wp_comments
  3. wp_links
  4. wp_options
  5. wp_postmeta
  6. wp_posts
  7. wp_termmeta
  8. wp_terms
  9. wp_term_relationships
  10. wp_term_taxonomy
  11. wp_usermeta
  12. wp_users

Обратите внимание, если ваши таблицы не совпадают с моим списком, их больше или, наоборот, меньше, то причиной может оказаться несколько вариантов:

  • Установлена другая версия WordPress. На момент последнего редактирования текущей статьи актуальной версией является 5.0. Настоятельно рекомендую своевременно обновлять CMS.
  • Установлены плагины, которые создали в базе данных свои таблицы. Плагины также меняют содержимое таблиц, добавляя новые поля, строки и т.д.
  • В процессе установки WordPress был изменён стандартный префикс таблиц.

Итак, после чистой установки WordPress база данных будет содержать 12 таблиц. Давайте с ними познакомимся и узнаем для чего они предназначены, какую хранят информацию.

Описание и предназначение таблиц базы данных

Работая с базой данных в целях администрирования я использую панель phpMyAdmin. На вашем хостинге или сервере может быть установлено другое программное обеспечение.

phpMyAdmin

Таблица wp_commentmeta

Каждый комментарий, оставленный на сайте, содержит метаданные — эта информация хранится в этой таблице. Например, если установлен плагин Akismet для защиты от спама, то он будет записывать в неё свои данные: одобрен комментарий или нет, имеется ли пометка о спаме.

Таблица wp_commentmeta

Таблица wp_comments

Название этой таблицы говорит само за себя — здесь хранятся оставленные к записям комментарии. Именно в этой таблице я переносил комментарий с одной страницы на другую, о чём писал в начале статьи.

Таблица wp_comments

Помимо текста комментария в таблице хранится дополнительная информация, включая имя, электронную почту и сайт автора, IP-адрес с которого бы отправлен комментарий, дату, время и многое другое.

Таблица wp_links

Эта таблица раньше хранила ссылки блогролла на Кодекс, wordpress.org и другие ресурсы. На блоге у меня были удалены все ссылки из консоли, поэтому на скриншоте ниже есть надпись «Ссылок не найдено», а таблица пуста.

Таблица wp_links

Теперь эта функция устарела, но при необходимости её можно включить с помощью плагина Links Manager.

Таблица wp_options

Хранит основные настройки WordPress, в том числе параметры, доступные для изменения в консоли администрирования. Кстати, таблица wp_options очень интересна для изучения, но зачастую после установки и последующего удаления плагинов содержит лишние строки. У меня есть отличное руководство по чистке базы данных от «мусора».

Таблица wp_options

Таблица wp_postmeta

Хранит огромное количество данных о записях и страницах сайта: информацию о прикреплённых файлах (изображения, документы, видео), данные заполняемых полей при создании или редактировании записей. Некоторые плагины могут добавлять свою собственную информацию в эту таблицу. Например, плагин All in One SEO Pack хранит здесь Title, Description и Keywords.

Таблица wp_postmeta

Таблица wp_posts

Самое ценное — контент — сосредоточено в таблице wp_posts. В ней хранятся сведения об авторе статьи, дата и время публикации, дата и время последнего изменения, непосредственно тексты, статус записи (опубликовано, черновик, на утверждении) и ещё очень много информации.

Таблица wp_posts

Таблица wp_termmeta

Каждый термин (категории, метки и термины пользовательских таксономий) содержит информацию, называемую метаданными, и хранится в этой таблице. Скриншот не прилагаю, так как у меня эта таблица оказалась пустой. Метки и пользовательские таксономии при этом не использую.

Таблица wp_terms

Таблица содержит категории, метки и термины пользовательских таксономий.

Таблица wp_terms

Таблица wp_term_relationships

Сообщения связаны с категориями и метками из таблицы wp_terms и эта связь здесь поддерживается. Ассоциация ссылок на соответствующие категории также хранится в этой таблице.

Таблица wp_term_relationships

Таблица wp_term_taxonomy

В этой таблице описаны таксономии (категории, теги) для записей в таблице wp_terms. Устанавливается очередность и вложенность категорий, которые могут быть родительскими и дочерними, вот таблица wp_term_taxonomy и отслеживает иерархию между ними.

Таблица wp_term_taxonomy

Таблица wp_usermeta

Эта таблица хранит метаданные зарегистрированных пользователей, их персональные настройки и данные профиля, такие как цветовая схема, контактные данные, биография, никнейм и другие.

Таблица wp_usermeta

Таблица wp_users

И, наконец, на очереди последняя таблица — wp_users. Она содержит список зарегистрированных пользователей, их логин и пароль в зашифрованном виде, e-mail адрес, дату регистрации и другие сведения.

Таблица wp_users

Таким вот образом организована структура базы данных WordPress, все таблицы взаимосвязаны между собой, содержат сериализированные массивы, поэтому изменение данных вручную может привести к сбою, помните об этом и соблюдайте осторожность при редактировании.

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(12 голосов, в среднем: 4.7 из 5)
  1. Константин

    Кстати, о зарегистрированных пользователях. Зачем регистрируются боты? Бывают регистрации юзеров типа ufhfjfkjkj. Какая выгода? Ведь обратной ссылки или чего-то подобного они не получают.

    Ответить

  2. Юльчатка

    Константин, возможно, что поработал хрумер. Старые спамилки пытаются пробиться, а не могут. Иногда подобные пользователи несут в своём нике намёк на Яшика или Гугля. Вообще я тоже не до конца понимаю такую регистрацию пользователей.

    Ответить

  3. Webliberty

    Константин, права Юльчатка, боты регистрируются с помощью различных программ. Если у Вас используется регистрация, то рекомендую ее отключить в настройках, пользователи все равно не будут регистрироваться, а так хоть себя обезопасите и от спама избавитесь.

    Ответить

  4. Константин

    Webliberty, да, я теперь отключаю, но самый первый мой блог до сих пор с разрешенной регистрацией — все пытался понять непостижимую логику этого спама)

    Ответить

  5. Маргарита

    Денис, а сколько дискового пространства может занимать сайт, типа моего? Если за 10 месяцев уже использовано 2000 МБ — это нормально?

    Ответить

  6. Webliberty

    Маргарита, ого, ничего себе! Думаю это очень много! У меня за 14 месяцев 365 Мб занято. Знаете что, мне кажется у Вас плагины для создания бэкапов много резервных копий составили, попробуйте последнюю самую свежую сохранить к себе на компьютер, а с хостинга лишние удалить. Да, и сжимайте изображения перед вставкой в записи, а также проверьте не сохраняются ли ревизии.

    Ответить

  7. Маргарита

    Webliberty, спасибо, обрадовали меня! Я так и почувствовала, что это как-то странно. Кое-что почистила, уже лучше. Надо еще с ревизиями разобраться.

    Ответить

  8. Пётр

    Пусть в блогосфере я человек новый, но ламером себя не считаю, а от БД я всё-таки далёк. Она есть и пусть себе будет, нечего её трогать. Как-то пришлось понервничать, когда случайно удалил базу данных через панель управления хостингом. Вот тогда я узнал о её существовании и предназначении. Восстановить удалось, но не сразу. Зато получил опыт, как говорится учатся на ошибках и теперь без надобности туда не лезу.

    Ответить

  9. Webliberty

    Пётр, все верно, если нет особой надобности, то лучше не трогать. А если уж прижмет, то обязательно делать резервные копии, чтобы потом быстренько восстановить.

    Ответить

  10. Александр

    Денис, спасибо. Действительно прекрасная статья. Как раз ищу информацию о том, в какой таблице размещает свои данные плагин All in One SEO Pack. Теперь знаю, в какой таблице он размещает сведения для постов. Никак не могу найти ответ на вопрос относительно того, где он размещает свои общие настройки для всего блога в целом (Ноme Title, Home Deccription и Home Keywords). Эти данные прописываются в настройках плагина, а не под каждым постом. Буду очень признателен за подсказку.

    Ответить

  11. Webliberty

    Александр, все глобальные настройки хранятся в таблице wp_options. Впрочем, чтобы найти нужную строку в этой таблице следует воспользоваться поиском. Скопируйте, к примеру, содержимое поля Home Deccription и выполните поиск этих слов в таблице wp_options — найдете нужную строку.

    Ответить

  12. Григорий

    Здравствуйте, отличная статья. Но у меня проблема, кто подскажет. Установил вордпрес на хосте, а зайти не могу. Вот пишет:

    Вы уже установили WordPress. Для переустановки, пожалуйста, сначала очистите старые таблицы в базе данных. ОШИБКА: Неверное имя пользователя. Забыли пароль?

    Я не знаю как правильно почистить базы. Я несколько раз удалял их и снова ставил. Но ничего не получается. В phpMyAdmin есть сообщение: Дополнительные возможности phpMyAdmin не настроены в полной мере, некоторые функции были отключены. Для определения причины нажмите здесь.

    Там для меня все сложно. Буду благодарен за помощь.

    Ответить

  13. Webliberty

    Григорий, попробуйте не полностью удалить базу данных, а только ее таблицы. Для этого выделите их и удалите. Также проверьте правильность заполнения названия БД, пароля и логина в файле настроек wp-config.php — скорее всего именно в нем проблема.

    Ответить

  14. Яна

    Денис, спасибо Вам в очередной раз за то, что пишете о сложных вещах таким человеческим языком! У меня никогда не работал плагин Subscribe To Comments, и его аналоги тоже не работали — комментарии не приходили на емейл к подписчикам. Мне пришлось поставить Дискус. Я вот думаю, а не в базе ли данных дело? Может быть здесь нужно было какие-то настройки поставить?

    Денис, еще вопрос. У меня в БД есть таблица wp_blc_links. В ней 2,370 записей, а весит аж 1,7 МБ (в то время, когда wp_commentmeta — 1,3 мб) И еще вопрос: таблица wp_comments у меня просто огромная — 9,136 комментария и вес 5,2 мб, что почти равняется таблице с основными постами — 5.8 МБ. Как почистить это все дело?

    Ответить

  15. Webliberty

    Яна, отвечаю на первый вопрос: дело не в БД, просто этот плагин не со всеми темами WP совместим, вот и приходится искать альтернативные варианты наподобие Дискуса.

    По второму вопросу могу ответить так: почистить можно способами, обозначенными в рубрике Оптимизация. Таблица wp_blc_links вероятно берет свое начало от старых версий WP, имеет вот такой своеобразный префикс или же создана каким либо плагином, в стандартной версии WP ее по-умолчанию нет. Думаю лучше ее не трогать не зная предназначение.

    Таблица wp_comments, а точнее ее размер, говорит об одном — у Вас много комментариев на блоге, это повод радоваться 😉

    Ответить

  16. Александр

    Спасибо за полезную информацию, но у меня такой вопрос. Почему в таблице wp-users кроме меня находится ещё куча пользователей, которых я не регистрировал на сайте и не давал им такое разрешение. И как мне их удалить? Если я их «тупо» снесу из таблицы, не повлияет это на работу блога? Заранее спасибо за ответ, буду ждать, с уважением Александр.

    Ответить

  17. Webliberty

    Александр, добрый день! Вам следует для начала проверить настройки, действительно ли регистрация запрещена. На странице Параметры -> Общие в панели управления проверьте пункт Членство — галочка должна быть снята напротив строки «Любой может зарегистрироваться».

    Чтобы удалить лишних пользователей не обязательно лезть в базу данных. В консоли на закладке Пользователи выберите все учетные записи, кроме своей (администратора) и выполните действие Удалить.

    Ответить

  18. Александр

    Webliberty, да у меня раньше была разрешена регистрация, но я её затем отменил. Значит теперь осталось только удалить «лишних». Спасибо за совет, с уважением Александр.

    Ответить

  19. Александр I

    Здравствуйте! Может не в тему, но вопрос о базах данных.

    Как создать на Вордпрессе несколько копий сайта с разными языками пользовательского интерфейса, но чтобы полезный контент у этих сайтов был абсолютно одинаковый. Например, доска объявлений на русском, украинском, белорусском и английском языках, но объявления на всех сайтах общие, независимо от того, с какой языковой версии сайта они были опубликованы. Заранее благодарю за ответ!

    Ответить

  20. Webliberty

    Александр I, здравствуйте, скорее всего вопрос касается не баз данных. Попробуйте воспользоваться плагинами для WP, которые переводят сайт на другие языки. Смотрите в сторону плагина WordPress Multilingual Plugin или ему подобных.

    Ответить

  21. Андрей

    Добрый день! Случилась проблема с паролем к БД. Поэтому нам не пришло в голову ничего лучше — чем удалить файл wp-config.php и заново зайти на сайт. Ну и теперь слетели все загруженные на сайт материалы — физически на сервере они лежат, но сайт их более не видит. Что делать, не подскажете?

    Ответить

  22. Webliberty

    Андрей, добрый вечер! Естественно использовать ранее созданную резервную копию и восстановить сайт. Любой более-менее приличный хостинг автоматически создает бэкапы и хранит их на своих серверах некоторое время.

    Ответить

  23. Александр I

    Я не понял зачем было «сносить» файл ./wp-config.php, тем более, что его можно было просто переименовать.

    С хостингами никогда не сталкивался (если речь идет о хостинге), но если речь идет не о пароле root от базы данных, то никаких проблем с его восстановлением нет. Заходите под root и меняете пароль. Или просите сделать это хостера (не знаю этой системы). А восстановить пароль root от MySQL можно так:

    Останавливаем MySQL:

    /etc/init.d/mysql stop

    Запускаем службу с опцией --skip-grant-tables

    mysqld_safe --skip-grant-tables &

    Подключаемся:

    mysql -u root

    Вводим новый пароль для root, подтверждаем привилегии и выходим:

    mysql> use mysql;
    mysql> update user set password=PASSWORD("новый-пароль-для-root") where User='root';
    mysql> flush privileges;
    mysql> quit

    Перезапускаем MySQL:

    /etc/init.d/mysql restart

    Входим:

    mysql -u root -p

    Все. Для базы данных сайта, конечно должен быть другой пользователь. Дальше — для данного случая — берем из дистрибутива файл wp-config.php и вводим в него наши новые данные. Там где длинное тире — это двойное тире в консоли.

    Ответить

  24. Денис

    В базе данных Вордпресс пользователей меньше, чем зарегистрированных на сайте. Почему?

    Ответить

  25. Webliberty

    Денис, интересный вопрос, по идее все должно сходиться. Разница сильно большая или в разумных пределах? Советую сравнить и выявить «лишних», вдруг это проблема безопасности?

    Ответить

  26. Анатолий

    Добрый день! Не подскажите такой вопрос. В базе данных есть таблица в которой хранится количество комментариев зарегистрированных пользователей? Можно как-нибудь узнать мне (администратору) их количество для каждого пользователя? Просмотрел вроде все таблицы, но нигде не нашёл таких данных. Заранее спасибо!

    Ответить

  27. zmoe

    А не подскажите, как почистить таблицу wp_options она у меня несколько мегабайт и кажется из за нее тормозит один старый сайт? 😮

    Ответить

  28. Webliberty

    Анатолий, в открытом виде такая информация не содержится в базе данных. Предлагаю выполнить SQL-запрос и вывести список всех пользователей (в том числе зарегистрированных) с количеством оставленных ими комментариев:

    SELECT 'comment_author' , COUNT( * ) AS amount
    FROM 'wp_comments' 
    WHERE 'comment_approved' = '1'
    GROUP BY 'comment_author' 
    HAVING amount >0
    ORDER BY amount DESC

    zmoe, раньше я применял для этих целей плагин Clean Options, на данный момент он устарел и больше не поддерживается автором, поэтому лучше не рисковать. Посмотрите как можно почистить БД вручную — в этой статье в качестве примера я рассматривал таблицу wp_postmeta, но описанный способ подойдет и для wp_options.

    Ответить

  29. Валерий

    Добрый день. Скажите, пожалуйста, а где в БД находятся url картинок из библиотеки и как их правильно выгрузить, скажем в Exel?

    Ответить

  30. Webliberty

    Валерий, URL-адреса изображений находятся в таблице wp_postmeta. Чтобы получить список необходимо в phpMyAdmin выполнить поиск точных совпадений _wp_attached_file по базе данных:

    Поиск в базе данных

    Будет найдено несколько соответствий — нажать кнопку Обзор:

    Соответствия в таблице

    Затем остается выбрать результаты поиска и экспортировать в формат CSV для MS Excel, после чего удалить лишние столбцы из таблицы, оставив meta_value. Правда URL будет не полный, а относительно каталога /wp-content/uploads/

    Ответить

  31. Анна

    Спасибо, что разжевали мне этого «страшного зверя» и очень помогли 😎

    Ответить

  32. Надежда Хачатурова

    Webliberty, здравствуйте! Что-то мне в голову пришло, что ссылки на изображения смогу сделать относительными в базе данных. Слышала от кого-то. Не подскажете, как это сделать? Ой, а подписаться на ответ к комментарию невозможно?

    Ответить

  33. Webliberty

    Здравствуйте! Подписаться можно, под кнопкой Ответить нужно отметить флажок.

    Для массовой замены абсолютных ссылок на относительные выполните SQL-запрос к базе данных:

    UPDATE wp_posts
    SET post_content = ( REPLACE (post_content, 'src="http://', 'src="//') )
    WHERE Instr(post_content, 'jpeg') > 0 
    	OR Instr(post_content, 'jpg') > 0 
    	OR Instr(post_content, 'png') > 0;

    Применимо для изображений с расширениями .jpeg, .jpg и .png, дополните самостоятельно строку запроса, если используете иные типы файлов.

    Ответить

  34. Диана

    Подскажите, а как добавить в рабочую базу данных WordPress сайта таблицу wp-posts (контент перенести, около 5000 публикаций)?

    Ответить

  35. Webliberty

    Диана, намного проще воспользоваться встроенным инструментом импорта (в консоли Инструменты — Импорт). Для начала создайте файл экспорта из админки прежнего сайта, а в новом его импортируйте. Возможен импорт записей, страниц, комментариев, произвольных полей, рубрик и меток.

    Вмешательство в базу данных через phpMyAdmin в данном случае может привести к неработоспособности сайта, т.к. будут нарушены связи с другими таблицами.

    Ответить

  36. Елена

    Здравствуйте, познавательная статья, спасибо, что все по полочка разложили, а судя по комментариям Вы действительно знаете о чем пишете. Нужно было срочно найти контент в базе, доступ к домену был закрыт, помогла таблица wp_posts, на других сайтах потратила час и ничего не нашла. Спасибо, Вам коммент оставлять приятно 😉

    Ответить

  37. Альберт

    Webliberty, если спам комментарии — нет повода радоваться 😀

    Ответить

  38. Илья

    Здравствуйте! Спасибо за полезную информацию. База данных WP содержит изображения, которые присутствуют в записях? Из базы данных записи целиком восстановятся? При резервном копировании.

    Ответить

  39. Webliberty

    Илья, база данных не содержит изображений, только их мета-данные. Если резервное копирование сайта было сделано целиком, то у вас кроме базы дополнительно должен быть архив с файлами.

    Ответить

  40. ed

    Добрый день. У меня вопрос. У меня в базе некоторые таблицы «тип» в InnoDB а некоторые MyISAM не понимаю как это произошло но все работает вроде и так. Нужно ли приводить к одному типу к примеру что бы все было InnoDB? И такая же ситуация в «Сравнение» какие то utf8_general_ci какие то latin1_swedish_ci и в utf8mb4_unicode_ci их тоже надо что бы были все одного типа?
    я так понял стандарт: InnoDB и utf8_general_ci (большинство у меня таблиц)

    Ответить

  41. Webliberty

    Скорее всего на вашем сервере обновилась версия MySQL, начиная с версии 5.5 тип InnoDB стал основным хранилищем по умолчанию и поэтому все новые таблицы имеют тип InnoDB. А старые остались без изменений и имеют тип MyISAM. В этом нет ничего страшного.

    Сравнение также могло меняться в зависимости от версии WordPress и устанавливаемых плагинов, которые создают собственные таблицы.

    Можете привести всё к единому виду, ранее я тоже задавался этим вопросом и все таблицы конвертировал в InnoDB, а для таблиц поставил сравнение с utf8mb4_unicode_ci.

    Ответить

  42. Николай

    Здравствуйте! как опубликовать одно изображение к примеру на 100 товаров.(Товары имеют одно фото отличаются только размерами)
    В базе данных это возможно сделать?

    Ответить

  43. Webliberty

    Николай, невозможно. При загрузке изображений мета-данные записываются в разные таблицы и имеют привязку к записи. Правильным будет загрузить изображение в библиотеку медиафайлов к одной записи, а в других записях добавлять это изображение из библиотеки без загрузки нового файла.

    Ответить

  44. Николай

    Webliberty, спасибо!
    Получается нужно делать нудную работу, открыть товар > добавить изображение из библиотеки > сохранить. Ускорить процесс возможно?

    Ответить

  45. Webliberty

    Николай, я не знаю как ускорить 🙄 Речь идёт о товарах — WooCommerce? Попробуйте спросить на форуме поддержки. Но ковыряться в базе данных никто не посоветует.

    Ответить

:) ;) :D :( :cry: :| :o :P 8-) :oops: :roll: :idea:

Отправляя комментарий, вы соглашаетесь с политикой конфиденциальности.