【问题标题】:update_post_meta save as Array Array array instead of serializing dataupdate_post_meta 保存为 Array 数组而不是序列化数据
【发布时间】:2020-06-27 18:05:57
【问题描述】:

我正在使用 update_post_meta 将数组的值保存在数据库中,

$array_of_something = [['daysOfWeek' => [1],
        'startTime' => '09:00',
        'endTime' => '10:00'], [
        'daysOfWeek' => [2],
        'startTime' => '09:00',
        'endTime' => '10:00'], [
        'daysOfWeek' => [3],
        'startTime' => '09:00',
        'endTime' => '10:00'], [
        'daysOfWeek' => [4],
        'startTime' => '09:00',
        'endTime' => '10:00'], [
        'daysOfWeek' => [1],
        'startTime' => '11:00',
        'endTime' => '12:00'], [
        'daysOfWeek' => [3],
        'startTime' => '11:00',
        'endTime' => '12:00']];
update_post_meta($post_id, 'my_meta_of_the_post', $array_of_something);

基于codex的文档:

传入的数组会被序列化成字符串

但数据会保存到数据库中,例如:

数组数组数组数组数组数组

当我获取数据时使用

get_post_meta($post_id, 'my_meta_of_the_post', true);

我会得到:

数组数组数组数组数组数组

但我希望值得到序列化并保存在数据库中,有趣的是,如果我用它做精确的操作

$array_of_something = [[['a'=>['value_aa','value_ab'],'b'=>'value_of_b']],[['c'=>['value_ca','value_cb'],'d'=>'value_of_d']]];

值被序列化并正确保存在数据库中。

如果我在使用 update_post_meta 保存之前序列化$array_of_something,则值在数据库中被双重序列化,我在调用get_post_meta 时必须使用反序列化两次,当我取回它时,第一个反序列化工作正常,但第二个有值周围有一个<p> ... </P> 标记,该值是可以的,但因为

它周围的

标记不会取消序列化并返回 false

【问题讨论】:

    标签: wordpress serialization


    【解决方案1】:

    我很确定您的代码中存在本地问题。我运行了您在问题中输入的代码,并按预期保存到数据库中。 a:6:{i:0;a:3:{s:10:"daysOfWeek";a:1:{i:0;i:1;}s:9:"startTime";s:5:"09:00";s:7:"endTime";s:5:"10:00";}i:1;a:3:{s:10:"daysOfWeek";a:1:{i:0;i:2;}s:9:"startTime";s:5:"09:00";s:7:"endTime";s:5:"10:00";}i:2;a:3:{s:10:"daysOfWeek";a:1:{i:0;i:3;}s:9:"startTime";s:5:"09:00";s:7:"endTime";s:5:"10:00";}i:3;a:3:{s:10:"daysOfWeek";a:1:{i:0;i:4;}s:9:"startTime";s:5:"09:00";s:7:"endTime";s:5:"10:00";}i:4;a:3:{s:10:"daysOfWeek";a:1:{i:0;i:1;}s:9:"startTime";s:5:"11:00";s:7:"endTime";s:5:"12:00";}i:5;a:3:{s:10:"daysOfWeek";a:1:{i:0;i:3;}s:9:"startTime";s:5:"11:00";s:7:"endTime";s:5:"12:00";}}

    您有能力逐步调试您的代码吗?如果可能的话,我会进入 WordPress 目录中的 wp-includes/meta.php 文件并在第 183、222 和 267 行放置断点(从 WordPress 的最新版本开始,但我确信行号与几个版本相匹配)。

    wp-includes/meta.php:183

    $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type, $meta_subtype );
    
    • 这通过 WordPress 过滤器运行(在本例中为“sanitize_post_meta_my_meta_of_the_post”)

    wp-includes/meta.php:222

    $meta_value = maybe_serialize( $meta_value );
    
    • 这是 WordPress 序列化数据的地方(如果适用)

    wp-includes/meta.php:267

    $result = $wpdb->update( $table, $data, $where );
    
    • 这是 WordPress 在数据库中实际存储值的位置

    您能否运行这些并报告每行执行前后的每个值是什么?

    【讨论】:

    • 谢谢,我删除了整个项目设置一个新的 wordpress 并将插件添加到新站点,它开始正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多