Логические и целочисленные значения являются строками после сериализации
Я использую WordPress update_post_meta для сохранения массива, подобного
$obj = array(
'array' => array(1, 'zwei', !!3),
'string' => 'abc',
'bool' => true,
'bool2' => false,
'integer' => 1,
'integer2' => 17
);
update_post_meta($post_ID, 'my-key', $obj);
Однако, если я проверю необработанное поле, я получу
a:6:{s:5:"array";a:3:{i:0;i:1;i:1;s:4:"zwei";i:2;s:1:"1";}s:6:"string";s:3:"abc";s:4:"bool";s:1:"1";s:5:"bool2";s:1:"0";s:7:"integer";i:1;s:8:"integer2";i:17;}
В то время как это должно быть
a:6:{s:5:"array";a:3:{i:0;i:1;i:1;s:4:"zwei";i:2;b:1;}s:6:"string";s:3:"abc";s:4:"bool";b:1;s:5:"bool2";b:0;s:7:"integer";i:1;s:8:"integer2";i:17;}
Вы можете заметить, что все логические значения хранятся в виде строки (b:1 = s:1:"1"
)
Проблема заключается только в определенных установках WordPress, а не в каждой из них. Я также проверил функцию сериализации , которая работает правильно (возвращает b:1
)
Также используя get_пост_мета
get_post_meta($post_ID, 'my-key', true);
И проверка значения с помощью is_bool возвращает false (очевидно)
РЕДАКТИРОВАТЬ: только что заметил, что целые числа также сохраняются в виде строк
1 answers
Update_post_meta использует update_metadata вы можете найти его код здесь в этой функции, если вы посмотрите в строке 119, вы увидите, что мета_значение передается wp_unslash, возвращаемое значение которого является строкой (функция, которая изменяет тип данных, - это stripslashes_deep)
В качестве обходного пути вы можете сериализовать значение перед передачей его в update_post_meta()
ИЗМЕНИТЬ:
Обнаружена проблема: до версии 3.6.0 update_metadata имел в строке 117 этот код:
$meta_key = stripslashes($meta_key)
Косые черты - это функция php, которая возвращает строку.
по состоянию на 3.6.0 эта строка выглядит следующим образом:
$meta_key = wp_unslash($meta_key);
Который перекрывает только строковый тип meta_keys.
Обновление wordpress версии 3.6.0 или выше устранит эту проблему.