无法使用 add_post_meta() 函数保存关联数组

Posted

技术标签:

【中文标题】无法使用 add_post_meta() 函数保存关联数组【英文标题】:Unable saving an associative array using add_post_meta() function 【发布时间】:2016-12-16 01:13:41 【问题描述】:

在将关联数组的每个成员保存到wp_postmeta 表之前,我需要对其运行加密函数。我的表单允许动态添加/删除行。我一直在尝试使用array_walk() 让它工作。

这是表单的配置方式:

<input type="text" id="z_my_data[][username]" name="z_my_data[0][username]">
<input type="text" id="z_my_data[][password]" name="z_my_data[0][password]">

这是在“save_post”操作上运行的:

// Save encrypted data to post meta
if (isset($_POST['z_my_data']))   

    // Get posted form variables
    $my_data = $_POST['z_my_data'];

    // Encrypt each member of each row
    for ($i = 0; $i < count($my_data); $i++) 
        $cryptKey = $this->cryptKey;
        array_walk($my_data[strval($i)], create_function('&$val', 'global $cryptKey; $val = Crypto::encrypt($val, $cryptKey);'));
    

    if ( ! add_post_meta( $post_id, '_my_data', $my_data, true ) )  
        update_post_meta( $post_id, '_my_data', $my_data);
    

 else 
    delete_post_meta( $post_id, '_my_data' );

我可以看到数据正在被加密。这是for循环之后的print_r($my_data)

Array
(
    [0] => Array
        (
            [username] => ®ØåÛâÏ0…"ë°?mˤÙ
            [password] => xSFç„L¶·3z˜'J0ÖRÅÎj
        )

)

但是没有创建 post 元键,也没有生成错误。元键在 postmeta 表中不存在,但 add_post_meta() 返回 false 并且从未添加键/值。

有人看到我做错了吗?

我不知道该怎么说,但我认为 [0] 是命名键而不是索引键。我这么说是因为我可以创建多个并删除 [0] 元素,而剩下的单个元素仍然使用 print_r 显示 [1]。

【问题讨论】:

在条件块if ( ! add_post_meta.... 中,放置一个else 条件并做一些处理。 @JeremyHarris add_post_meta 如果它已经存在则返回 false。如果添加成功,则返回 true。我错过了你的意思吗? But the post meta key is not created and no error is generated.... 很明显 if 语句返回 false 。您将unique 参数设置为true(最后一个),因此您可能遇到了重复值。你想怎么处理?添加else 条件并处理它:-) @JeremyHarris 你是对的。添加失败并返回false,然后更新也失败。但是添加应该添加了帖子元。没有重复项。 postmeta 表只有 9 行,所以我可以看到它们。所以......添加失败,我接下来该怎么办?似乎 $my_data 的格式不正确,但我猜。 [0] is a named key 因为您使用的是$my_data[strval($i)]。相反,只需使用$my_data[$i] 创建索引数组 【参考方案1】:

在您的 if ( ! add_post_meta( $post_id, '_my_data', $my_data, true ) ) 中,您使用的是 add_post_meta() 函数,最后一个参数设置为 true应该是 @987654328 @ 而不是,因为您要插入 arrayNOT string。 因此,您的 if 声明无法正常工作

相反,您的代码应该是(因为add_post_meta 最后一个参数默认值为false

if ( ! add_post_meta( $post_id, '_my_data', $my_data ) )  
    update_post_meta( $post_id, '_my_data', $my_data );


或者,你也可以使用这个:

if ( ( !empty( get_post_meta( $post_id, '_my_data' ) ) )  
    update_post_meta( $post_id, '_my_data', $my_data );


参考资料:

WordPress Code Reference - add_post_meta WordPress Code Reference - update_post_meta WordPress Code Reference - get_post_meta

【讨论】:

我认为我的两个问题与同一个问题有关。我现在明白了,谢谢!

以上是关于无法使用 add_post_meta() 函数保存关联数组的主要内容,如果未能解决你的问题,请参考以下文章

WP 插入 post PHP 函数和自定义字段

无法将异步函数的结果保存到对象

无法将来自 Alamofire GET 请求的 JSON 数据保存到函数的局部变量

如何从 R 中的 animate 函数中保存 GIF 图像?

.save() 无法使用 async/await 正确保存到 mongoDB

无法在 Linux 上使用 C++ 保存文本文件