get_post_meta — проблема с несериализацией — возвращает логическое значение (false)

Я использую простой пользовательский плагин, который анализирует и сохраняет внешние данные XML в виде сериализованного массива в настраиваемом поле. Это работает нормально, однако, когда я обновляю сообщение, вместо массива я вижу только сообщение «bool (false)». Я предполагаю, что это связано с сериализацией / десериализацией, но не нашел никаких подсказок.

Мне нужно было сериализовать, когда я обновляю метаданные поста update_post_meta($post_id, 'tb_data', serialize($new_value_array)); Опуская сериализацию как update_post_meta($post_id, 'tb_data', $new_value_array); не хранит никаких данных в настраиваемом поле. Кроме того, я должен использовать maybe_unserialize(get_post_meta($post->ID, 'tb_data', true)); распечатать результаты.

Есть 2 настраиваемых поля, (1) tb_item_group_id и (2) tb_data. Значение tb_data будет добавлено с помощью функции ниже,

Функция, которую я использую для обновления мета-сообщения, приведена ниже.

function parse_file_func($title) {
// get_tickets_array();exit;
$language = explode('-', get_bloginfo('language'));
$language = $language[0];
$file = file_get_contents('https://dl.dropboxusercontent.com/u/12344450/feed.xml');
if (!$file) {
exit;
}
$domObj = new xmlToArrayParser($file);
$domArr = $domObj->array;
if (($domObj->parse_error)) {
echo $domObj->get_xml_error();
} else {
$first = $domArr['rss']['channel']['item'];
foreach ($first as $item) {
if ($item['languageCode'] == $language) {
$args = array(
'meta_key' => 'tb_item_group_id',
'meta_value' => $item['g:item_group_id'],
'post_type' => 'tickets',
);
$post = get_posts($args);
if (empty($post)) {
continue;
} else {
$args = array(
'meta_key' => 'tb_item_group_id',
'meta_value' => $item['g:item_group_id'],
'post_type' => 'tickets',
);
$post = get_posts($args);
$post_id = $post[0]->ID;
$meta_values = get_post_meta($post_id, 'tb_data');
if (empty($meta_values)) {
$new_value_array = array();
unset($item['cdata']);
$new_value_array['tb_' . $item['g:item_group_id'] . '_' . $item['ticketID']] = $item;
}
else {
$meta_arrays = unserialize($meta_values[0]);
$new_value_array = $meta_arrays;
foreach ($meta_arrays as $meta_ticketbar => $tb_content) {
if ($meta_ticketbar == 'tb_' . $item['g:item_group_id'] . '_' . $item['ticketID']) {
unset($item['cdata']);
$new_value_array[$meta_ticketbar] = $item;
} else {
$new_value_array = $meta_arrays;
unset($item['cdata']);
$new_value_array['tb_' . $item['g:item_group_id'] . '_' . $item['ticketID']] = $item;
}
}
}
update_post_meta($post_id, 'tb_data', serialize($new_value_array));
// update_post_meta($post_id, 'tb_data', base64_encode($new_value_array));
}
} else {
continue;
}
}
}
}

и отображение на передней панели с помощью get_post_meta

<?php
// $tb_meta = get_post_meta($post->ID, 'tb_data', true);
$tb_meta = get_post_meta($post->ID, 'tb_data', true);
$tb_meta_unserialized = maybe_unserialize( $tb_meta );
?>
<pre><?php
// print_r ($tb_meta_unserialized);
var_dump($tb_meta_unserialized);
?></pre>

0

Решение

Мне удалось это исправить самостоятельно.

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

update_post_meta($post_id, 'tb_data', base64_encode(serialize($new_value_array)));

…и следующий код, чтобы получить пост мета

$tb_meta = get_post_meta($post->ID, 'tb_data', true);
$tb_meta_unserialized = unserialize(base64_decode($tb_meta));

Надеюсь, это кому-нибудь поможет.

0

Другие решения

Для меня это была простая глупость
При вызове идентификатора поста вы не должны использовать возврат «echoed»:

Внутри петли внутри get_post_meta() ты должен использовать get_the_ID() вместо the_ID(),

призвание get_post_meta(the_ID(), $key, true) вернусь boolean(false) потому что идентификатор не является действительным (мы можем так сказать?) идентификатором поста.

Надеюсь, это поможет кому-то не тратить 30 минут на это, как я.

0