Вопрос или проблема
У меня есть мой собственный тип записи ‘event’. У меня есть следующий код в single-event.php:
get_header();
the_post();
echo '<pre>';
echo "$post->ID\n";
var_dump(get_post_meta($post->ID));
echo '</pre>';
Когда я открываю страницу события через обычный URI /event/slug/, я получаю это:
22681
array(17) {
["_edit_lock"]=>
array(1) {
[0]=>
string(13) "1439329938:36"
}
["_edit_last"]=>
array(1) {
[0]=>
string(2) "36"
}
...
}
Когда я открываю его для предварительного просмотра, например, /event/slug/?preview=true&preview_id=22681&preview_nonce=XXXXXXXXXXXXX , я получаю только это:
22681
string(0) ""
(где первая строка – это правильный ID записи и совпадает с параметром preview_id)
Что я делаю неправильно? И почему string(0)
, а не array(0)
?
Я решил эту проблему с помощью 3 строк кода после вызова get_post_meta():
if (!is_array($post_meta)) {
$post_meta = array();
}
Ответ на ваш вопрос, почему возвращается пустая строка, указан в комментарии к записи функции get_post_meta()
в документации WP Developers: https://developer.wordpress.org/reference/functions/get_post_meta/#comment-825
Функция требует следующее: get_post_meta( $postID, 'meta_key', $single=false );
Как объясняется в комментарии по ссылке выше: Если мета-поле с данным $key
не найдено для указанного $post_id
, возвращаемое значение варьируется:
Если $single
равно true
, возвращается пустая строка. Если $single
равно false
, возвращается пустой массив.
$single
по умолчанию равно false
и никакой meta_key
не указан, поэтому возвращается пустой массив.
.
Ответ или решение
Вопрос заключается в том, почему функция get_post_meta($post->ID)
возвращает пустую строку при просмотре предварительного режима пользовательского типа записи (custom post type) в WordPress. Рассмотрим причины и решение данной проблемы.
Теория
Функция get_post_meta($postID, $meta_key, $single)
извлекает метаданные для указанного поста в WordPress. Параметры функции включают:
- $postID: идентификатор поста, для которого требуется получить метаданные.
- $meta_key: ключ метаданного поля, которое необходимо извлечь. Если указано, то возвращается значение для данного ключа.
- $single: флаг, определяющий, возвращается ли одно значение или массив значений. По умолчанию равен
false
.
Когда ключ метаданных $meta_key
не найден для данного поста:
- Если
$single
равноtrue
, возвращается пустая строка""
. - Если
$single
равноfalse
, возвращается пустой массивarray()
.
Таким образом, когда указано false
и не задано конкретное поле $meta_key
, должно возвращаться array(0)
, но не string(0)
, как указано в вашем вопросе.
Пример
Вы привели пример, где использование get_post_meta($post->ID)
в режиме предварительного просмотра возвращает string(0)
, что не соответствует ожиданиям, если поле не найдено или отсутствует.
Применение
Ваша проблема может объясняться спецификой работы предварительного просмотра в WordPress, где возможно некорректное или временное состояние метаданных поста. Во время предварительного просмотра, в отличие от полного отображения поста, метаданные могут быть временно недоступны или не загружены полностью.
Для решения этой проблемы вы привели метод, в котором по проверке типа данных, возвращаемых функцией get_post_meta
, вы дополнительно инициализируете переменную $post_meta
как массив, если она не является массивом:
if (!is_array($post_meta)) {
$post_meta = array();
}
Это позволяет избежать ошибок типа и гарантирует, что работающая система будет ожидать корректный формат метаданных даже при отсутствии данных в режиме предварительного просмотра.
Данное решение является практичной мерой для обработки исключительных ситуаций в WordPress. Однако, стоит также рассмотреть возможность проверки работы с плагинами или темами, которые могли бы повлиять на правильность отображения метаданных в данном режиме.