Статьи

Понимание и работа с отношениями между данными в WordPress

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

Как вы увидите, WordPress использует три типа взаимосвязи данных – один-к-одному, один-ко-многим и многие-ко-многим. Я посмотрю на каждый из них и что они значат для вашего сайта WordPress.

Отношение «один к одному» – это самое простое отношение из всех – оно просто означает, что одна запись связана только с другой. Подобные данные обычно хранятся в одной таблице (хотя и не всегда, как мы увидим позже в этом уроке).

Примеры личных отношений в WordPress:

  • разместить идентификатор и опубликовать содержание
  • заголовок и содержание сообщения
  • сообщение ID и сообщение слаг
  • ID комментария и содержание комментария
  • идентификатор пользователя и имя пользователя

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

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

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

В WordPress большинство отношений «один ко многим» создаются путем связи между двумя таблицами базы данных с использованием уникального идентификатора для объединения этих двух. Так, например, запись post_id будет уникальной для каждого сообщения, хранящегося в таблице wp_posts , но также будет использоваться в таблице wp_comments для определения того, к какому сообщению был wp_comments каждый комментарий. Это означает, что каждое значение post_id будет появляться только один раз в таблице wp_posts но может появляться несколько раз – или не появляться вообще – в таблице wp_comments .

Некоторые другие примеры в WordPress включают в себя:

  • сообщения и метаданные
  • посты и пользователи
  • пользователи и метаданные пользователей
  • таксономии и условия таксономии

Опять же, список можно продолжить. Поскольку это важная тема в WordPress, давайте посмотрим на отношения «один ко многим» более подробно.

Таблица, которая связана с большинством других таблиц, является таблицей wp_posts , и большинство связей, которые создают эти соединения, являются отношениями «один ко многим».

Как видно из диаграммы ниже, таблица wp_posts связана с четырьмя другими таблицами:

В дополнение к этому сообщения могут также иметь отношение один ко многим с другими сообщениями в форме вложений или родительских страниц.

Давайте посмотрим на эти отношения более подробно.

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

Вложение, сохраненное в таблице wp_posts будет иметь запись в поле post_parent , которая будет идентификатором сообщения, к которому прикреплено вложение (с извинениями за повторение!). Это отношение один ко многим, потому что у каждого вложения будет только один родитель, а у каждого сообщения может быть много вложений. Это будет применяться, даже если вы использовали Media Manager для добавления вложения к другому сообщению – только сообщение, к которому оно было первоначально добавлено, будет сохранено в базе данных как его родитель.

Сообщения также могут иметь отношение один ко многим с другими сообщениями, если одна страница указана в качестве родительской для другой. Запись хранится на дочерней странице в поле post_parent – снова это будет post_id родительской страницы. Это отношение один ко многим, потому что родительские страницы могут иметь много дочерних страниц, но у дочерних страниц будет только одна родительская страница.

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

Почтовые метаданные хранятся в собственной таблице wp_postmeta . Эта таблица содержит только четыре поля – для post_id , meta_id , ключа и значения. С одним сообщением может быть связано много элементов метаданных публикации, но каждая запись метаданных публикации будет связана только с одним сообщением.

Комментарии также имеют свою собственную таблицу wp_comments . Каждый комментарий будет относиться только к одному сообщению, в то время как каждое сообщение может иметь несколько комментариев к нему. Как и во всех других таблицах, связанных с wp_posts , поле post_id используется для ссылки (в поле comment_post_id в wp_comments ).

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

Комментарии также имеют свои собственные метаданные, хранящиеся в другой таблице, к которой я скоро вернусь.

Каждый пост прикрепляется к таблице wp_users через запись user_id , которая хранится в поле wp_posts в wp_posts . Это отношение один ко многим, потому что у каждого сообщения есть только один автор, но каждый пользователь может быть автором нескольких сообщений.

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

Есть также три отношения, которые один-ко-многим и не включают посты. Два из них включают метаданные – связь между комментариями и их метаданными, а также пользователями и их метаданными.

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

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

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

Последнее отношение один ко многим – между комментариями и пользователями. Таблица wp_comments содержит поле user_id , которое можно использовать для хранения идентификатора пользователя, когда зарегистрированный пользователь оставил комментарий. Обратите внимание, что это поле не является обязательным для тех сайтов, где пользователям не нужно заходить, чтобы оставлять комментарии.

Последний тип отношений с базой данных – это отношение один-ко-многим, где ссылка «многие» идет в обе стороны. Это используется только один раз в WordPress для терминов таксономии (включая категории и теги, так как это просто таксономии). Одному сообщению может быть присвоено несколько терминов, а одному термину – несколько сообщений.

WordPress создает эту связь таким же образом, как и любая другая база данных с базой данных manay-to-many: с помощью промежуточной таблицы, связывающей две таблицы с ключевыми данными. Это таблица wp_term_relationships , которая связывает таблицу wp_term_taxonomy таблицей wp_term_taxonomy .

Примечание. Эта таблица также связывает таблицу wp_links таблицей wp_term_taxonomy , так как ссылки ведут себя так же, как и посты – я скоро перейду к ссылкам.

Это легче всего объяснить, посмотрев сначала на две отдаленные таблицы. Таблица wp_posts содержит данные о каждом сообщении, а таблица wp_term_taxonomy содержит данные о каждом термине, включая таксономию, в которой он находится, и его идентификатор.

Чтобы создать ссылку между термином в таблице wp_term_taxonomy и публикацией в таблице wp_posts , WordPress создает запись в таблице wp_term_relationships , которая включает post_id и term_id (сохраненные как object_id и term_taxonomy_id соответственно в таблице wp_term_relationships ). Это означает, что таблица wp_term_relationships может включать несколько записей для каждого сообщения и несколько записей для каждого термина, создавая отношение «многие ко многим».

Диаграмма ниже показывает, как это работает:

В приведенном выше примере сообщения имеют следующие условия:
  • пост 1 имеет условия 1 и 3
  • пост 2 имеет срок 2
  • пост 3 имеет срок 4
  • пост 4 имеет условия 1 и 3

Вы также можете взглянуть на это иначе – например, термин 3 относится к постам 1 и 4.

Однако на этом все не заканчивается. Существует четвертая таблица, таблица wp_terms . Это содержит данные о каждом термине, а именно имя, слаг и описание для каждого термина. Каждый член имеет только одну запись в таблице wp_terms , поэтому связь между ним и таблицей wp_term_taxonomy фактически однозначная. Теоретически, нет причин, по которым эти данные не могут быть wp_term_taxonomy таблице wp_term_taxonomy , но это не так.

Ссылки, или блог, это особенность WordPress, которая гораздо менее заметна, чем когда-то. На самом деле, начиная с версии 3.5 ссылки были отключены в админке по умолчанию; однако у них есть своя собственная таблица: таблица wp_links .

Это очень похоже на таблицу wp_posts . В конце концов, ссылки являются типом контента, очень похожим на посты) и имеют те же отношения «многие ко многим» с терминами таксономии.

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

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

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