База данных WordPress изнутри

09.08.2007 – 5:32 пп

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

Перед тем, как мы займёмся детальным изучением структуры базы, я хочу обратить Ваше внимание на три следующих момента:

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

2. Структура базы данных WordPress проста и удобна. Бояться нечего. Она состоит всего из 10 таблиц с несколькими полями в каждой. После беглого ознакомления структура останется в Вашей памяти.

3. Структура базы данных WordPress хорошо документирована.

wp_posts

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

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

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

Теперь поговорим о различиях между ними. Чтобы отличить один тип контента от другого, в таблице wp_posts существует поле post_type. Для записей его значение — ‘post’, для страниц — ‘page’, для аттачментов — ‘attachment’.

Сущещствует некоторое количество специальных полей. Например, поле post_mime_type используется для хранения типа файла аттачмента (‘image/jpeg’ и ‘application/pdf’). Поле menu_order содержит порядковый номер отображения страницы в списке. Поле post_parent используется для организации страниц с «подстраницами», а так же для хранения информации о связи аттачмента с записью.

Для того, чтобы понять, как и когда используется то или иное поле, запустите следующие запросы (для каждого типа контента):

* SELECT * FROM wp_posts WHERE post_type = ‘post’ LIMIT 1
* SELECT * FROM wp_posts WHERE post_type = ‘page’ LIMIT 1
* SELECT * FROM wp_posts WHERE post_type = ‘attachment’ LIMIT 1

В этой же таблице находится информация о состоянии записи/страницы. В большинстве случаев Вы увидите ‘publish’ для опубликованных записей, ‘draft’ для черновиков, и ‘inherit’ для аттачментов. С остальными состояниями Вы без проблем разберетесь сами.

Вот несколько примеров того, как может быть использована таблица wp_posts:

* Получение статистики — сколько записей вы всего написали, сколько записей написал тот или иной автор, какое количество записей публикуется в среднем за день и т.д.
* Создать список всех аттачментов.
* Создать галерею картинок для каждой записи (hint: “WHERE post_type = ‘attachment’ AND (post_mime_type = ‘image/jpeg’ OR post_mime_type = ‘image/gif’ OR post_mime_type = ‘image/png’)“).

wp_postmeta

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

Структура этой таблицы очень простая и гибкая. Она имеет всего четыре поля: meta_id, post_id, meta_key и meta_value. meta_id создаётся автоматически, и я не вижу ни одной причины, по которой его нужно было бы менять вручную. post_id соответствует ID записи (в таблице wp_posts), о которой эта мета-информация. meta_key — это краткое описание мета-информации, которую Вы хотите добавить к записи (например ‘mood’ или ’song’). meta_value — это непосредственно значение мета-информации (например «хуевастенько» для ‘mood’).

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

wp_users

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

wp_usermeta

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

wp_comments

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

* comment_ID — уникальный ID для каждого комментария, создаётся автоматически MySQL
* comment_post_ID — уникальный ID записи, к которой комментарий был добавлен
* comment_author — имя автора комментария
* comment_author_email — email автора комментария
* comment_author_url — URL автора комментария
* comment_author_IP — IP-адрес автора комментария
* comment_date — дата и время добавления комментария
* comment_content — текст комментария
* comment_approved — прошёл ли комментарий модерацию и если да, то как
* comment_agent — браузер автора комментария (MSIE, Firefox, Safari и т.д.)
* comment_type — обычный комментария, трэкбэк, пингбэк
* user_id — ID автора, если он зарегистрированный пользователь

Есть еще несколько полей, но они нам вряд ли понадобятся, поэтому мы оставим их описание за кадром.

wp_options

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

В этой таблице есть поле blog_id, но используется оно только в WordPress MU (большая часть кода однопользовательской и многопользовательской инсталляций WordPress совпадают). WordPress MU использует это поле для того, чтобы отличить настройки одного блога от настроек другого.

Поле autoload определяет — загружаются/записываются ли настройки из базы данных/кэша или они доступны только для чтения. Большинство настроек загружаются автоматически.

wp_categories

Таблица wp_categories содержит информацию обо всех категориях, которые Вы создали, это: название и описание категории, ID родительской категории и т.д.

Для ускорения работы WordPress сохраняет некоторую статистику. Например, количество записей и ссылок в категории пересчитывается каждый раз при их добавлении или удалении (поля category_counter и link_count).

wp_post2cat

Связывание записи с категорией осуществляется через таблицу wp_post2cat. Это стандартный подход для связи «многих-со-многими» в реляционных базах данных. wp_post2cat имеет только три поля: уникальный ID (для строки в таблице, создаётся автоматически), уникальный ID записи и ID категории, в которую добавлена запись.

wp_links

Обычно таблица wp_links используется для хранения блогролла, списка ссылок на другие сайты или блоги. Настроек для блогролла огромное количество, поэтому подробно рассматривать эту таблицу мы не будем. Скажу только одно: если Вам вдруг вздумается создать на основе WordPress каталог ссылок, например новый Yahoo!, Вам не придётся много программировать. По сути нужно только будет создать «кустомную» тему.

wp_link2cat

Таблица wp_link2cat практически идентична wp_post2cat, за исключением того, что в ней содержатся ID ссылок вместо ID записей.

[Источник на английском]

Очень вольный перевод — мой.


10 Responses to “База данных WordPress изнутри”

  1. Обсудите эту новость на news2.ru

  2. А чем бэкапить лучше всего? Я нашёл какой-то плагин, но он предлагает мне бэкапы слать по почте, а это по-моему довольно странная идея. :) Хочется просто скидывать раз в сутки всё в файл.

  3. Этот же плагин умеет сливать бэкап прямо на хост (в папку wp-content). в идеале бэкапить стандартными средствами MySQL (из крона).

  4. ну я не утверждал, что это — лучшая вещь для управления контентом :-)

  5. в версии WP 2.3 таблица wp_post2cat отсутствует. Как там категории определяются, я пока что не понял.

  6. упс. спасибо. видимо, некоторые мои плагины с ней работать не будут. поковыряюсь.

  7. >WP вообще одна из лучших CMS для блогосферы, но когда я слышу, что ее называют хорошей вещью для управления контентом, то лучше уж уточнять “контентом на блоге или новостнике”, потому что для обычного сайта она не удобна.

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

  8. Олег:

    Здравствуйте.
    Подскажите пожалуйста «чайнику»: сильно «засоряется» база в процессе постоянного изменения шаблона темы через FTP-клиент. т.е. пока узнал, что можно вносить изменения в тему через админ панель в редакторе, делал все путем удаления изменяемого файла темы с хостинга и заменой его новым (измененным,) и так кажется раз 100 :)) Если «мусора» в базе из за этого много, то как почистить?
    Спасибо.

  9. ИМХО Вордпресс это не CMS как таковая, это именно база под блог(и) для чего либо другого вордпресс не самое лучшее решение.

Прокомментировать