我制作了两个自定义类:
我正在对一系列内容进行自定义计算,我想将其保存在post\\u元字段的数组中。
This is how I save it
$obj1 = new FooBar();
$obj2 = new BarSchizzle();
$obj3 = new FooBar();
$arr = [
\'a_key\' => $obj1,
\'another_key\' => $obj2,
\'a_third_key\' => $obj3,
];
update_post_meta( $post_ID, \'my_custom_field\', $arr );
// I also tried this, with same result
// update_post_meta( $post_ID, \'my_custom_field\', serialize( $arr ) );
This is how I retrieve the array
$initial_arr = get_post_meta( $post_ID, \'my_custom_field\', true );
$arr = unserialize( $initial_arr ); // And this is where the error occurs
我收到错误信息:
unserialize() [function.unserialize]: Error at offset ...
(您可以阅读更多信息
here).
我的理论是,WordPress没有加载(需要)我的自定义类,当它得到(并且未序列化)时。
我只需要简单地将这些类插入functions.php
-文件,在顶部,如下所示:
require_once( __DIR__ . \'/classes/FooBar.php\' );
require_once( __DIR__ . \'/classes/BarSchizzle.php\' );
。。。不在任何钩子或任何东西里面。感觉有点邋遢/糟糕,但到目前为止一直工作得很好。
<小时/>
So this leaves me with two questions:
<我是否需要将我对自定义类的需求放入钩子中,例如
init
还是什么$arr, 是否包含自定义对象
SO网友:anton
数组和对象会自动序列化/取消序列化,因为它们是由MySQL存储为字符串的php数据类型。如果使用update\\u post\\u meta保存数组,则不需要取消序列化返回值get\\u post\\u meta,函数将为您执行此操作。
更容易查看update_post_meta 函数的源代码。它调用update_metadata 函数,您可以在其中看到此函数的调用:
maybe_serialize( $meta_value );
如您所见,如果数据是数组或对象类型,它将序列化此数据。
function maybe_serialize( $data ) {
if ( is_array( $data ) || is_object( $data ) ) {
return serialize( $data );
}
从另一边,当您使用
get_post_meta 函数,此
chain
更大,但最后它调用maybe\\u unserialize函数,如果需要,该函数将执行非序列化。
maybe_unserialize( string $data )
在您的情况下,您正在尝试取消序列化非序列化字符串。serialize()函数返回false,如果无法取消序列化值,则会生成E\\u通知。