Работа с базой данных word

Содержание

  • Вариант 1: Microsoft Office 2007 – 2021
    • Шаг 1: Подготовка данных таблицы Microsoft Excel
    • Шаг 2: Подготовка шаблона документа Microsoft Word
    • Шаг 3: Добавление поля слияния на страницу
    • Шаг 4: Проверка результатов
    • Шаг 5: Завершение слияния
  • Вариант 2: Microsoft Office 2003
  • Вопросы и ответы

как сделать слияние word и excel

Вариант 1: Microsoft Office 2007 – 2021

Посредством функции слияния в Microsoft Word можно поместить данные, взятые из внешнего файла Excel, в определенные места документа. Это удобно применять для массовой рассылки электронной почты или при печати шаблонных материалов, отличия между которыми всего в нескольких местах. При редактировании исходной таблицы информация на странице документа будет изменяться динамически.

Если целью слияния является перенос данных из Excel в такую же таблицу, только в Microsoft Word, рекомендуем воспользоваться специальной вставкой со связью, что значительно облегчит выполнение поставленной задачи. На нашем сайте в отдельной статье есть подробное описание этой операции.

Подробнее: Как перенести таблицу из Microsoft Excel в Word со связью

как сделать слияние word и excel_01

Важно! Все рассмотренные далее действия будут выполняться на примере программного обеспечения Microsoft Office 2016. По этой причине могут наблюдаться некоторые отличия в интерфейсе в сравнении с другими версиями текстового редактора. Но руководство все равно является актуальными, а серьезные отличия будут помечаться.

Шаг 1: Подготовка данных таблицы Microsoft Excel

Первостепенно необходимо подготовить исходные данные в таблице Microsoft Excel, чтобы их можно было корректно интегрировать в документ Word. Для этого следует избавиться от всех объединенных ячеек, информация должна находиться в каждом столбце отдельно, в противном случае во время слияния будут возникать проблемы. При необходимости обратитесь за помощью к другой нашей статье, в которой подробно описана процедура разъединения ячеек.

Подробнее: Как разъединить ячейки в Microsoft Excel

как сделать слияние word и excel_02

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

Подробнее: Как сделать заголовок столбцов в Microsoft Excel

как сделать слияние word и excel_03

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

Подробнее: Как создать умную таблицу в Microsoft Excel

как сделать слияние word и excel_04

Lumpics.ru

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

Шаг 2: Подготовка шаблона документа Microsoft Word

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

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

как сделать слияние word и excel_05

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

Читайте также:
Как убрать красное / синее / зеленое подчеркивание текста в Microsoft Word
Как пропустить все ошибки в документе Microsoft Word

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

  1. Откройте меню «Файл», кликнув по одноименной вкладке в Microsoft Word 2013 – 2021 или нажав по иконке в верхнем левом углу в Microsoft Word 2007 – 2010.
  2. как сделать слияние word и excel_06

  3. На боковой панели слева щелкните по пункту «Параметры», чтобы открыть окно настроек программы.
  4. как сделать слияние word и excel_07

  5. Воспользовавшись навигационной панелью в левой части интерфейса, перейдите в раздел «Дополнительно» и в блоке «Показать содержимое документа» из выпадающего меню «Затенение полей» выберите значение «Всегда». После этого нажмите по кнопке «ОК», чтобы сохранить изменения.
  6. как сделать слияние word и excel_08

    На этом предварительная настройка документов считается завершенной, можно переходить непосредственно к слиянию Microsoft Word и базы данных Excel.

Шаг 3: Добавление поля слияния на страницу

Все инструменты для выполнения слияния находятся на вкладке «Рассылки». На данном этапе выполнения поставленной задачи важны только два блока инструментов — «Начало слияния» и «Составление документа и вставка полей».

как сделать слияние word и excel_09

Процедура слияния подразумевает добавление на страницу документа полей с соответствующей информацией, которая будет браться из заранее подготовленной таблицы Microsoft Excel. Для этого необходимо сделать следующее:

  1. Раскройте выпадающий список «Начать слияние», который находится в блоке «Начало слияния». Затем кликните в нем по предпочитаемому шаблону. В качестве примера будет выбран пункт «Письма», но работа с другими практически ничем не отличается.
    как сделать слияние word и excel_10

    Примечание! Если в выпадающем меню выбрать «Конверты» или «Наклейки», появится дополнительное диалоговое окно, в котором потребуется задать начальные параметры. Каждое действие сопровождается текстовой подсказкой, поэтому проблем возникнуть не должно. В остальном слияние выполняется описанным ниже способом.

  2. как сделать слияние word и excel_11

  3. Раскройте выпадающее меню «Выбрать получателей», которое расположено в том же блоке чуть ниже. В нем нажмите по опции «Использовать существующий список». Это позволит определить в качестве базы данных с исходными значениями заранее созданную таблицу Microsoft Excel.
  4. как сделать слияние word и excel_12

  5. В появившемся окне файлового менеджера перейдите в директорию, где находится таблица с данными, выделите ее щелчком левой кнопки мыши и нажмите «Открыть».
  6. как сделать слияние word и excel_13

  7. Если файл Excel содержит несколько листов с информацией, выберите необходимый и кликните по кнопке «ОК». Обратите также внимание на пункт «Первая строка данных содержит заголовки столбцов», если этот параметр соответствует действительности, установите отметку напротив него.
    как сделать слияние word и excel_14

    Обратите внимание! Если базу данных с исходными значениями необходимо будет сменить в будущем, воспользуйтесь опцией в блоке «Начало слияния», которая называется «Изменить список получателей». При ее вызове откроется файловый менеджер, в котором потребуется выбрать новую таблицу Excel.

  8. как сделать слияние word и excel_15

  9. Установите курсор в то место документа, куда необходимо вставить информацию, взятую из таблицы. Для этого раскройте в блоке «Составление документа и вставка полей» выпадающий список меню «Вставить поле слияния» и выберите нужный столбец данных. В качестве примера будет добавлено поле «Номер».
  10. как сделать слияние word и excel_16

  11. Аналогичным образом добавьте оставшиеся поля, каждый раз устанавливая курсор в нужное место и выбирая из выпадающего списка соответствующий параметр.
  12. как сделать слияние word и excel_17

Примечание! Оставшиеся инструменты в блоке «Составление документа и вставка полей» в практическом применении не нуждаются, они служат для автоматизации некоторых процессов при работе с большим объемом данных. Например, с помощью инструмента «Правила» можно задать некоторые условия вставки определенных полей, а вызвав диалоговое окно «Подбор полей» — заранее настроить дополнительные поля, чтобы быстро вставлять их посредством других опций.

как сделать слияние word и excel_18

Шаг 4: Проверка результатов

После добавления полей слияния на страницу документа информация из таблицы Excel отображаться в них не будет, из-за чего не получится визуально определить корректность подстановочных данных. Для этого необходимо воспользоваться другим инструментом вкладки «Рассылки», который так и называется — «Просмотр результатов».

как сделать слияние word и excel_19

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

как сделать слияние word и excel_20

Если необходимо проверить заполнение полей определенного получателя, следует воспользоваться диалоговым окном «Найти получателя». Кликните по нему и в появившемся меню введите в поле «Найти» информацию из любого столбца таблицы Excel. Затем определите область поиска. Чтобы повысить точность при обработке большого объема данных, установите переключатель в положение «по полю» и из выпадающего списка выберите непосредственно нужное поле. Затем кликните по кнопке «Найти далее».

как сделать слияние word и excel_21

Оставшийся инструмент в блоке «Просмотр результатов» необходим для поиска ошибок, которые могут возникнуть из-за наличия объединенных ячеек в таблице Excel или несоответствия форматирования некоторых полей. Текстовый процессор Word автоматически вычисляет все ошибки и составляет соответствующий отчет. Для этого кликните по кнопке «Поиск ошибок» и в появившемся диалоговом окне определите тип проверки, после чего нажмите по кнопке «ОК».

как сделать слияние word и excel_022

Шаг 5: Завершение слияния

После добавления всех необходимых полей на страницу документа и проверки корректности их отображения можно переходить непосредственно к массовой рассылке или печати. Все необходимые для этого инструменты расположены на вкладке «Рассылки» в блоке «Завершение».

как сделать слияние word и excel_23

Открыв выпадающий список пункта «Найти и объединить», можно увидеть три опции:

  1. «Изменить отдельные документы». Позволяет выбрать один документ для редактирования и дальнейшего применения (печати или рассылки). Для этого необходимо будет в блоке «Просмотр результатов» определить нужного получателя, затем установить отметку на пункте «текущую запись» и кликнуть по кнопке «ОК». Если выбрать несколько документов или все, они сольются воедино.
  2. как сделать слияние word и excel_24

  3. «Печать документов». Открывает подобное диалоговое окно, в котором необходимо выбрать количество записей и нажать по кнопке «ОК». В дальнейшем откроется стандартное окно для печати документов.
    как сделать слияние word и excel_25

    На нашем сайте есть отдельная статья, в которой подробно описан процесс настройки печати. Если выполнение этой процедуры вызывает трудности, ознакомьтесь с изложенным там материалом.

    Подробнее: Как настроить печать документов в Microsoft Word

  4. как сделать слияние word и excel_26

  5. «Отправить электронные сообщения». Предоставляет диалоговое окно для настройки рассылки. Для корректной работы требуется, чтобы в базе данных Excel был отдельный столбец с перечнем адресов электронной почты каждого получателя, иначе этой функцией воспользоваться не получится.
  6. как сделать слияние word и excel_27

Вариант 2: Microsoft Office 2003

В отличие от Microsoft Word 2007 – 2021 в версии 2003 года все ранее описанные действия выполняются иначе. Обусловлено это кардинально отличающимся интерфейсом программы. Но стоит отметить, что этапы выполнения поставленной задачи остаются неизменными. По этой причине ниже будет пропущена часть о подготовке базы данных в таблице Microsoft Excel и создании шаблона в текстовом редакторе. Также описание каждой функции будет кратким, так как полное уже приводилось выше в статье.

Примечание! Microsoft Word 2003 не имеет совместимости с новейшим форматом XSLX, поэтому, чтобы выполнить слияние, базу данных в Excel необходимо сохранять в формате XLS.

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

  1. Раскройте меню «Сервис», находящийся в верхней части интерфейса окна, и наведите курсор на пункт «Письма и рассылки», затем кликните по опции «Слияние».
  2. как сделать слияние word и excel_28

  3. В появившейся панели Мастера, расположенной в правой части окна, выберите из списка тип документа и щелкните «Далее. Открытие документа». Как и в примере ранее, сейчас будет выбран шаблон «Письма».
  4. как сделать слияние word и excel_29

  5. Определите документ, на основе которого будет осуществляться рассылка. Если шаблон создавался в текущем, выберите соответствующий пункт и нажмите «Далее. Выбор типа документа».
  6. как сделать слияние word и excel_30

  7. Возьмите в качестве исходного списка получателей заранее созданную таблицу Microsoft Excel. Для этого установите курсор в положение «Использование списка» и кликните по ссылке «Обзор», находящейся чуть ниже.
  8. как сделать слияние word и excel_31

  9. В новом окне файлового менеджера перейдите в директорию с нужным документом, выделите его и щелкните по кнопке «Открыть».
  10. как сделать слияние word и excel_32

  11. По аналогии с ранее рассмотренными версиями текстового процессора выберите лист книги с нужной информацией, установите при необходимости отметку напротив пункта «Первая строка данных содержит заголовки столбцов» и нажмите «ОК».
  12. как сделать слияние word и excel_33

  13. Поставьте отметки напротив тех строк списка, информация из которых необходима для создания слияния. В нижней части этого диалогового окна есть кнопки с дополнительными функциями. Посредством них можно сразу снять или добавить выделения на все пункты, выполнить поиск или замену. После завершения этой процедуры нажмите «ОК».
  14. как сделать слияние word и excel_34

  15. Вернувшись в главное окно текстового редактора, кликните по пункту «Далее. Создание писем», расположенном на панели мастера.
  16. как сделать слияние word и excel_35

  17. Установите курсор на странице документа в то место, куда будет вставлено поле, затем щелкните по строке «Другие элементы».
  18. как сделать слияние word и excel_36

  19. В новом окне поставьте переключатель в положение «Поля базы данных», выделите в списке нужное поле и кликните по кнопке «Вставить». Проследите за тем, чтобы на странице документа появилась соответствующая надпись.
  20. как сделать слияние word и excel_37

  21. Закройте окно, установите курсор в новое положение, а затем снова кликните по пункту «Другие элементы» и вставьте новое поле. Таким образом добавьте все необходимые элементы на страницу. После этого щелкните «Далее. Просмотр писем».
  22. как сделать слияние word и excel_38

  23. Воспользовавшись предложенными инструментами на панели Мастера, просмотрите все экземпляры документов и выявите неточности, впоследствии исправив их. Также с помощью кнопки «Исключить получателя» можно убрать лишние дубликаты. После завершения этой процедуры кликните по пункту «Далее. Завершение слияния».
  24. как сделать слияние word и excel_39

  25. Завершите слияние, нажав по строке «Печать». После этого откроется новое диалоговое окно, в котором останется выбрать количество печатаемых экземпляров. Также можно отдельно изменить часть писем, воспользовавшись соответствующей опцией на панели Мастера.
  26. как сделать слияние word и excel_40

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

Использование слияния для отправки данных Access в Word

Access для Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Еще…Меньше

Слияние — отличный способ заработать в Access. В этом видео показано, как создать типичную букву формы в Microsoft Word, начав с команды «Объединить в Word» Access. При этом ознакомьтесь с основными действиями, которые приведены ниже.

Примечание: Это видео было записано с помощью Access 2013, но основные действия применяются к Access 2010, Access 2016 и версии Access, которая распространяется по подписке.

Ваш браузер не поддерживает видео.

В этом видео

Вот как можно создать слияние почты Word в Access:

  1. Откройте базу данных Access с адресами, которые вы хотите объединить с Word.

  2. Если не открыта области навигации, нажмите F11, чтобы открыть ее.

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

  4. На вкладке «Внешние данные» в группе «Экспорт» нажмите кнопку «Слияние Word».

  5. Откроется диалоговое окно мастера слияния Microsoft Word.

    Выберите, чтобы связать данные с существующим документом Word или создать новый.

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

  7. Нажмите кнопку ОК.

Word запускает и отображает вкладку «Рассылки» и области «Слияние».

  1. Для работы с мастером щелкните ссылки «Далее» и «Предыдущее» в нижней части области слияния.

  2. На шаге 3 мастера выбирать список получателей не нужно. Это было определено, когда вы выбрали его в Access. Однако вы можете настроить список, нажав кнопку «Изменить список получателей». В открываемом окне можно удалить отдельных получателей из слияния, применить фильтры, отсортировать список и так далее.

  3. На шаге 4 мастера напишите письмо (если вы не работаете с существующим документом).

  4. Поместите курсор в документе в то место, где должны отображаться данные адреса, и щелкните «Блок адреса», «Строка приветствия» или «Другие элементы» на области слияния, чтобы вставить данные Access в документ. В появившись полях выберите нужный формат и нажмите кнопку «Подбор полей», чтобы убедиться в правильном совпадении полей.

  5. На шаге 5 мастера нажмите кнопки «Далее» (>>) и «Назад» (<<) для предварительного просмотра того, как будут выглядеть объединенные данные при печати документа.

  6. На шаге 6 мастера нажмите кнопку «Печать» и выберите нужные параметры печати.

  7. Сохраните и закроем документ Word.

    Примечания: 

    • Если после завершения работы мастера вам потребуется вернуться и настроить какие-либо параметры слияния, все операции доступны на вкладке «Рассылки» в Word.

    • При внесении изменений в оформление базы данных Access может потребоваться изменить некоторые параметры слияния в Word, чтобы снова правильно сработать слияние.

    • Мастер слияния предназначен для работы с данными адресов рассылки. Однако с помощью функции слияния можно объединять в Word данные любого типа, например записи о запасах, задачи или другие данные, хранимые в Access.

Дополнительные сведения о функции слияния в Word см. в указанных здесь статьях.

  • Персонализация документов с помощью слияния

  • Создание наклеев с помощью слияния

  • Слияние электронной почты в Word

Нужна дополнительная помощь?

Создание источника данных Word

На панели слияния щелкнуть на кнопке диалогового окна Слияние. Выбрать Источник данных, щелкнуть по кнопке Получить данные и выбрать Создать источник данных. В открывшемся окне путем ввода новых названий в раздел «Поле» (кнопка Добавить) или удаления (кнопка Удалить) ненужных полей из готового списка Поля в строке заголовка создается структура базы данных (название полей для записей). Порядок следования названий полей можно изменять, используя стрелки кнопки Порядок. Созданную структуру источника данных следует сохранить на диске, а затем заполнить данными, вводя значения в соответствующие поля. Переход между полями осуществляется щелчком мыши или клавишей . По окончании ввода всей записи нужно нажать кнопку Добавить. При нажатии кнопки Источник база данных показывается на экране в виде таблицы. В дальнейшем базу данных можно редактировать, используя кнопку Правка источника данных.

Добавлять комментарии могут только зарегистрированные пользователи.

Регистрация Вход

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

        Но если составление списка литературы так важно, неужели в Word нет инструмента, который делает этот процесс проще? Конечно есть. Однако, знает про него немного людей, а умеют им пользоваться еще меньше. Именно поэтому в этой статье мы вам расскажем, как правильно составить список источников с помощью готовых инструментов Word.

Представим, что мы пишем статью.

как сделать источник данных в word

Выделенное предложение было взято из другой книги. Укажем, из какой именно. Вот, как это делается:

1. Помещаем курсор в конец фрагмента.

как сделать источник данных в word

2. Во вкладке «Ссылки» нажимаем на иконку «Вставить ссылку». Выбираем команду «Добавить новый источник».

как сделать источник данных в word

3. Открывается окно, в котором мы можем создать новый источник.

как сделать источник данных в word

4. Для начала выберем его тип. Это может быть книга, статья, материалы конференции и многое другое.

как сделать источник данных в word

Это может быть книга, статья, материалы конференции и многое другое.

5. Далее заполняем остальные поля:

как сделать источник данных в word

Обратите внимание, что фамилию и инициалы нужно разделять запятой.

•   Если книгу писало несколько человек, то мы можем поставить галочку напротив слов «Корпоративный автор»  и указать всех авторов.

•   Если вам нужно указать больше сведений – поставьте галочку вот здесь . Дополнительные поля тут же отобразятся.

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

как сделать источник данных в word

7. Повторяете весь процесс для каждого источника, который у вас есть.

Когда все книги добавлены, создаем список литературы.

1. Ставите курсор в нужном месте и нажимаете на иконку «Список литературы».

как сделать источник данных в word

2. Выбираете, как назвать библиографию: «Список литературы», «Ссылки», или «Цитируемые труды». Нажимаете на нужный вариант.

3. В документе тут же появляется список литературы.

как сделать источник данных в word

Заметьте, все источники в нем уже расположены в алфавитном порядке и отформатированы по стандарту. Кстати, выбрать его вы можете самостоятельно тут:

как сделать источник данных в word

Итак, теперь вы знаете, что c помощью Word в документ можно добавлять источники и создавать на их основе список литературы. Это очень удобные инструменты, так как они позволяет не только добавить источники и собрать ссылки, но и расположить их по порядку, а также отформатировать их в соответствии с указанным стилем.

Автор заметки:

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

  1. Определяем тип создаваемого документа. Вкладка «Рассылки»→группа «Начать слияние»→»Начать слияние»→»Письма»;
  2. В той же группе «Выбрать получателей»→»Использовать существующий список…» и укажите путь к файлу базы данных;
  3. Вводим постоянную часть текста. В нужных местах вставляем соотвествующие поля базы данных (группа «Составление документа и вставка полей»→»Вставить поле слияния»);
  4. Если нужно поставить условие, например для изменения обращения в зависимости от пола, то выбираем «Правила»→IF…THEN…ELSE после чего заполнить поля, как на рисунке:
  5. Как вы видите, поля отличаются от обычного текста. Чтобы увидеть результат слияния, нажмите кнопку «Просмотр результатов». Поле со стрелочками справа от кнопки, позволяет просмотреть результат слияния для разных записей базы данных;
  6. На этом процесс создания писем заканчивается. Все письма можно сохранить в виде одного документа (группа «Завершить»→»Найти и объединить»→»Изменить отдельные документы…»), («Найти и объединить»→»Печать документов…») или отослать по электронной почте («Найти и объединить»→»Отправить электронные сообщения…»). В случае отправки по электронной почте, адрес тоже нужно указывать из поля базы данных.

Файлы с примерами можно скачать:

После скачивания, при попытке открыть файл будет запрошено разрешени на соединение с базой данных. При этом придётся указать новый путь к базе данных. Пошаговый процесс для Word 2007 показан на рисунке

Позволяет производить любые операции с базой данных WordPress: вставлять, обновлять, получать или удалять данные.

WordPress предоставляет возможность удобно манипулировать своей базой данных за счет php класса wpdb.

PHP класс — относится к ООП (объектно-ориентированному программированию) и в традиционном своем понимании представляет собой полностью самодостаточный код, который должен выполнять определенную функцию. Например, в этом случае через класс wpdb мы может производить всевозможные операции с Базой Данных WordPress зная всего несколько «рычагов» управления классом, которые называются методами.

Обращаться к методам класса wpdb нужно обязательно через глобальную переменную $wpdb (это экземпляр класса wpdb). Также нужно помнить, что внутри обычных функций нужно обязательно глобализировать $wpdb, иначе она будет простой переменной внутри функции, делается это так:

global $wpdb;

C помощью методов $wpdb можно управлять произвольными таблицами в базе данных, не обязательно только теми, которые были созданы WordPress. Допустим, среди прочих таблиц WP, есть таблица newtable и нам нужно выбрать все поля id из нее. Реализовать это можно таким SQL запросом используя $wpdb:

$newtable = $wpdb->get_results( "SELECT id FROM newtable" );

Создавать свои таблицы рекомендуется с помощью функции dbDelta(). Или можно использовать обычный SQL запрос и метод $wpdb->query(‘CREATE TABLE …’);.

Для плагинов создание новых таблиц обычно вешается на хук активации плагина, см. register_activation_hook().

Создание отдельного подключения к базе данных

Нужно понимать, что один объект класса wpdb{} работает с одной БД — с текущей базой данных WordPress. Если нужно работать параллельно с какой-либо другой БД, то нужно создать еще один объект класса wpdb с указанием новых параметров соединения, отличных от тех что указаны в wp-config.php. Делается это так:

global $wpdb2;

$wpdb2 = new wpdb( 'имя_юзера', 'пароль', 'название_БД', 'localhost' );

// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if( ! empty($wpdb2->error) )
	wp_die( $wpdb2->error );

// Готово, теперь используем функции класса wpdb
$results = $wpdb2->get_results( "SELECT * FROM table" );

Для сложных соединений с несколькими БД (репликами), есть хороший плагин, который рекомендуют разработчики WP — hyperdb. Этот плагин расширяет возможности базового класса wpdb. Устанавливается он не как обычный плагин и требует определенных знаний работы с базами данных (в противном случае, толку от этого плагина не будет).

Хуки из класса

Возвращает

Экземпляр класса wpdb.

Использвоание

global $wpdb;

$result = $wpdb->query( "UPDATE ..." );

Примеры

#1 Демонстрация использования методов класса

global $wpdb;

$done = $wpdb->query( "UPDATE ..." );

// get data

$objects = $wpdb->get_results( "SELECT ..." );

$object = $wpdb->get_row( "SELECT ..." );

$values = $wpdb->get_col( "SELECT ..." );

$var = $wpdb->get_var( "SELECT ..." );

$var = $wpdb->get_var( "SELECT ..." );

// CRUD data

$done = $wpdb->insert( 'table', [ 'column' => 'foo', 'field' => 'bar' ] );

$done = $wpdb->update( 'table', [ 'column' => $_GET['val'] ], [ 'ID' => 1 ] );

$done = $wpdb->delete( 'table', [ 'ID' => 1 ] );

$done = $wpdb->replace( 'table_name', [ 'ID' => 1, 'column' => $_GET['val'] ] );

query — произвольный запрос к Базе Данных WordPress

Build In Post

Выполняет любые запросы к базе данных WordPress.

Этот метод подразумевает выполнение всех запросов кроме SELECT. Для SELECT есть специальные методы: $wpdb->get_results, $wpdb->get_row, $wpdb->get_col, $wpdb->get_var.

Имейте ввиду, что как и для всех функций класса wpdb, передаваемые параметры нужно очистить от SQL инъекций, сделать это можно двумя способами:

// способ 1
esc_sql( $user_entered_data_string )

// способ 2
$wpdb->prepare(  'query' , value_parameter[, value_parameter ... ] )

Подробнее читайте в секции «Защита запросов от SQL инъекций»

Возвращает

int|true|false.

  • true — для запросов CREATE, ALTER, TRUNCATE, DROP.
  • Число — задействованных строк, для запросов: DELETE/UPDATE/SELECT.
  • false — когда запрос вызвал ошибку.

Использование

global $wpdb;
$wpdb->query( $query );
$query(строка) (обязательный)
Database query.

Примеры

#1 Удалить произвольное поле ‘gargle’ и его значение у поста 13

$wpdb->query( "DELETE FROM $wpdb->postmeta WHERE post_id = '13' AND meta_key = 'gargle'" );

#2 Установить родительскую страницу 7 для страницы 15

$wpdb->query( "UPDATE $wpdb->posts SET post_parent = 7 WHERE ID = 15 AND post_status = 'static'" );

#3 Удалить осиротевшие произвольные поля

$wpdb->query("DELETE pm FROM $wpdb->postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL");

#4 Изменим ключ у полей-повторителей ACF

$wpdb->query( "
	UPDATE $wpdb->postmeta
	SET meta_key = REPLACE(meta_key, 'knowledge-base-type', 'knowledge-base-list')
	WHERE `meta_key` LIKE '%knowledge-base-type%'
" );

get_var — получение определенной ячейки таблицы

Build In Post

Получает значение одной ячейки из результата запроса. По умолчанию берется первая ячейка — это первая колонка и первая строка.

Если результат запроса содержит больше одной колонки и/или больше одной строки, то будет возвращено значение указанной ячейки (указывается во 2 и 3 параметрах). Так, чтобы получить значение второй ячейки из второй строки результата запроса, нужно указать второй и третий параметры: $column_offset = 1, $row_offset = 1.

Если вызывать метод без запроса: $query = null, то вернется значение указанной ячейки из предыдущего запроса.

Возвращает

Строку|null. Значение ячейки таблицы базы данных в виде строки.

  • значение ячейки — если запрос получает значение одной ячейки (колонки в строке).
  • значение первой ячейки первой колонки — если запрос получает одну строку и несколько колонок.
  • значение первой ячейки первой строки и колонки — если запрос получает несколько строк и колонок.
  • NULL — когда результата нет.

Использование

$wpdb->get_var( 'query', $column_offset, $row_offset );
query(строка/null)
Запрос который нужно выполнить. Можно установить этот параметр в значение null, тогда функция вернет результат последнего запроса, который был выполнен классом (сохранился в переменной).
column_offset(число)
Нужная колонка (отступ по колонкам). по умолчанию 0 — первая колонка.
row_offset(число)
Нужная строка (отступ по строкам). по умолчанию 0 — первая строка.

Примеры

#1 Выведем на экран количество пользователей

$user_count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users;" );
echo '<p>Количество пользователей равно: ' . $user_count . '</p>';

#2 Выведем на экран сумму значений определенных произвольных полей

// определяем произвольный ключ, который нужно посчитать
$meta_key = 'miles';
$allmiles = $wpdb->get_var($wpdb->prepare(
	"SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key
));
echo '<p>Общее количество произвольных полей miles: '.$allmiles . '</p>';

#3 Набор выводов статистики блога

# Общее Количество авторов блога
function get_totalauthors() {
	global $wpdb;
	$totalauthors = intval( $wpdb->get_var(
		"
		SELECT COUNT(ID) FROM $wpdb->users
		LEFT JOIN $wpdb->usermeta ON $wpdb->usermeta.user_id = $wpdb->users.ID
		WHERE $wpdb->users.user_activation_key = '' AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}user_level' AND (meta_value+0.00) > 1
		"
	) );

	return $totalauthors;
}

# Общее Количество постов
function get_totalposts(){
	global $wpdb;
	$totalposts = intval( $wpdb->get_var(
		"SELECT COUNT(ID) FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish'"
	) );

	return $totalposts;
}

# Общее Количество страниц
function get_totalpages() {
	global $wpdb;
	$totalpages = intval( $wpdb->get_var(
		"SELECT COUNT(ID) FROM $wpdb->posts WHERE post_type = 'page' AND post_status = 'publish'"
	));

	return $totalpages;
}

# Общее Количество комментариев
function get_totalcomments() {
	global $wpdb;
	$totalcomments = intval( $wpdb->get_var(
		"SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = '1'"
	));

	return $totalcomments;
}

# Общее Количество комментаторов
function get_totalcommentposters() {
	global $wpdb;
	$totalcommentposters = intval($wpdb->get_var(
		"SELECT COUNT(DISTINCT comment_author) FROM $wpdb->comments WHERE comment_approved = '1' AND comment_type = ''"
	));

	return $totalcommentposters;
}

# Общее Количество ссылок
function get_totallinks() {
	global $wpdb;
	$totallinks = intval( $wpdb->get_var("SELECT COUNT(link_id) FROM $wpdb->links") );

	return $totallinks;
}

get_row — выбор строки таблицы

Build In Post

Получает первую строку из результата SQL запроса. Возвращает строку в виде объекта.

Используйте параметр $row_offset, чтобы получить вторую, третью, …, n-ю строку из запроса.

Возвращает

Массив|Объект|null|null.

  • object — при $output_type = OBJECT (по умолчанию).
  • array — при $output_type = ARRAY_A или ARRAY_N.
  • null — когда не удалось получить данные (запрашиваемых данных нет в бд).

Использование

$wpdb->get_row( $query, $output_type, $row_offset );
$query(строка)
Запрос который нужно выполнить.
$output_type(константа)

Одна из трех констант. Может быть:

  • OBJECT — результат будет возвращен в виде объекта (по умолчанию).
  • ARRAY_A — результат будет возвращен в виде ассоциативного массива.
  • ARRAY_N — результат будет возвращен в виде пронумерованного массива.
    По умолчанию OBJECT
$row_offset(число)
Номер возвращаемой строки результата запроса.
По умолчанию 0 (первая строка)

Примеры

#1 Получим всю информацию о ссылке 10

$mylink = $wpdb->get_row( "SELECT * FROM $wpdb->links WHERE link_id = 10" );

// Теперь, свойства (переменные) $mylink - это названия
//колонок из таблицы $wpdb->links со значениями полей таблицы:
echo $mylink->link_id; // выведет на экран "10"

#2 С использованием константы:

$mylink = $wpdb->get_row( "SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A );

// результатом будет ассоциативный массив
echo $mylink['link_id']; // выведет на экран "10"

или

$mylink = $wpdb->get_row( "SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N );

// результатом будет пронумерованный массив
echo $mylink[1]; // выведет на экран"10"

get_col — выбор столбца таблицы

Build In Post

Делает запрос и получает данные одной колонки таблицы базы данных в виде массива.

Если запрос вернул больше чем одну колонку (столбец), то функция вернет только данные первого столбца. Можно указать отступ в параметре $column_offset, чтобы получить данные не первого столбца, а например второго: $column_offset = 1.

Если указать $query = null, то функция вернет указанную колонку из предыдущего запроса. Используя это свойство можно получить данные других колонок из уже сделанного запроса.

Возвращает

Массив. Индексный массив с данными запроса. Пустой массив, когда не удалось получить данные.

Использование

global $wpdb;
$wpdb->get_col( $query, $x );
$query(строка/null)
Запрос который нужно выполнить. Можно установить этот параметр в значение null, тогда функция вернет результат последнего запроса.
По умолчанию: NULL (предыдущий запрос)
$x(число)
Индекс колонки данные которой нужно вернуть.
По умолчанию: 0 (первая колонка)

Примеры

#1 Пример того как работает метод и что возвращает

Допустим у нас есть такой запрос на получение всех ревизий:

// укажем в запросе одно поле
$revision_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type = 'revision'" );

// укажем в запросе все поля
$revision_ids = $wpdb->get_col( "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'" );

/*
В обоих случаях вернется одинаковый массив.
Когда указываются все поля, get_col получает только первое - это ID

Array(
	[0] => 106
	[1] => 101
	[2] => 102
	[3] => 103
	...
)
*/

#2 Использование без указания $query параметра

// сначала сделаем запрос
$wpdb->query( "SELECT * FROM $wpdb->posts WHERE post_type = 'revision' LIMIT 10" );

// теперь получим данные этого запроса
$revision_ids = $wpdb->get_col( null );
$revision_names = $wpdb->get_col( null, 5 ); // 5 - post_title

/*
Array
(
	[0] => 9949
	[1] => 9957
	[2] => 10125
	[3] => 10154
	[4] => 10221
	[5] => 10235
	[6] => 10319
	[7] => 10496
	[8] => 10532
	[9] => 10568
)
Array
(
	[0] => wp_tempnam
	[1] => Шаблоны страницы для типов записей в WP 4.7
	[2] => Политика конфиденциальности
	[3] => walker_nav_menu_start_el
	[4] => Вывод пагинации
	[5] => enter_title_here
	[6] => Smart Custom Fields - простой плагин метаполей
	[7] => register_post_type
	[8] => О сайте
	[9] => REST API в WordPress
)
*/

#3 NULL вместо пустой строки

Этот метод возвращает NULL в качестве значения поля, если в значении пустая строка (проверял на версии WP 5.1.1). Но если нам нужно получить оригинальные данные (пустую строку), можно использовать такую замену get_col():

$wpdb->query( "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'" );

$ids = wp_list_pluck( $wpdb->last_result, 'ID' );

#4 Выбор столбца из результатов запроса

Для этого примера представим, что у нас блог об автомобилях. Каждый пост описывает какой-либо автомобиль (например, Ford Mustang 1969 года). Для каждого поста предусмотрено по 3 произвольных поля: manufacturer (производитель), model(модель) и year(год выпуска). Этот пример выведет на экран заголовки постов, отфильтрованных по производителю (ford) и отсортированных по модели и году.

get_col здесь используется для того, чтобы получить массив ID всех записей, удовлетворяющих определенным критериям и отсортированных в нужном порядке. Затем через цикл foreach мы выводим заголовки по имеющимся у нас ID:

<?php
$meta_key1 = 'model';
$meta_key2 = 'year';
$meta_key3 = 'manufacturer';
$meta_key3_value = 'Ford';

$postids = $wpdb->get_col($wpdb->prepare("
SELECT      key3.post_id
FROM        $wpdb->postmeta key3
INNER JOIN  $wpdb->postmeta key1
			on key1.post_id = key3.post_id
			and key1.meta_key = %s
INNER JOIN  $wpdb->postmeta key2
			on key2.post_id = key3.post_id
			and key2.meta_key = %s
WHERE       key3.meta_key = %s
			and key3.meta_value = %s
ORDER BY    key1.meta_value, key2.meta_value",$meta_key1, $meta_key2, $meta_key3, $meta_key3_value));

if ($postids) {
  echo 'List of ' . $meta_key3_value . '(s), sorted by ' . $meta_key1 . ', ' . $meta_key2;
  foreach( $postids as $id ){
	$post = get_post(intval($id));
	setup_postdata($post);
	?>
	<p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
	<?php
  }
}

#5 Список постов которые имеют определенное произвольное поле (Color)

Но отсортированы они по значению другого произвольного поля (Display_Order).

$meta_key1 = 'Color';
$meta_key2 = 'Display_Order';

$postids = $wpdb->get_col($wpdb->prepare("
SELECT      key1.post_id
FROM        $wpdb->postmeta key1
INNER JOIN  $wpdb->postmeta key2
			on key2.post_id = key1.post_id
			and key2.meta_key = %s
WHERE       key1.meta_key = %s
ORDER BY    key2.meta_value+(0) ASC",
		 $meta_key2,$meta_key1));

if ($postids) {
  echo 'List of '. $meta_key1  . ' posts, sorted by ' . $meta_key2 ;
  foreach ($postids as $id) {
	$post=get_post(intval($id));
	setup_postdata($post);?>
	<p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
	<?php
  }
}

get_results — выбор нескольких строк таблицы

Build In Post

Получает все данные указанного запроса (все строки и колонки). Результат возвращается в виде массива. Каждый элемент массива это объект с данными отдельной строки таблицы.

Возвращает

Массив|Объект|null. Результат запроса к базе данных. Вернет:

  • Массив объектов — когда $output = OBJECT или OBJECT_K.
  • Массив массивов — когда $output = ARRAY_A или ARRAY_N.
  • array() — когда строк по запросу не найдено или ошибка запроса.
  • NULL — когда запрос пустая строка или передан неправильный тип вывода ($output_type).

Использование

global $wpdb;
$wpdb->get_results( $query, $output );
$query(строка)

Запрос который нужно выполнить.

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

По умолчанию: null

$output(константа/строка)

Флаг указывающий в каком виде нужно вернуть данные. Возможны 4 варианта:

  • OBJECT — вернет массив объектов с числовыми ключами — элементы массива будут объекты строк таблицы — [ 0 => object ].
  • OBJECT_K — похож на предыдущий, только в индексах главного массива будут значения первой колонки результата запроса — [ 'field' => object ].
    Обратите внимание, если в индекс будут попадать одинаковые значения, то данные будут затираться.
  • ARRAY_N — вернет индексный массив, каждый элемент которого будет так же индексным массивом — [ 0 => [...] ].
  • ARRAY_A — вернет индексный массив, каждый элемент которого будет ассоциативным массивом, в котором ключом будет название колонки — [ 'field' => [...] ].

По умолчанию: OBJECT

Примеры

#1 Получим ID и заголовки черновиков, ID автора которых равен 5 и выведем на экран заголовки постов.

$fivesdrafts = $wpdb->get_results( "SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5" );

foreach ( $fivesdrafts as $fivesdraft ) {
	echo $fivesdraft->post_title;
}

#2 Пример сложного запроса с GROUP BY (отзывов в WooCommerce)

/**
* Возвращает результаты рейтинга (отзывов в WooCommerce) сгрупированный по оценкам
*
* @param int $post_id идентификатор поста
*
* @return array массив объектов, где каждый объект - сгрупированные данные по одной из оценок
*/
function get_cnt_rating_reviews_one_product( $post_id ){
	global $wpdb;

	return $wpdb->get_results( $wpdb->prepare(
		"
		SELECT COUNT(meta.meta_id) as num, meta.meta_value
		FROM $wpdb->comments as comments
		INNER JOIN $wpdb->commentmeta as meta ON comments.comment_ID = meta.comment_id
		WHERE comments.comment_post_ID = %d AND meta_key = 'rating'
		GROUP BY meta.meta_value;
		",
		$post_id
	) );

}

// использование
get_cnt_rating_reviews_one_product( 4350 );

#3 Обработка ошибок

Вот как можно перехватывать ошибки из get_results():

global $wpdb;
$result = $wpdb->get_results( "SELECT * FROM invalid query" );

if ( $wpdb->last_error ) {
  echo 'wpdb error: ' . $wpdb->last_error;
}

#4 Выведем на экран ссылки на черновики автора с ID = 5

<?php
$fivesdrafts = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5");
if( $fivesdrafts ) :
	foreach( $fivesdrafts as $post ){
		setup_postdata($post);
		?>
			<h2><a href="<?php the_permalink(); ?>" rel="bookmark"
				title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
		<?php
	}
else :
?>
	<h2> Не найдено</h2>
<?php endif; ?>

insert — вставка новой записи (строки) в таблицу

Build In Post

Вставляет строку (указанные данные) в указанную таблицу.

Метод очищает переданные данные и защищает от SQL инъекций, поэтому данные могут быть «грязные» (неочищенные), например: $_GET['foo'].

После добавления данных созданное значение AUTO_INCREMENT можно получить в переменной: $wpdb->insert_id.

Возвращает

int|false.

  • число — число вставленных строк.
  • false — если данные не были вставлены в таблицу.

ВНИМАНИЕ! Вернет false (без каких либо ошибок), когда передаваемая для вставки строка (значение ячейки) длинее максимально возможного. Например колонка varchar(10) (длина значения 10 символов), а в переданных данных для вставки указана строка с 11 или более символами.

Поймать такой баг очень сложно! Поэтому надо иметь это ввиду, когда все вроде бы должно работать (правильные данные передается), но wpdb::insert() возвращает false без каких-либо ошибок.

Такая проблема касается почти всех методов, это:
wpdb::replace()
wpdb::insert()
wpdb::update()
wpdb::delete()

Использование

global $wpdb;
$wpdb->insert( $table, $data, $format );
$table(строка) (обязательный)
Название таблицы в которую будем вставлять данные.
$data(массив)

Данные которые нужно вставить. Каждый элемент массива выглядит так: [ 'колонка таблицы' => 'значение' ].

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

Передаваемые данные НЕ должны быть очищены: esc_sql().

$format(массив/строка)

Массив форматов данных которые будут ассоциированы с указанными значениями в параметре $data. Если указана строка, то она (формат) будет ассоциирован со всеми данными. При указании формата, WordPress переводит переданные данные в указанный формат перед тем, как сохранить данные. Возможные форматы:

  • %s — строка
  • %d — целое число
  • %f — дробное число

Если не указать, то для всех значений $data будет указан формат строка, если иное не указано в свойстве wpdb::$field_types.
По умолчанию: null

Примеры

#1 Вставим строку в таблицу БД

// вставка строки с указанием значений для двух полей (значения для остальных полей будут дефолтные)
$wpdb->insert( 'table', [ 'column' => 'foo', 'field' => 'bar' ] );

// с указанием типов данных
$wpdb->insert( 'table', [ 'column' => 'foo', 'field' => 1337 ], [ '%s', '%d' ] );

#2 Получение идентификатора вставленного объекта

Чтобы получить его, используйте $wpdb->insert_id:

global $wpdb;

$table = $wpdb->prefix . 'my_table_name';
$data = [ 'column1' => 'data one', 'column2' => 123 ];

$wpdb->insert( $table, $data );

$my_id = $wpdb->insert_id;

update — обновление записи (строки) в таблице

Build In Post

Обновляет указанные данные в указанной строке таблицы.

Метод включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo'].

НЕ вставляет данные если их нет в БД — только обновляет существующие данные.

Возвращает

int|false.

  • число — сколько строк было обработано
  • 0 — запрос был выполнен корректно, но ни одна строка не была обработана. Если в БД уже есть данные и вы пытаетесь обновить, указав точно такие же данные, то wpdb::update() вернет 0.
  • false — запрос провалился или ошибка запроса.

Так как возвращается 0, если никакие поля не были обновлены (изменены), но запрос был выполнен корректно, проверку результата запроса на ошибку нужно делать с учетом типа возвращаемых данных $res === false.

Использование

global $wpdb;
$wpdb->update( $table, $data, $where, $format, $where_format );
$table(строка) (обязательный)
Название таблицы, данные в которой нужно обновить.
$data(массив) (обязательный)

Данные, которые нужно обновить в формате [ 'название колонки' => 'новое значение' ].

Если в значении указать NULL, то в значение будет установлено в NULL, соответствующий формат при этом игнорируется.

$where(массив) (обязательный)
Ассоциированный массив с условием выборки строк таблицы данные в которых нужно обновить (SQL WHERE). Формат массива: [ 'название колонки' => 'чему равно' ]. Если указать несколько элементов в массиве, то указанные условия будут объедены через AND — т.е. должны будут совпасть все условия, а НЕ какое-либо одно. Если в значении указать NULL то в запросе получим сравнение IS NULL, соответствующий формат при этом игнорируется.
$format(массив/строка)

Массив форматов данных которые будут ассоциированы с указанными значениями в параметре $data. Если указана строка, то она (формат) будет ассоциирован со всеми данными. При указании формата, WordPress переводит переданные данные в указанный формат перед созданием запроса. Возможные форматы:

  • %s — строка
  • %d — целое число
  • %f — дробное число

Если не указать, то для всех значений $data будет указан формат строка, если иное не указано в свойстве wpdb::$field_types.
По умолчанию: null

$where_format(массив/строка)
Тоже самое что и $format, только для $where данных.
По умолчанию: null

Примеры

#1 Обновим строку ID которой равен 1

Значение первой колонки строка, значение второй колонки число:

$wpdb->update( 'table',
	[ 'column1' => 'value1', 'column2' => $_GET['val'] ],
	[ 'ID' => 1 ]
);

#2 Тоже самое с указанием типов передаваемых данных

$wpdb->update( 'table',
	[ 'column1' => 'value1', 'column2' => $_GET['val'] ],
	[ 'ID' => 1 ],
	[ '%s', '%d' ],
	[ '%d' ]
);
$wpdb->update( 'table', [ 'column' => 'foo', 'field' => 'bar' ], [ 'ID' => 1 ] );
$wpdb->update( 'table', [ 'column' => 'foo', 'field' => 1337 ], [ 'ID' => 1 ], [ '%s', '%d' ], [ '%d' ] );

replace — замена строки

Build In Post

Обновляет или создает строку в таблице.

Если строка с указанным ключом PRIMARY KEY уже есть все остальные указанные поля будут обновлены у строки. Если такой строки в таблице еще нет, то функция вставит (insert) новую строку.

После вставки, ID созданный для колонки AUTO_INCREMENT можно получить в свойстве $wpdb->insert_id.

Метод включает защиту от SQL инъекций. Т.е. можно передавать неочищенные данные, например из параметров запроса: $_GET['foo'].

Для вставки новой строки необязательно указывать поле с авто-инкрементом. Например, у нас есть таблица с полем id (AUTO_INCREMENT). Можно указать значения всех полей кроме id и строка будет добавлена в таблицу.

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

Например, PRIMARY KEY состоит из двух колонок ID и type: PRIMARY KEY (ID,type). Тогда для замены существующей строки в параметре $data нужно указать значение этих двух колонок. Если например указать ID и не указать type, то существующая строка не будет найдена и будет создана новая строка с указанным ID и дефолтным значением type.

Если длина строки в параметре $data больше чем допускается в ячейке таблицы MySQL, вставка провалиться и функция вернет false. При этом в свойство $wpdb->last_error сообщение об ошибке НЕ будет записано! Впрочем это же касается и других методов wpdb.

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

Всегда заменяются все поля таблицы. Например, если у таблицы есть поля primary, one, two, three, а мы указали в параметре $data только primary, one, то поля two и three получат дефолтные значения, даже если там уже были данные.

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

Возвращает

int|false. Число (кол-во обработанных строк), 0 или false.

  • число — сколько строк было обработано (удалено или вставлено). Если была замена (обновление), то для каждой обновленной строки вернется +2 (удаление и вставка). Если была просто вставка, то для каждой вставленной строки вернется +1.
  • 0 — запрос был выполнен корректно, но ни одна строка не была обработана.
  • false — запрос провалился — ошибка запроса. Или когда невозможно заменить или создать новую строку в таблице.

Вернет количество затронутых строк — это сумма вставленных и удаленных строк. Если вернулось 1 при замене одной строки — это значит что одна строка была вставлена и ни одна не была удалена. Если число больше 1 — это значит, что одна или больше строк были удалены перед вставкой новой строки.

Использование

global $wpdb;
$wpdb->replace( $table, $data, $format );
$table(строка) (обязательный)
Название таблицы, в которой нужно заменить данные.
$data(массив) (обязательный)

Данные, которые нужно заменить/вставить в формате [ 'название колонки' => 'новое значение' ].

Если в значении указать NULL, то в значение будет установлено в NULL, соответствующий формат при этом игнорируется.

$format(массив/строка)

Массив форматов данных которые будут ассоциированы с указанными значениями в параметре $data. Если указана строка, то она (формат) будет ассоциирован со всеми данными. При указании формата, WordPress переводит переданные данные в указанный формат перед созданием запроса. Возможные форматы:

  • %s — строка
  • %d — целое число
  • %f — дробное число

Если не указать, то для всех значений $data будет указан формат строка, если иное не указано в свойстве wpdb::$field_types.
По умолчанию: null

Примеры

#1 Заменим строку с главным ключом ID = 1

(подразумевается что таблица состоит из трех колонок ID, column1, column2).

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

$wpdb->replace( 'table_name', [
	'ID'      => 1,
	'column1' => 'value1',
	'column2' => 123
] );

#2 Укажем форматы

$wpdb->replace( 
	'table_name', 
	[ 'column' => 'foo', 'field' => 1337 ], 
	[ '%s', '%d' ] 
);

delete — удаление строки из таблицы

Build In Post

Удаляет строки из таблицы по условию указанному в параметре $where.

Включает защиту от SQL инъекций, это значит что можно передавать неочищенные данные, например: $_GET['foo']

Возвращает

int|false. Число удаленных строк или 0, если ничего не удалено. false возвращается при ошибке запроса.

Использование

global $wpdb;
$wpdb->delete( $table, $where, $where_format );
$table(строка) (обязательный)
Название таблицы.
$where(массив) (обязательный)
Массив условий, по которым будут выбираться строки для удаления в формате [ 'название колонки' => 'чему равно' ]. Несколько условий будут объеденные через AND. Если в значении указать NULL то в запросе получим сравнение IS NULL, соответствующий формат при этом игнорируется.
$where_format(массив/строка)

Массив форматов данных которые будут ассоциированы с указанными значениями в параметре $where. Если указана строка, то она (формат) будет ассоциирован со всеми данными. При указании формата, WordPress переводит переданные данные в указанный формат перед созданием запроса. Возможные форматы:

  • %s — строка
  • %d — целое число
  • %f — дробное число

Если не указать, то для всех значений $data будет указан формат строка, если иное не указано в свойстве wpdb::$field_types.
По умолчанию: null

Примеры

#1 Пример удаления данных из БД

// Удалим строку с полем ID=1 из таблицы table
$wpdb->delete( 'table', [ 'ID' => 1 ] );

// Укажем формат значения $where
$wpdb->delete( 'table', [ 'ID'=>'1' ], [ '%d' ] ); // 1 будет обработано как число (%d).

prepare — защита запроса от SQL инъекций

Build In Post

Позволяет писать SQL запрос с очисткой передаваемых в него параметров.

В строке запроса вместо передаваемого параметра нужно использовать плейсхолдер:

  • %d (integer)
  • %f (float)
  • %s (string)

Также для каждого из плейсхолдеров указывается PHP переменная, которая заменит плейсхолдер. При замене переменная будет очищена. Синтаксис похожий на sprintf().

С WP 3.5 обязательно должны быть переданы минимум 2 параметра: запрос и значение переменной, иначе будет php ошибка (User Notice).

Кавычки для плейсхолдеров %s и '%s'.

Плейсхолдеры могут быть в кавычках или без них: WHERE field = %s или WHERE field = '%s'. Кавычки принято не ставить.

echo $wpdb->prepare( "foo = %s", 'a' );   // foo = 'a'
echo $wpdb->prepare( "foo = '%s'", 'a' ); // foo = 'a'
Параметр для каждого плейсхолдера.

Параметр должен быть указан для каждого плейсхолдера.

echo $wpdb->prepare( 'foo = %s AND bar = %s', 'a' );
echo $wpdb->prepare( 'foo = %1$s AND bar = %1$s', 'a' );
// в обоих случаях увидим ошибку:
// User Notice: wpdb::prepare was called incorrectly.
// The query does not contain the correct number of placeholders (2)
// for the number of arguments passed (1).
Порядковые плейсхолдеры %1$s.

Для совместимости со старыми версиями: порядковые плейсхолдеры (например, %1$s, %5s) обрабатываются иначе — им не добавляются кавычки, поэтому они должны быть снабжены правильными кавычками в строке запроса.

echo $wpdb->prepare( 'foo = %1$s', 'a"a' );   // foo = a"a
echo $wpdb->prepare( 'foo = "%1$s"', 'a"a' ); // foo = "a"a"
echo $wpdb->prepare( 'foo = %1s', 'a"a' );    // foo = a"a
echo $wpdb->prepare( 'foo = %s', 'a"a' );     // foo = 'a"a'
Знак %

Знак % в строке запроса, который не относится к плейсхолдеру нужно записывать так %%.

echo $wpdb->prepare( "%foo AND id = %d", 2 ); // User Notice: wpdb::prepare was called incorrectly.
echo $wpdb->prepare( "%%foo AND id = %d", 2 ); // %foo AND id = 2
% в LIKE синтаксисе

Подстановочные знаки процента % в LIKE синтаксисе должны указываться через параметр подстановки содержащий полную LIKE строку, а не напрямую в запросе. Также смотрите wpdb::esc_like().

$like = '%'. $wpdb->esc_like( "bar's" ) .'%end';
echo $wpdb->prepare( "foo LIKE %s", $like ); // foo LIKE '{a0d1d}bar's{a0d1d}end'

SQL инъекция

В SQL есть такое понятие как «инъекция» (внедрение в запрос SQL кода). Cделать его можно, когда в запрос передаются динамические данные. Например, в запрос передаётся значение input поля, в это поле можно указать данные, которые в итоге станут частью SQL запроса. Так можно внедриться в запрос и что-нибудь испортить или просто нарушить код самого запроса. Выглядит это так:

$sql = "SELECT * FROM table WHERE id = '$var'";

Теперь, если var = 2' AND id = (DROP TABLE table2) то в результате запрос получиться такой:

SELECT * FROM table WHERE id = '2' AND id = (DROP TABLE table2)

Таким образом можно внедриться в сам запрос и изменить его. Чтобы этого не произошло запросы с передаваемыми в них переменными нужно обрабатывать методом prepare():

$sql = $wpdb->prepare( "SELECT * FROM table WHERE id = %s", $var );

esc_sql()

Кроме метода $wpdb->prepare() запрос можно очистить функцией esc_sql(). Но «prepare» предпочтительнее, потому что исправляет некоторые ошибки форматирования.

$name   = esc_sql( $name );
$status = esc_sql( $status );

$wpdb->get_var( "SELECT something FROM table WHERE foo = '$name' and status = '$status'" );

ВАЖНО! После esc_sql() очищенную строку можно использовать только внутри кавычек '' или "". Т.е. правильно писать field = '$value', а не field = $value, где $value = esc_sql( $value );

Возвращает

Строку|null. Sanitized query string, if there is a query to prepare.

Использование

global $wpdb;
$wpdb->prepare( $query, ...$args );
$query(строка) (обязательный)

Строка запроса. В нем можно использовать заменители:

  • %d — число
  • %s — строка
  • %f — дробное число (число с плавающей точкой, с версии 3.3).
…$args(строка/число/массив)

Переменные, которые будут использованы для замены плейсхолдеров %s %d %f в строке запроса.

Эти переменные можно указать через запятую (как дополнительные параметры функции) или в массиве:

  • $wpdb->prepare( 'query', $param1, $param2 )
  • $wpdb->prepare( 'query', [ $param1, $param2 ] ).

Примеры

#1 Демонстрация работы

$wpdb->prepare(
	"SELECT * FROM `table` WHERE `column` = %s AND `field` = %d OR `other_field` LIKE %s",
	[ 'foo', 1337, '%bar' ]
);

$wpdb->prepare(
	"SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo'
);

#2 Добавим произвольное поле к посту 10

Из примера видно, что с prepare() нет необходимости заботиться об экранировании кавычек и прочего, что может навредить запросу.

$metakey   = "'крах' БД";
$metavalue = "WordPress может 'сломать' Базу Данных если не экранировать запрос.";

$wpdb->query(
	$wpdb->prepare(
		"INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )",
		10,
		$metakey,
		$metavalue
  )
);

#3 Передача параметров в виде массива

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

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

$metakey = "'крах' БД";
$metavalue = "WordPress может 'сломать' Базу Данных если не экранировать запрос.";

$wpdb->query(
	$wpdb->prepare(
		"INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )",
		array(
			10,
			$metakey,
			$metavalue
		)
  )
);

#4 Очистка значений для WHERE IN условия

Это полезно в случаях, когда у вас есть массив значений, который нужно передать в IN условие запроса. Кол-во элементов массива может быть разное, поэтому заполнители нужно создавать динамически:

$in_values = [ 'one', 'two' ];

$in_pholders = implode( ',', array_fill( 0, count( $in_values ), '%s' ) );

$sql = $wpdb->prepare( 
	"SELECT $wpdb->posts WHERE post_type = %s WHERE post_name IN ( $in_pholders )",
	[ 'page', ...$in_values ]
);

echo $sql; 

// SELECT wp_posts WHERE post_type = 'page' WHERE post_name IN ( 'one','two' )

esc_like — очистка LIKE строки

Build In Post

Подготавливает строку для использования в LIKE части SQL запроса. Обрабатывает спецсимволы % и _.

Пример:

$wild = '%';
$find = 'only 43% of planets';
$like = $wild . $wpdb->esc_like( $find ) . $wild;
$sql  = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE %s", $like );

Пример цепочки вызовов:

$sql = esc_sql( $wpdb->esc_like( $input ) );

Не защищает от SQL инъекций. Для такой защиты результат нужно дополнительно обработать одной из функций: wpdb::prepare() или esc_sql().

Возвращает

Строку. Текст для LIKE части запроса. Результат не очищен для SQL запроса, поэтому используйте wpdb::prepare() или wpdb::_real_escape() для добавления результата в запрос.

Использование

global $wpdb;
$wpdb->esc_like( $text );
$text(строка) (обязательный)
Необработанный текст, спец-символы в котором нужно экранировать для LIKE строки. Строка не должна иметь дополнительных или удаленных слэшей.

Примеры

#1 Пример подготовки строки для LIKE запроса

$wild = '%';
$find = 'only 43% of planets';
$like = $wild . $wpdb->esc_like( $find ) . $wild;
$sql  = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE %s", $like );

echo $sql; // SELECT * FROM wp_posts WHERE post_content LIKE '{d710cab}only 43{d710cab} of planets{d710cab}'

#2 Пример с esc_sql()

$esc_like = $wpdb->esc_like( 'only 43% of planets' );
echo $esc_like;                                        // only 43% of planets
echo esc_sql( $esc_like );                             // only 43{f5fa52} of planets

#3 Еще пример подготовки строки для LIKE запроса

global $wpdb;
$link = $wpdb->esc_like( $link ); // подготовим строку для LIKE аргумента
$link = esc_sql( $link );         // очистим переменную
$link = '%' . $link . '%';        // создадим полную переменную поиска LIKE

// найдем комментарии в тексте или ссылке автора, есть указанная ссылка
$spammy = $wpdb->query("SELECT comment_approved FROM $wpdb->comments
	WHERE (comment_content LIKE '$link' OR comment_author_url LIKE '$link')
		AND comment_approved = 'spam'
	LIMIT 1;"
);

#4 Короткая запись с prepare()

global $wpdb;

$link = '%' . $wpdb->esc_like( $link ) . '%';

$comment = $wpdb->get_row( $wpdb->prepare(
	"SELECT * FROM $wpdb->comments WHERE comment_author_url LIKE %s LIMIT 1", $link
 ) );

show/hide/print_error — показать или спрятать ошибки SQL

Есть возможность управлять ошибками, включать или выключать показ ошибок для последнего запроса:

$wpdb->show_errors(); // включит показ ошибок
$wpdb->hide_errors(); // выключит показ ошибок
$wpdb->print_error(); // включит показ ошибок на экран

get_col_info — получить информацию о колонке

Build In Post

Получает массив с информацией о колонках последнего запроса.

Если в запросе колонки не определены, то функция вернет информацию о всех колонках таблицы. Это может пригодится, когда был возвращен объект, о данных которого мы ничего не знаем.

Работает на основе кэша, поэтому сначала нужно сделать запрос используя get_results(), get_col(), get_var() и т.д. а потом вызвать эту функцию — она вернет данные колонок последнего запроса.

Возвращает

Разное. Данные колонок.

Использование

global $wpdb;
$wpdb->get_col_info( $info_type, $col_offset );
$info_type(строка)

Указывает какую информацию нам нужно получить. Список возможных значений:

  • name — название колонки.
  • table — название таблицы к которой принадлежит колонка.
  • max_length — максимальная длинна данных колонки.
  • not_null — 1 если ячейка колонки не может принимать значение NULL.
  • primary_key — 1 если колонка является первичным ключом.
  • unique_key — 1 если ячейки колонки должны быть всегда уникальны.
  • multiple_key — 1 если ячейки колонки могут быть не уникальны.
  • numeric — 1 если колонка содержит числовые данные.
  • blob — 1 если колонка содержит данные типа BLOB (двоичные данные).
  • type — тип колонки.
  • unsigned — 1 если колонка имеет тип данных UNSIGNED.
  • zerofill — 1 если колонка имеет тип данных ZEROFILL.

По умолчанию: name

$col_offset(число)

Указатель, информацию о какой колонке нужно получить:

  • -1 — будет получена информация о всех колонках в виде массива. По умолчанию.
  • 0, 1, 2, ... — будет возвращена информация об указанной колонке, где 0 — первая колонка, 1 — вторая и т.д.

По умолчанию: -1

Примеры

#1 Демонстрация работы

Сделаем запрос:

global $wpdb;

$results = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta" );

Теперь получим данные о колонках таблицы этого запроса:

$cols_data = $wpdb->get_col_info( 'name' );
/*
Array
(
	[0] => meta_id
	[1] => post_id
	[2] => meta_key
	[3] => meta_value
)
*/

$cols_data = $wpdb->get_col_info( 'max_length' );
/*
Array
(
	[0] => 6
	[1] => 5
	[2] => 45
	[3] => 20205
)
*/

$cols_data = $wpdb->get_col_info( 'type' );
/*
Array
(
	[0] => 8
	[1] => 8
	[2] => 253
	[3] => 252
)
*/

Что будет если указать несуществующее имя колонки:

$cols_data = $wpdb->get_col_info( 'primary_key' );
/*
Notice: Undefined property: stdClass::$primary_key in /wpexample.com/public_html/wp-includes/wp-db.php on line 3435
Notice: Undefined property: stdClass::$primary_key in /wpexample.com/public_html/wp-includes/wp-db.php on line 3435
Notice: Undefined property: stdClass::$primary_key in /wpexample.com/public_html/wp-includes/wp-db.php on line 3435
Notice: Undefined property: stdClass::$primary_key in /wpexample.com/public_html/wp-includes/wp-db.php on line 3435

Array
(
	[0] =>
	[1] =>
	[2] =>
	[3] =>
)
*/

Чтобы получить данные отдельной колонки нужно указать её индекс во втором параметре:

echo $wpdb->get_col_info( 'name', 0 );       //> meta_id
echo $wpdb->get_col_info( 'name', 1 );       //> post_id
echo $wpdb->get_col_info( 'max_length', 0 ); //> 6
echo $wpdb->get_col_info( 'max_length', 1 ); //> 5

flush — сброс кэша

Можно сбросить последние сохраненные данные в свойствах класса:

$wpdb->flush();

Эта команда очистит следующие свойства (переменные): $wpdb->last_result, $wpdb->last_query и $wpdb->col_info.

Свойства (переменные) класса

$show_errors
Показывать ошибки или нет, когда возвращается результат.
По умолчанию: true (да)
$suppress_errors
Подавлять ли ошибки в процессе построения запроса.
$last_error
Последняя ошибка из любого запроса.
$num_queries
Количество запросов, которые выполняются.
$num_rows
Количество строк, возвращенных последним запросом.
$rows_affected
Сохраняет число задействованных строк из последнего запроса. Заполняется при следующих sql командах: create, alter, truncate, drop, insert, delete, update, replace — в остальных случаях заполняется свойство $num_rows.
$insert_id
Идентификатор (ID) сгенерированный последним запросом, для SQL параметра AUTO_INCREMENT
$last_query
Последний запрос, который был выполнен классом.
$last_result
Результат последнего запроса.
$func_call
Текстовое описание последнего вызова query/get_row/get_var
$queries
Можно сохранить все запросы которые были сделаны к БД и их время выполнения, для этого нужно определить константу SAVEQUERIES как TRUE (например в config.php). По умолчанию она выключена (false). После того как эта константа включена в эту переменную будут собираться все запросы в виде массива данных.
$col_info
Информация о колонках последнего запроса.
$prefix
Префикс таблиц БД определенный для WordPress. Может пригодиться для мульти-сайтов.
$base_prefix
Префикс базовой таблицы WordPress. В мультисайте для сайтов сети префик отличается. Тут хранится префикс таблиц основного сайта сети.
$ready
Логический. Готов ли класс к выполнению запросов.
$blogid
Идентификатор текущего блога.
$siteid
ID сайта.
$tables

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

var $tables = array(
	'posts',
	'comments',
	'links',
	'options',
	'postmeta',
	'terms',
	'term_taxonomy',
	'term_relationships',
	'termmeta',
	'commentmeta',
);
$global_tables

Глобальные таблицы. Не повторяются для подсайтов.

array( 'users', 'usermeta' );
$ms_global_tables

Глобальные таблицы в режиме MU.

var $ms_global_tables = array(
	'blogs',
	'blogmeta',
	'signups',
	'site',
	'sitemeta',
	'sitecategories',
	'registration_log',
);
$collate
Режим сопоставления (сравнивания) данных в колонках базы данных.
$dbh
PHP объект базы mysqli.

Build In Post

WordPress в качестве базы данных использует MySQL v5.7 или выше, ИЛИ MariaDB v10.3 или выше.

Ниже все таблицы имеют дефолтный префикс wp_. У вас этот префикс может быть другой — его можно изменить в файле wp-config.php, там он указывается в переменной:

$table_prefix = 'wp_';

Названия всех таблиц находятся в объекте wpdb и получить, например, название таблицы wp_posts с текущим префиксом установленном в конфигурационном файле можено так: $wpdb->posts.

Таблицы WordPress (обычная установка)

Схема базы данных WordPress — структура всех таблиц
Записи — подробнее
wp_posts

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

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

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

wp_postmeta

Дополняет таблицу $wpdb->posts. Хранит дополнительные данные записей (постов) их еще называют метаполя.

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

Пользователи — подробнее
wp_users
Таблица с данными о зарегистрированных пользователях.
wp_usermeta
Дополнительная информация о пользователях, такая как Имя, Ник, права и прочее.
Мета поля для таблицы $wpdb->users.
Комментарии — подробнее
wp_comments
Таблица с записями комментариев. К любому посту, могут быть размещены комментарии. В этой таблице хранятся эти комментарии и некоторые данные о них.
wp_commentmeta
Мета поля (дополнительные данные) для таблицы wp_commentmeta.
Таксономии — подробнее
wp_terms
Таблица содержащая в себе базовую информацию каждом элементе таксономии.
wp_termmeta
Таблица содержащая в себе дополнительные поля для таблицы $wpdb->terms.
wp_term_taxonomy
Таблица с информацией о таксономиях, их описание. Данные в таблице wp_terms еще не являются таксономиями — эта таблица расширяет данные каждого термина и присваиваем каждому термину таксономию к которой он относится.
wp_term_relationships
Таблица связывающая таксономии с контентом (постами, записями и т.п.). Каждая строка этой таблицы определяет связь между постом (объектом) в wp_posts и термином таксономии из таблицы wp_term_taxonomy.
Остальные таблицы
wp_options
Таблица опций (настроек).
wp_links
Таблица с записями ссылок. Устарелая таблица, уже давно не используется, однако функционал все еще рабочий, но его нужно включить отдельно.

Таблицы WordPress (Multisite)

Когда сайт WordPress преобразуется в многосайтовую установку, создается «сеть» подсайтов. Текущий сайт становится первым подсайтом сети. В базе данные этот сайт становится сайтом сети (wp_site), а каждый подсайт обозначается как блог (wp_blogs).

wp_blogs
Данные всех под-сайтов сети хранятся в этой таблице.
wp_blogmeta
Появилась в WP 5.1. Тут храниться служебная информация о блогах. Например: db_version, db_last_updated. С появлением этой таблицы вам не нужно использовать таблицу wp_options для хранения некоторых данных о под-сайте и каждый раз использовать switch_to_blog(), когда такие данные нужны.
wp_blog_versions

Содержит текущую версию базы данных каждого сайта. Данные обновляются при обновлении БД для каждого сайта сети.

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

wp_registration_log
Содержит данные, когда был зарегистрирован блог сети.
В этой таблице регистрируются пользователи, которые регистрируют новый сайт после его активации.
wp_signups

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

В этой таблице хранятся данные о блогах, которые были зарегистрированы, но не активированы, когда сеть позволяет регистрировать новые сайты. После активации сайта запись удаляется и создается запись в wp_blogs.

wp_site

Содержит, адреса основных сайтов.

Эта таблица всегда будет содержать одну сеть, хотя структура таблицы позволяет использовать несколько сетей в одной базе данных. Это не было реализовано в самом WordPress, но может быть реализовано с помощью плагинов, например: WP Multi Network или Networks for WordPress.

wp_sitemeta

Данные сайтов: различные опции, включая администратора сайта.

Эта таблица похожа на wp_options, только — это опции работающие для всей сети сайтов а не для конкретного под-сайта. Здесь хранится конфигурация (опции), связанные с сетью, а также другие данные, например, настройки плагинов, которые должны быть доступны для всей сети (для любого сайта сети).

wp_users
Список пользователей всех сайтов сети. Это общая таблица пользователей для всей сети. Это привычная таблица, только в мультисайт версии добавляются еще 2 поля: spam и delete.
wp_usermeta
Содержит мета-данные пользователей. Настройки пользователя для разных сайтов сети.
Базовые таблицы каждого сайта сети

Таблицы сайта сети: wp_posts, wp_options и т.д. Для каждого сайта сети создаются одинаковые таблицы, но с разным префиксом, например, wp_2_posts. Здесь 2 это id подсайта.

Для подстайтов создается следующий набор таблиц:

wp_2_options
wp_2_posts
wp_2_postmeta
wp_2_comments
wp_2_commentmeta
wp_2_terms
wp_2_termmeta
wp_2_term_relationships
wp_2_term_taxonomy
wp_2_links

Механизмы хранения данных в MySQL

Механизм хранения — это часть базы данных, которая отвечает за чтение и запись данных. Начиная с версии MySQL 5.5, движком хранения по умолчанию является InnoDB. Это наиболее часто используемый механизм хранения данных, поскольку он имеет блокировку на уровне строк вместо полной блокировки на уровне таблицы (что очень важно при выполнении экспорта/резервного копирования mysqldump), поддерживает транзакции (позволяя фиксировать и откатывать SQL-запросы), а также имеет полную поддержку внешних ключей и ограничений отношений.

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

Совет: Конвертируйте MyISAM в InnoDB с помощью phpMyAdmin, чтобы повысить производительность базы данных.

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

Набор символов MySQL — это набор символов, допустимых в строке. В алфавите 26 символов — от a до z. Каждой букве присвоен номер, например, a = 1, b = 2, c = 3 и так далее. Буква — это символ, а связанное с ней число — кодировка.

Комбинация всех букв от a до z и соответствующих им цифровых кодировок составляет набор символов. MySQL поддерживает множество наборов символов, которые позволяют хранить практически любой символ в строке.

MySQL collation — это набор правил, используемых для сравнения символов в определенном наборе символов. Для сравнения строк база данных использует номера кодировки символов. Примером правила коллирования является коллирование без учета регистра, когда строки сравниваются, даже если они состоят из символов нижнего или верхнего регистра. Коллизии могут быть довольно сложными, как описано в документации MySQL:

большинство collations имеют множество правил, не только для различения регистра букв, но и для различения акцентов («акцент» — это знак, прикрепленный к символу, как в немецком Ö), а также для сопоставления нескольких символов (например, правило, согласно которому Ö = OE в одной из двух немецких колляций).
MySQL позволяет задавать наборы символов и колляции на четырех уровнях: сервер, база данных, таблица и колонка.

Для сайтов WordPress рекомендуемый набор символов — utf8mb4, а рекомендуемая коллизия — utf8mb4_unicode_ci. В WordPress 4.2 таблицы были переведены с кодовой таблицы utf8 на utf8mb4, что позволяет хранить 4-байтовые символы, а это значит, что в базе данных можно хранить любые символы Unicode. Peter Tasker написал отличное руководство для разработчиков о том, как работает Unicode.

  • Различия MySQL и MariaDB: https://kinsta.com/blog/mariadb-vs-mysql/
  • Полезная статья про таблицы ВП: https://deliciousbrains.com/tour-wordpress-database/

Все методы класса

  1. public __construct( $dbuser, $dbpassword, $dbname, $dbhost )
  2. public __get( $name )
  3. public __isset( $name )
  4. public __set( $name, $value )
  5. public __unset( $name )
  6. private _do_query( $query )
  7. public _escape( $data )
  8. private _escape_identifier_value( $identifier )
  9. public _insert_replace_helper( $table, $data, $format = null, $type = ‘INSERT’ )
  10. public _real_escape( $data )
  11. public _weak_escape( $data )
  12. public add_placeholder_escape( $query )
  13. public bail( $message, $error_code = ‘500’ )
  14. protected check_ascii( $input_string )
  15. public check_connection( $allow_bail = true )
  16. public check_database_version()
  17. protected check_safe_collation( $query )
  18. public close()
  19. public db_connect( $allow_bail = true )
  20. public db_server_info()
  21. public db_version()
  22. public delete( $table, $where, $where_format = null )
  23. public determine_charset( $charset, $collate )
  24. public esc_like( $text )
  25. public escape( $data )
  26. public escape_by_ref( &$data )
  27. public flush()
  28. public get_blog_prefix( $blog_id = null )
  29. public get_caller()
  30. public get_charset_collate()
  31. public get_col( $query = null, $x = 0 )
  32. public get_col_charset( $table, $column )
  33. public get_col_info( $info_type = ‘name’, $col_offset = -1 )
  34. public get_col_length( $table, $column )
  35. public get_results( $query = null, $output = OBJECT )
  36. public get_row( $query = null, $output = OBJECT, $y = 0 )
  37. protected get_table_charset( $table )
  38. protected get_table_from_query( $query )
  39. public get_var( $query = null, $x = 0, $y = 0 )
  40. public has_cap( $db_cap )
  41. public hide_errors()
  42. public init_charset()
  43. public insert( $table, $data, $format = null )
  44. protected load_col_info()
  45. public log_query( $query, $query_time, $query_callstack, $query_start, $query_data )
  46. public parse_db_host( $host )
  47. public placeholder_escape()
  48. public prepare( $query, …$args )
  49. public print_error( $str = » )
  50. protected process_field_charsets( $data, $table )
  51. protected process_field_formats( $data, $format )
  52. protected process_field_lengths( $data, $table )
  53. protected process_fields( $table, $data, $format )
  54. public query( $query )
  55. public quote_identifier( $identifier )
  56. public remove_placeholder_escape( $query )
  57. public replace( $table, $data, $format = null )
  58. public select( $db, $dbh = null )
  59. public set_blog_id( $blog_id, $network_id = 0 )
  60. public set_charset( $dbh, $charset = null, $collate = null )
  61. public set_prefix( $prefix, $set_table_names = true )
  62. public set_sql_mode( $modes = array() )
  63. public show_errors( $show = true )
  64. protected strip_invalid_text( $data )
  65. public strip_invalid_text_for_column( $table, $column, $value )
  66. protected strip_invalid_text_from_query( $query )
  67. public supports_collation()
  68. public suppress_errors( $suppress = true )
  69. public tables( $scope = ‘all’, $prefix = true, $blog_id = 0 )
  70. public timer_start()
  71. public timer_stop()
  72. public update( $table, $data, $where, $format = null, $where_format = null )

Перед вами подробное руководство по построению запросов к базе данных WordPress при помощи объекта $wpdb класса wpdb.

Класс позволяет взаимодействовать с базой данных без построения SQL-запросов на чистом PHP.

Используем глобальный объект $wpdb

При использовании объекта $wpdb для построения SQL-запросов, нам следует определить его как глобальную переменную.

Например:

global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}options WHERE option_id = 1", OBJECT );

Этот пример позволяет получить опцию из таблицы wp_options со значением колонки option_id равным единице. Если мы сделаем print_r( $results ), то получим:

Array
(
    [0] => stdClass Object
        (
            [option_id] => 1
            [option_name] => siteurl
            [option_value] => https://misha.agency
            [autoload] => yes
        )
 
)

$wpdb-prepare() или как защититься от SQL-инъекций

Любые данные, которые вы передаёте в свои SQL-запрсоы должны очищаться, иначе вы повышаете риск SQL-инъекций для вашего сайта. Метод prepare отлично с этим справляется, он также поддерживает синтаксис sprintf() и vsprintf().

Понять принцип его работы лучше всего на примере.

$meta_key   = 'seo_title';
$meta_value = 'Привет, мир!';
 
$wpdb->query(
	$wpdb->prepare(
		"
		INSERT INTO $wpdb->postmeta
		( post_id, meta_key, meta_value )
		VALUES ( %d, %s, %s )
		",
		10,
		$meta_key,
		$meta_value
	)
);

Давайте разберём этот пример:

  • $wpdb->prepare() подготовливает SQL-запрос для $wpdb->query() и находится непосредственно внутри него.
  • Тут используется синтаксис sprintf(), в первом параметре у нас находится SQL-запрос INSERT INTO в виде строки, в котором переменные заменены на плейсхолдеры (%d и %s), которые будут заменены на переменные из следующих параметров в том же порядке, в котором они указаны. Например %d будет заменён на 10.
  • %d означает целое число, %s означает строку, больше значений можете найти в документации функции sprintf().

Синтаксис vsprintf() отличается тем, что значения передаются в запрос не бесконечным количеством переменных, а массивом.

$meta_key   = 'seo_title';
$meta_value = 'Привет, мир!';
 
$wpdb->query(
	$wpdb->prepare(
		"
		INSERT INTO $wpdb->postmeta
		( post_id, meta_key, meta_value )
		VALUES ( %d, %s, %s )
		",
		array(
			10,
			$meta_key,
			$meta_value,
		)
	)
);

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

Обязательно используйте $wpdb->prepare() с $wpdb->query(), $wpdb->get_col(), $wpdb->get_var(), $wpdb->get_row(), $wpdb->get_results().

Не нужно использовать $wpdb->prepare() с методами $wpdb->insert(), $wpdb->update(), $wpdb->replace(), $wpdb->delete(), так как он и так уже находится внутри них.

Для того, чтобы вам было легче разобраться, в последующих примерах я уже сразу буду добавлять $wpdb->prepare() там, где нужно!

Обращение к таблицам MySQL, префикс таблиц

Обратиться к стандартным таблицам в базе WordPress очень легко — ведь для этого предназначены переменные класса:

  • $commentmeta
  • $comments
  • $links
  • $options
  • $postmeta
  • $posts
  • $terms
  • $term_relationships
  • $term_taxonomy
  • $usermeta
  • $users

Как это будет выглядеть на деле:

$wpdb->query( 
	$wpdb->prepare(
		"
		DELETE FROM $wpdb->posts
		WHERE id = '%d'
		",
		$post_id
	)
);

Ок, а как быть с таблицами плагинов, или теми, которые сами мы и создали?

$wpdb->query( 
	$wpdb->prepare(
		"
		DELETE FROM " . $wpdb->prefix . "posts
		WHERE id = '%d'
		",
		$post_id
	)
);

$wpdb->get_results()

Первый метод больше всего похож на обычный запрос SELECT.

$wpdb->get_results( 'query', output_type );
output_type
Тип вывода данных.

  • OBJECT – объект (по умолчанию)
  • OBJECT_K – Ассоциативный массив, в котором в качестве ключей будут использоваться значения в первой колонке, дубликаты будут проигнорированы.
  • ARRAY_A – Нумерованный массив состоящий из ассоциативных массивов, в качестве индексов которых будут использоваться названия колонок.
  • ARRAY_N – Нумерованный двумерный массив.

Выводим заголовки всех опубликованных страниц:

$pages = $wpdb->get_results( 
	"
	SELECT post_title, post_content 
	FROM $wpdb->posts
	WHERE post_status = 'publish' 
	AND post_type = 'page'
	"
);
 
//вытаскиваем из базы данных заголовки и содержимое всех опубликованных страниц
if( $pages ) {
	foreach ( $pages as $page ) {
		echo $page->post_title;
	}
}
// выводим заголовки

Пример с использованием функции setup_postdata, то есть в итоге получается некий аналог WP_Query().

// В случае если на блоге есть опубликованные страницы, выводим заголовки со ссылками
$pages = $wpdb->get_results( 
	"
	SELECT * 
	FROM $wpdb->posts
	WHERE post_status = 'publish' 
	AND post_type = 'page'
	"
);
if ( $pages ) {
	foreach ( $pages as $post ) {
		setup_postdata( $post );
		echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
	}
} else {
	echo '<p>Ничего не найдено</p>';
}

$wpdb->get_var()

Переходим ко второму методу, get_var(), в отличие от get_results(), он позволяет вывести одно значение, причем это может быть сумма значений или количество строк.

$wpdb->get_var( 'query', column_offset, row_offset );
column_offset
(целое) номер по порядку нужной колонки (по умолчанию 0)
row_offset
(целое) номер по порядку нужного ряда (по умолчанию 0)

Выводим дату регистрации какого-то конкретного пользователя:

// узнаем и выводим дату регистрации пользователя с логином truemisha
$date = $wpdb->get_var(
	"
	SELECT user_registered
	FROM $wpdb->users
	WHERE user_login = 'truemisha'
	"
);
echo $date;

Пришло время узнать количество зарегистрированных пользователей на нашем сайте на WordPress:

$number_of_users = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
 
echo "Всего на сайте зарегалось {$number_of_users} человек.";

Подсчитаем сумму чего-нибудь из метаданных пользователя:

$amount = $wpdb->get_var( 
	$wpdb->prepare( 
		"
			SELECT sum(meta_value) 
			FROM $wpdb->usermeta 
			WHERE meta_key = %s
		", 
		$meta_key
	)
);
echo "Сумма равна {$amount}";

$wpdb->get_row()

Получает значения только из одной строки, удовлетворяющей условию.

$wpdb->get_row( 'query', output_type, row_offset );
output_type
Тип вывода данных,

  • OBJECT — объект (по умолчанию),
  • ARRAY_A — ассоциативный массив,
  • ARRAY_N — нумерованный массив;
row_offset
(целое) номер по порядку нужного ряда (по умолчанию 0)

Выводим заголовок поста с самым большим количеством комментариев:

$post = $wpdb->get_row(
	"
	SELECT post_title, post_content
	FROM $wpdb->posts
	WHERE post_status = 'publish'
	ORDER BY comment_count DESC LIMIT 0,1
	"
);
echo $post->title;

Используем для тех же целей ассоциативный массив:

$post = $wpdb->get_row(
	"
	SELECT post_title, post_content
	FROM $wpdb->posts
	WHERE post_status = 'publish'
	ORDER BY comment_count DESC LIMIT 0,1
	",
	ARRAY_A
);
echo $post[ 'title' ];

$wpdb->get_col()

Вывод данных только из одной колонки, в результате получаем одномерный объект.

$wpdb->get_col( 'query', column_offset );
column_offset
(целое) номер по порядку нужной колонки (по умолчанию 0)

Выводим заголовок самой первой опубликованной страницы:

$posts = $wpdb->get_col(
	"
	SELECT post_title
	FROM $wpdb->posts
	WHERE post_status = 'publish'
	AND post_type='page'
	"
);
echo $posts[0];

$wpdb->insert()

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

$wpdb->insert( 
	$wpdb->prefix . 'usermeta', // указываем таблицу
	array( // 'название_колонки' => 'значение'
		'user_id' => 1,
		'meta_key' => 'first_name', 
		'meta_value' => 'Михаил' 
	), 
	array( 
		'%d', // %d - значит число
		'%s', // %s - значит строка
		'%s'
	) 
);

вставка строки в MySql таблицу INSERT

$wpdb->update()

Предположим в прошлом примере мы всё-таки создали строку и сейчас хотим её обновить:

$wpdb->update( 
	$wpdb->prefix . 'usermeta', // указываем таблицу
	array('meta_value' => 'Миша'), // поменяем имя 
	array( // где 
		'user_id' => 1,
		'meta_key' => 'first_name'
	), 
	array( '%s' ),
	array( // формат для «где»
		'%d',
		'%s'
	)
);

UPDADE - обновление строки в таблице MySql

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Работа с базами данных примеры excel
  • Работа с базами данных в ms excel презентация
  • Работа с базами данных в excel сортировка по
  • Работа с базами данных в excel пример
  • Работа с word файлами python

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии