Метаданные — это информация об информации. В случае WordPress это информация, связанная с сообщениями, пользователями, комментариями и терминами.
Учитывая отношение метаданных «многие к одному» в WordPress, ваши возможности практически безграничны. У вас может быть столько мета-параметров, сколько вы пожелаете, и вы можете хранить там что угодно.
В этой главе мы обсудим управление метаданными постов , создание пользовательских метабоксов и рендеринг метаданных постов .
Добавление метаданных
Добавить метаданные можно довольно легко с помощью add_post_meta() . Функция принимает параметры post_id, meta_key, meta_value и unique-флаг.
Именно meta_key так ваш плагин будет ссылаться на мета-значение в другом месте вашего кода. Что-то подобное mycrazymetakeyname будет работать, однако префикс, относящийся к вашему плагину или теме, за которым следует описание ключа, будет более полезным. wporg_featured_menu будет хорошим выбором. Следует отметить, что один и тот же meta_key может использоваться несколько раз для хранения вариантов метаданных (см. флаг уникальности ниже).
meta_value может быть строкой, целым числом или массивом. Если это массив, он будет автоматически сериализован перед сохранением в базе данных.
Флаг unique позволяет вам объявить, должен ли этот ключ быть уникальным. Неуникальный ключ — означает, что запись может иметь несколько вариаций, например несколько цен.
Если вам нужна только одна цена для записи (товара услуги), вы должны отметить ее как unique, и её meta_key будет иметь только одно значение.
Обновление метаданных
Если ключ уже существует и вы хотите его обновить, используйте update_post_meta() . Если вы используете эту функцию, а ключ НЕ существует, то он создаст его, как если бы вы использовали add_post_meta() .
Подобно add_post_meta() , функция принимает post_id, meta_key и meta_value. Он также принимает необязательный параметр prev_value, который, если он указан, заставит функцию обновлять только существующие записи метаданных с этим значением. Если он не указан, функция по умолчанию обновляет все записи.
Удаление метаданных
delete_post_meta() принимает post_id и meta_key и, необязательный meta_value. Удаляет метаинформацию для указанной записи.
Экранирование символов
Мета-значения сообщения передаются через функцию stripslashes() при сохранении, поэтому вам нужно быть осторожным при передаче значений (например, JSON), которые могут содержать экранированные символы.
Рассмотрим значение JSON {“key”:”value with \”escaped quotes\””}:
$escaped_json = '{"key":"value with \"escaped quotes\""}';
update_post_meta( $id, 'escaped_json', $escaped_json );
$broken = get_post_meta( $id, 'escaped_json', true );
/*
$broken, after stripslashes(), ends up unparsable:
{"key":"value with "escaped quotes""}
*/
Обходной путь
Добавив еще один уровень экранирования с помощью функции wp_slash() (представленной в WP 3.6), вы можете компенсировать вызов stripslashes() :
$escaped_json = '{"key":"value with \"escaped quotes\""}';
update_post_meta( $id, 'double_escaped_json', wp_slash( $escaped_json ) );
$fixed = get_post_meta( $id, 'double_escaped_json', true );
/*
$fixed, after stripslashes(), ends up as desired:
{"key":"value with \"escaped quotes\""}
*/
Скрытые настраиваемые поля
Если вы являетесь разработчиком плагинов или тем и планируете использовать настраиваемые поля для хранения параметров, важно отметить, что WordPress не будет отображать настраиваемые поля, начинающиеся с «_» (подчеркивание) meta_key в списке настраиваемых полей on_after_editscreen или при использовании функции шаблона the_meta() .
Это может быть полезно для отображения этих настраиваемых полей необычным способом с помощью функции add_meta_box() .
В приведенном ниже примере будет добавлено уникальное настраиваемое поле meta_key с именем «_color» и meta_value «красный», но это настраиваемое поле не будет отображаться на экране редактирования сообщения:
add_post_meta( 68, ‘_color’, ‘red’, true );
Скрытые массивы
Кроме того, если это meta_value массив, он не будет отображаться на экране редактирования страницы, даже если вы не добавите к имени префикс meta_key подчеркивания.