【问题标题】:Unable saving an associative array using add_post_meta() function无法使用 add_post_meta() 函数保存关联数组
【发布时间】: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] 创建索引数组

标签: php mysql wordpress wordpress-theming associative-array


【解决方案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 );
}

参考资料:

【讨论】:

  • 我认为我的两个问题与同一个问题有关。我现在明白了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2017-03-09
  • 1970-01-01
  • 2018-09-14
相关资源
最近更新 更多