无法使用 add_post_meta() 函数保存关联数组
Unable saving an associative array using add_post_meta() function
我需要在将关联数组的每个成员保存到 wp_postmeta
table 之前对其进行 运行 加密函数。我的表单允许动态 add/delete 行。我一直在尝试使用 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' );
}
我可以看到数据正在加密。这是 print_r($my_data)
在 for
循环之后:
Array
(
[0] => Array
(
[username] => ®ØåÛâÏ0…"ë°?mˤÙ
[password] => xSFç„L¶·3z˜'J0ÖRÅÎj
)
)
但是 post 元键没有创建,也没有产生错误。 post元 table 中不存在元键,但 add_post_meta()
returns 为假,并且从未添加 key/value。
有人看到我做错了什么吗?
我不知道怎么说,但我认为 [0] 是命名键而不是索引键。我这么说是因为我可以创建多个并删除 [0] 元素,而剩余的单个元素仍然显示 [1] 使用 print_r
.
In your if ( ! add_post_meta( $post_id, '_my_data', $my_data, true ) ) {
you are using add_post_meta()
function and last argument is set to true
.
It should be false
instead, because you are inserting an array
and NOT a string
.
For this reason your if
statement is not working properly.
相反,您的代码应该是 (因为 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 );
}
参考文献:
我需要在将关联数组的每个成员保存到 wp_postmeta
table 之前对其进行 运行 加密函数。我的表单允许动态 add/delete 行。我一直在尝试使用 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' );
}
我可以看到数据正在加密。这是 print_r($my_data)
在 for
循环之后:
Array
(
[0] => Array
(
[username] => ®ØåÛâÏ0…"ë°?mˤÙ
[password] => xSFç„L¶·3z˜'J0ÖRÅÎj
)
)
但是 post 元键没有创建,也没有产生错误。 post元 table 中不存在元键,但 add_post_meta()
returns 为假,并且从未添加 key/value。
有人看到我做错了什么吗?
我不知道怎么说,但我认为 [0] 是命名键而不是索引键。我这么说是因为我可以创建多个并删除 [0] 元素,而剩余的单个元素仍然显示 [1] 使用 print_r
.
In your
if ( ! add_post_meta( $post_id, '_my_data', $my_data, true ) ) {
you are usingadd_post_meta()
function and last argument is set totrue
.
It should befalse
instead, because you are inserting anarray
and NOT astring
.
For this reason yourif
statement is not working properly.
相反,您的代码应该是 (因为 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 );
}
参考文献: