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

Дата: 12.11.2007 | Рубрика: Статьи

 

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 записей.

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

Взято с [delete yourself]

Мой блог находят по следующим фразам


27 комментариев

  • 2008-05-08 в 03:50 Виктор написал:

    Приятная статья, мне даже очень и очень понравилось!
    Попробовал, помогло, спасибо! :)
  • 2008-05-09 в 03:29 Admin написал:

    Не за что, сам пользуюсь.
  • 2008-06-03 в 14:11 Эзотерик написал:

    Спасибо, хорошая статья, редко кто пишет понятно на эту тему. Кучу времени экономит, я как раз хочу использовать базу WordPress для собственной CMS. Сам WordPress хоть и удобный, но тормозной слишком и избыточный, вдобавок под SEO слишком много переделывать приходится.
  • 2008-11-29 в 03:56 webalexan написал:

    у меня вопросик. Если я использую 2 блога на одной базе данных и делаю бэкап базы через панель одного блога, то бэкап произойдет у обоих блогов или только у одного?
  • 2008-12-05 в 11:12 yAnTar написал:

    У вас информация застарелая, сейчас таких таблиц, как
    wp_post2cat и wp_link2cat в вордпрессе нет
  • 2008-12-05 в 11:32 Admin написал:

    Этот пост был написан год назад, когда о версиях 2.5, 2.6 и 2.7 ещё и не слыхали.
  • 2008-12-05 в 12:19 yAnTar написал:

    Понятно, просто гугл ваш сайт дает в выдаче по поиску структура базы данных wordpressa.
  • 2008-12-05 в 13:15 yAnTar написал:

    Всюду, где не искал струкутур базы вордпресса - дает только старую структуру (ниже версии 2.3).
  • 2008-12-05 в 13:26 Admin написал:

    А на офсайте чего не поискал ?
    http://codex.wordpress.org/Database_Description/2.5
  • 2008-12-05 в 13:59 yAnTar написал:

    2 Admin
    Это я видел, я искал именно графическую интепретацию.
    Посидел минут 20 - добавлял посты, категории, теги - сам разобрался полностью.
  • 2009-02-28 в 15:02 Gagen написал:

    А почему Вы не описали таблицы:
    wp_terms
    wp_term_relationships
    wp_term_taxonomy
  • 2009-03-01 в 04:39 Admin написал:

    Вы посмотрите на дату поста ... тогда таких таблиц не было.
  • 2009-04-23 в 07:01 serg написал:

    Привет!
    Ищу плагин для автоматического удаления старых постов через определенное время после их публикования скажем через месяц. Может кто-то видел такой?
  • 2009-04-23 в 07:46 Admin написал:

    Есть такой плагин : http://wordpress.org/extend/plugins/auto-delete-posts/
  • 2009-04-23 в 18:11 serg написал:

    О! Спасибо!
    Буду смотреть.
  • 2009-04-24 в 06:08 serg написал:

    Да это то что я искал
    еще раз спасибо!
  • 2009-04-24 в 11:16 serg написал:

    А что за плагин у Вас стоит - вместо com-rus.com показывает ссылку
    http://wp-skins.info/goto/com-rus.com ? Вообще что это дает?
  • 2009-04-24 в 11:56 Admin написал:

    Этот плагин делает из внешних ссылок внутренние (для СЕО).
    Плагин можно скачать тут: http://jehy.ru/wp-plugins.en.html
  • 2009-06-02 в 15:14 Diplomat написал:

    Народ, помогите думаю как реализовать, нужно чтоб 2 домена использовали одну базу. Но в этой базе прописаны url на посты и картинки. Соответсвенно для одного домена нужно на лету менять эти значения с site1.com на site2.com
  • 2009-06-02 в 15:26 illusions написал:

    Используй замену
    $content = str_replace('site1.com', 'site2.com', $content)

    Или если там сложнее - то тогда регулярные выражения.
  • 2009-06-02 в 15:32 Admin написал:

    Нифига Вы так его не обманете, урлы в контенте подменяться будут, а вот сайт грузиться не будет.
    Он привязывается через урл к плагинам, блогу и т.п.
    Так что там завязка сильная, я недавно сайт с одного домена на другой переносил - запарился в БД урлы менять.
  • 2009-06-02 в 15:55 Diplomat написал:

    Вроде нашел что-то http://live2hack.info/2007/12/11/neskolko-domenov-odin-wordpress/#more-54
  • 2009-06-02 в 16:24 Admin написал:

    Да и правда реальный плагин позволяет так сделать, вот пример :
    http://mcaleavy.org/code/domain-mirror/
    http://lightpainting.org/code/domain-mirror/
    Только объясните мне, зачем это нужно ?
  • 2009-06-02 в 16:30 Diplomat написал:

    Ну как зачем, сайт с одним именем в нескольких зонах например
  • 2009-06-02 в 16:40 Admin написал:

    И что Вы достигнете таким образом ? Бан поисковиков ?
    Сейчас, имхо, при индексации поисковикам все равно в какой зоне у Вас сайт.
  • 2010-06-24 в 01:46 Жизнь-Путешествие написал:

    Может подскажете...

    Блог на вордпрессе. Была страница с адресом http:/site.ru/111/post
    Поменял название категорию и стал адрес http:/site.ru/222/post

    Старый адрес в индексе, а новый нет. Причем если зайти по старому адресу то страница открывается, как будто она есть.

    Отсюда вопросы
    1. Это вордпресс где-то у себя хранит старые адреса страниц и поэтому они существуют? Если да, то как можно почистить.
    2. Как новую страницу загнать в индекс, а старую убрать?
  • 2011-06-25 в 02:43 mailar написал:

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

Уважаемые дамы и господа, если у Вас возникли вопросы относительно функционирования тем или плагинов, прошу задавать вопросы на форуме.

Оставить комментарий