Статьи

Как работать с метаданными WordPress Post

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

Далее я определил, что такое метаданные; его роль в WordPress, и насколько это актуально для нас как разработчиков. Но введение было предназначено именно для этого: обзор того, что мы собираемся освещать в оставшейся части этой серии.

Начиная с этого поста, мы собираемся начать изучение Word Meta API WordPress, чтобы понять, почему он полезен, что мы можем с ним сделать и как использовать методы, предлагаемые приложением WordPress.

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

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

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

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

Существует совершенно другой набор API-интерфейсов для очистки данных, который нам необходимо изучить, и который будет работать совместно с API-интерфейсами метаданных, но это не учебник для этого.

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

С учетом вышесказанного, давайте продолжим и начнем работать с WordPress Post Meta API. И будьте осторожны: это длинный урок.

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

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

Далее давайте разберемся, как WordPress определяет метаданные поста. Согласно Кодексу :

WordPress имеет возможность разрешать авторам постов присваивать постам настраиваемые поля. Эта произвольная дополнительная информация называется метаданными.

Метаданные обрабатываются парами ключ / значение. Ключ — это имя элемента метаданных. Значение — это информация, которая будет отображаться в списке метаданных на каждом отдельном посте, с которым связана эта информация.

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

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

Ключ в том, как мы можем получить значение из поста. Но это поднимает вопрос: что произойдет, если с сообщением связано несколько фрагментов метаданных? То есть, если в каком-либо конкретном сообщении может храниться несколько фрагментов метаданных, как мы получаем уникальные метаданные?

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

Ничто не работает лучше, чем видеть это в действии. Итак, предположим, что на вашем локальном компьютере настроен WordPress, и что вы можете редактировать functions.php в ядре вашей темы по умолчанию, давайте начнем.

Я буду использовать следующие инструменты:

Самое главное, что вы используете WordPress и тему, упомянутую выше.

Наконец, если вам удобнее использовать другую среду IDE и базу данных, это вполне нормально.

Мы представили много информации во введении к этой статье, но она пригодится, когда мы начнем рассматривать не только Post Meta API, но и другие API. Так что держите этот разум. Я буду ссылаться на эту статью в будущих статьях тоже.

Давайте копаться в API.

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

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

На данный момент мы сосредоточены на основах API.

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

Во-вторых, мы собираемся внести изменения в functions.php . Обычно это не лучшее место, чтобы сделать это изменение; Тем не менее, пожалуйста, убедитесь, что вы прочитали примечание выше, прежде чем продолжить.

С учетом вышесказанного, давайте предположим, что ваш сервер работает, ваша IDE запущена и готова, и functions.php в вашем редакторе. Хотя ваш скриншот может выглядеть немного иначе, он должен выглядеть примерно так:

functionsphp

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

Используя выбранную вами IDE:

  1. Создайте новый файл в корневом каталоге темы twentysixteen.
  2. Назовите файл tutsplus-metadata.php .

После этого у вас должно получиться что-то вроде этого в вашей файловой системе:

tutsplus-metadataphp

Наконец, нам нужно убедиться, что мы включили это в functions.php . Для этого добавьте следующую строку кода прямо под открывающим тегом PHP.

1
2
3
<?php
 
include_once( ‘tutsplus-metadata.php’ );

Перезагрузите ваш браузер. Если все идет хорошо, вы должны увидеть тему точно так же, как это было до добавления файла в functions.php .

Теперь приступим к работе.

Вспомните наше предыдущее обсуждение о том, что для добавления метаданных в базу данных необходимы три вещи:

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

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

Допустим, мы хотим добавить некоторые метаданные, которые включают наше имя. Таким образом, мета-ключ, который мы будем использовать, — это my_name а значение, которое мы будем использовать, — любое ваше имя.

Первое, что мы хотим сделать, это определить функцию, которая the_content к the_content . Это позволит нам выводить наш текст при запуске функции. Если вы не знакомы с крючками, пожалуйста, прочитайте эту серию .

Ваш исходный код должен выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
  if ( 1 === get_the_ID() ) {
    echo «[We are here.]»
  }
 
  return $content;
 
}

Когда вы выполняете этот код, строка «[Мы здесь.]» Должна появляться над содержимым поста раньше всего, и должна произойдет только на Привет, мир! Почта. Это потому, что мы проверяем, чтобы ID был равен 1, прежде чем echo строку.

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

Теперь давайте добавим некоторые актуальные метаданные. Для этого добавьте этот код в тело условного выражения, чтобы мы были уверены, что мы делаем это для Hello World . Поскольку мы уже проверяем идентификатор 1 в условном выражении, мы можем просто удалить код, который мы добавили в предыдущем разделе, и обновить его.

В теле условия мы сделаем вызов API-функции add_post_meta которая выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_post_meta( get_the_ID(), ‘my_name’, ‘Tom McFarlin’ );
    }
 
    return $content;
 
}

Было бы хорошо, если бы мы могли что-то сделать с этой информацией. Однако, прежде чем мы это сделаем, нам нужно еще кое-что рассказать. А именно, об обновлении метаданных (и чем они отличаются от добавления метаданных) наряду с некоторыми нюансами, которые вы можете не ожидать при работе с API.

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

Когда вы вызываете add_post_meta , вы создаете запись каждый раз, когда делаете этот вызов. Итак, в нашем коде выше, если вы обновите страницу три раза, то увидите что-то вроде этого:

addpostmeta

Любопытно, правда? Вспомните, что говорит Кодекс :

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

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

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

Это означает, что мы могли бы обновить наш код, чтобы он выглядел так:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_post_meta( get_the_ID(), ‘my_name’, ‘Tom McFarlin’, true );
    }
 
    return $content;
 
}

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

Но так не должно быть, и именно здесь в update_post_meta вступает update_post_meta . Фактически, update_post_meta может использоваться больше, чем add_post_meta , в зависимости от вашего add_post_meta использования.

Прежде чем взглянуть на код, посмотрите, что говорит Кодекс :

Функция update_post_meta () обновляет значение существующего мета-ключа (настраиваемое поле) для указанного поста.

Это может быть использовано вместо функции add_post_meta (). Первое, что будет делать эта функция, это убедиться, что $ meta_key уже существует в $ post_id. Если это не так, вызывается add_post_meta ($ post_id, $ meta_key, $ meta_value) и возвращается его результат.

Вы это поймали? Его можно использовать вместо add_post_meta , что полезно, потому что это означает:

  1. Если метаданные записи уже существуют для данного ключа,
  2. Если вы используете update_post_meta ,
  3. Вы перезапишете предыдущее значение.

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

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_post_meta( get_the_ID(), ‘my_name’, ‘Tom McFarlin’ );
    }
 
    return $content;
 
}

Это приносит некоторые врожденные опасности с этим, все же.

А именно, если вы перезаписываете значение, которое никогда не намеревалось перезаписать, то это значение исчезнет, ​​и его нельзя будет восстановить (если вы не выполняете более изощренную работу, выходящую за рамки этой серии статей).

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

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

Разница между add_post_meta и update_post_meta может считаться незначительной, но это зависит от вашего update_post_meta использования.

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

  • add_post_meta полезен, когда вы хотите ввести запись в базу данных. Если значение уже существует, то новое значение может быть записано или не записано. Если вы передадите true для параметра $unique функции, то будет создана только первая запись, и ничто не заменит это, кроме update_post_meta .
  • update_post_meta может использоваться вместо add_post_meta и всегда будет перезаписывать предыдущее значение, которое существовало. Если вы работаете с несколькими записями, созданными add_post_meta , вам может потребоваться указать предыдущее значение, которое вы хотите перезаписать.

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

Когда дело доходит до извлечения метаданных, есть две основные вещи, которые вы должны запомнить:

  1. Метаданные могут быть получены в виде строки.
  2. Метаданные могут быть получены в виде массива.

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

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

Функция принимает три параметра:

  1. ID сообщения
  2. ключ метаданных
  3. необязательное логическое значение, если вы хотите получить значение в виде строки или массива (где массив — это значение по умолчанию, если ничего не указано)

Из Кодекса :

Получить мета-поле для сообщения. Будет массивом, если $ single равно false. Будет значением поля метаданных, если $ single равно true.

Кажется, достаточно просто. Поэтому, учитывая, где сейчас находится последний бит нашего исходного кода, я бы сказал, что мы можем получить информацию, сделав такой вызов, как get_post_meta( get_the_ID(), 'my_name' ); ,

Код, как он стоит выше, вернет массив.

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

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

addpostmeta вид базы данных

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

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

С этой целью, если вы хотите получить несколько значений для данного ключа, тогда ваш код будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        var_dump( get_post_meta( get_the_ID(), ‘my_name’ ) );
    }
 
    return $content;
 
}

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

Теперь предположим, что вы хотите получить отдельные значения для одного поста. В этом случае вам все еще нужны идентификатор записи и ключ метаданных; тем не менее, вам также нужно будет get_post_meta true в качестве третьего параметра get_post_meta .

Как упоминалось выше, если вы имеете дело с ситуацией, в которой несколько строк были созданы с использованием add_post_meta , то вы вернетесь к первой строке, которая была создана; однако, если вы используете эту функцию вместе с update_post_meta вы получите строковое значение сохраненных данных.

Поскольку мы рассмотрели первое, но не охватили второе, вот как выглядит код:

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        var_dump( get_post_meta( get_the_ID(), ‘my_name’, true ) );
    }
 
    return $content;
 
}

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

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

Но сначала вот определение из Кодекса :

Эта функция удаляет все настраиваемые поля с указанным ключом или ключом и значением из указанного поста.

Коротко, сладко и точно. Функция принимает три аргумента:

  1. ID сообщения
  2. мета ключ
  3. мета значение

Значение meta является необязательным, но оно пригодится, если вы работали с add_post_meta и хотите удалить одну из конкретных записей, созданных несколькими вызовами этой функции (как мы видели в других местах этого учебника).

Хотя вызов delete_post_meta так же прост, как и передача идентификатора записи, мета-ключа и необязательного мета-значения, функция возвращает логическое значение, указывающее, были ли удалены данные.

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

01
02
03
04
05
06
07
08
09
10
11
12
<?php
 
add_filter( ‘the_content’, ‘tutsplus_metadata’ );
function tutsplus_metadata( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_post_meta( get_the_ID(), ‘my_name’ );
    }
 
    return $content;
 
}

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

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

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

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
<?php
/**
 * This file shows how to work with the common Post Meta API functions.
 *
 * Namely, it demonstrates how to use:
 * — add_post_meta
 * — update_post_meta
 * — get_post_meta
 * — delete_post_meta
 *
 * Each function is hooked to ‘the_content’ so that line will need to be
 * commented out depending on which action you really want to test.
 *
 * Also note, from the tutorial linked below, that this file is used form
 * demonstration purposes only and should not be used in a production
 * environment.
 *
 * Tutorial:
 * http://code.tutsplus.com/tutorials/how-to-work-with-wordpress-post-metadata—cms-25715
 *
 * @version 1.0.0
 * @author Tom McFarlin
 * @package tutsplus_wp_metadata
 */
 
add_filter( ‘the_content’, ‘tutsplus_add_post_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * adds my name as the post meta data to the postmeta database table.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_add_post_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        add_post_meta( get_the_ID(), ‘my_name’, ‘Tom McFarlin’ );
    }
 
    return $content;
 
}
 
add_filter( ‘the_content’, ‘tutsplus_update_post_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * updates my name as the post meta data to the postmeta database table.
 * is an alternative way of writing post metadata to the postmeta table as
 * discussed in the linked tutorial.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_update_post_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        update_post_meta( get_the_ID(), ‘my_name’, ‘Tom McFarlin’ );
    }
 
    return $content;
 
}
 
add_filter( ‘the_content’, ‘tutsplus_get_post_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * retrieves the value for the ‘my_name’ in the format of a string and echoes
 * it back to the browser.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_get_post_meta( $content ) {
 
    // Note: Don’t worry about the esc_textarea call right now.
    if ( 1 === get_the_ID() ) {
        echo esc_textarea( get_post_meta( get_the_ID(), ‘my_name’, true ) );
    }
 
    return $content;
 
}
 
add_filter( ‘the_content’, ‘tutsplus_delete_post_meta’ );
/**
 * Determines if the current post is the default ‘Hello World’ post and, if so,
 * deletes the post metadata identified by the unique key.
 *
 * @param string $content The post content.
 * @return string $content The post content.
 */
function tutsplus_delete_post_meta( $content ) {
 
    if ( 1 === get_the_ID() ) {
        delete_post_meta( get_the_ID(), ‘my_name’ );
    }
 
    return $content;
 
}

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

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

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

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

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

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

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

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

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