Логические и целочисленные значения являются строками после сериализации


Я использую 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 (очевидно)

РЕДАКТИРОВАТЬ: только что заметил, что целые числа также сохраняются в виде строк

Author: Xaver, 2013-10-01

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 или выше устранит эту проблему.

 6
Author: jnhghy - Alexandru Jantea, 2013-10-11 06:24:54