Невозможно сохранить ассоциативный массив с помощью функции add_post_meta()
Мне нужно запустить функцию шифрования на каждом члене ассоциативного массива до его сохранения в 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' );
}
Я вижу, что данные зашифрованы. Вот print_r($my_data)
после for
цикл:
Array
(
[0] => Array
(
[username] => ®ØåÛâÏ0…"ë°?mˤÙ
[password] => xSFç„L¶·3z˜'J0ÖRÅÎj
)
)
Но мета-ключ post не создается, и ошибка не генерируется. Мета-ключ еще не существует в таблице postmeta add_post_meta()
возвращает false и ключ / значение никогда не добавляется.
Кто-нибудь видит, что я делаю не так?
Я не уверен, как сказать, но я думаю, что [0] является именованным ключом, а не индексным ключом. Я говорю это, потому что я могу создать более одного и удалить элемент [0], а один оставшийся элемент по-прежнему показывает [1], используя print_r
,
1 ответ
В вашем
if ( ! add_post_meta( $post_id, '_my_data', $my_data, true ) ) {
ты используешьadd_post_meta()
Функция и последний аргумент установлены вtrue
,
Так должно бытьfalse
вместо этого, потому что вы вставляетеarray
и НЕ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 );
}
Рекомендации: