Невозможно сохранить ассоциативный массив с помощью функции 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 );
}

Рекомендации:

Другие вопросы по тегам