Когда я пытаюсь выполнить этот код
update_post_meta( $id, "_woocommerce_my_meta", 'a:1:{s:4:"gtin";s:13:"10";}' );
Мета менялась на
s:27:"a:1:{s:4:"gtin";s:13:"10";}";
Просто изменив код на
update_post_meta( $id, "_woocommerce_my_meta", ':a:1:{s:4:"gtin";s:13:"10";}' );
добавив «:» в конце строки, это работает …
Но мне это не нужно «:» Это ошибка функции? Или есть какая-то причина для этого? Или как-то обойти эту проблему?
Это не ошибка. У WordPress есть причина для этого. Поскольку WordPress автоматически сериализует объекты и массивы, он должен различать между meta_value базы данных, которая является сериализацией, и meta_value, которая на самом деле является просто строкой, которая выглядит как сериализация. Чтобы понять это примечание, что update_post_meta () вызывает Maybe_serialize ()
function maybe_serialize( $data ) {
if ( is_array( $data ) || is_object( $data ) )
return serialize( $data );
// Double serialization is required for backward compatibility.
// See https://core.trac.wordpress.org/ticket/12930
// Also the world will end. See WP 3.6.1.
if ( is_serialized( $data, false ) )
return serialize( $data );
return $data;
}
Обратите внимание, что если мета-значение является сериализованной строкой, оно снова сериализуется.
update_post_meta () и get_post_meta () автоматически обрабатывают сериализацию и десериализацию для объектов и массивов. Вы уверены, что вам нужно использовать сериализованное значение при вызове update_post_meta ()? Обратите внимание, что get_post_meta () десериализует сериализованную строку и вернет исходную строку.
Других решений пока нет …