Вопрос или проблема
$old = get_post_meta($post_id, 'figure_sugsubject_repeatable_fields', true);
$new = array();
$figuresugsubjectpositions = $_POST['figuresugsubjectposition'];
$figuresugsubjectworkplaces = $_POST['figuresugsubjectworkplace'];
$figuresugsubjectlocations = $_POST['figuresugsubjectlocation'];
$figuresugsubjectfroms = $_POST['figuresugsubjectfrom'];
$figuresugsubjectstatuss = $_POST['figuresugsubjectstatus'];
$count = count( $figuresugsubjectpositions );
for ( $i = 0; $i < $count; $i++ ) {
if ( $figuresugsubjectpositions[$i] != '' ) :
$new[$i]['figuresugsubjectposition'] = stripslashes( strip_tags( $figuresugsubjectpositions[$i] ) );
$new[$i]['figuresugsubjectworkplace'] = $figuresugsubjectworkplaces[$i];
$new[$i]['figuresugsubjectlocation'] = $figuresugsubjectlocations[$i];
$new[$i]['figuresugsubjectfrom'] = $figuresugsubjectfroms[$i];
$new[$i]['figuresugsubjectstatus'] = $figuresugsubjectstatuss[$i];
endif;
}
if ( !empty( $new ) && $new != $old )
update_post_meta( $post_id, 'figure_sugsubject_repeatable_fields', $new );
elseif ( empty($new) && $old )
delete_post_meta( $post_id, 'figure_sugsubject_repeatable_fields', $old );
У меня есть форма на фронтенде для отправки постов. Я хочу, чтобы новые записи в форме не заменяли старые, а добавлялись к ним. Я предполагаю, что проблема заключается в функции update_post_meta. Она сохраняет новые записи поверх старых. Есть ли способ сохранить старые записи и добавить новые с новыми ключами?
Пожалуйста, попробуйте заменить:
update_post_meta( $post_id, 'figure_sugsubject_repeatable_fields', $new );
на:
add_post_meta( $post_id, 'figure_sugsubject_repeatable_fields', $new );
чтобы добавить больше значений, связанных с мета-ключом figure_sugsubject_repeatable_fields
.
Вам также следует рассмотреть возможность использования filter_input()
вместо $_POST
.
Ответ или решение
Для решения задачи обновления метаданных поста без удаления старых записей, следует внести изменения в код, отвечающий за обработку данных из формы. Ваша текущая реализация фактически перезаписывает старые данные новыми, что не соответствует вашему запросу сохранить все предыдущие записи.
Проблема с текущим кодом
В вашем коде используется функция update_post_meta
, которая обновляет метаданные существующего ключа. Если вы хотите добавить новые записи, вам следует использовать функцию add_post_meta
. Эта функция позволит вам добавлять новые значения к существующим метаданным, не затрагивая уже сохраненные данные.
Оптимизированное решение
Внесем необходимые изменения в код:
$old = get_post_meta($post_id, 'figure_sugsubject_repeatable_fields', true);
$new = array();
$figuresugsubjectpositions = $_POST['figuresugsubjectposition'];
$figuresugsubjectworkplaces = $_POST['figuresugsubjectworkplace'];
$figuresugsubjectlocations = $_POST['figuresugsubjectlocation'];
$figuresugsubjectfroms = $_POST['figuresugsubjectfrom'];
$figuresugsubjectstatuss = $_POST['figuresugsubjectstatus'];
$count = count($figuresugsubjectpositions);
for ($i = 0; $i < $count; $i++) {
if ($figuresugsubjectpositions[$i] != '') :
$new[$i]['figuresugsubjectposition'] = stripslashes(strip_tags($figuresugsubjectpositions[$i]));
$new[$i]['figuresugsubjectworkplace'] = $figuresugsubjectworkplaces[$i];
$new[$i]['figuresugsubjectlocation'] = $figuresugsubjectlocations[$i];
$new[$i]['figuresugsubjectfrom'] = $figuresugsubjectfroms[$i];
$new[$i]['figuresugsubjectstatus'] = $figuresugsubjectstatuss[$i];
endif;
}
// Добавляем новые данные вместо обновления
if (!empty($new)) {
foreach ($new as $value) {
add_post_meta($post_id, 'figure_sugsubject_repeatable_fields', $value);
}
}
Объяснение исправлений
-
Использование
add_post_meta
: Вместоupdate_post_meta
, мы передаем каждую новую запись вadd_post_meta
. Это гарантирует, что созданные записи будут добавлены, а не перезаписаны. -
Цикл добавления данных: Каждая новая величина из массива
$new
обрабатывается индивидуально, что позволяет добавлять множество новых записей без удаления существующих.
Дополнительные рекомендации
- Безопасность данных: Рассмотрите возможность использования функции
filter_input()
, чтобы избежать прямого доступа к массиву$_POST
. Это поможет улучшить безопасность вашего кода, отслеживая данные, поступающие от пользователей.
Например:
$figuresugsubjectpositions = filter_input(INPUT_POST, 'figuresugsubjectposition', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
$figuresugsubjectworkplaces = filter_input(INPUT_POST, 'figuresugsubjectworkplace', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
- Эффективность: Убедитесь, что вы также выполняете проверку на уникальность записей, чтобы избежать дублирования данных. Это можно сделать, сравнивая новые данные с уже существующими значениями перед добавлением.
Заключение
Внесенные изменения позволят вам эффективно добавлять новые записи в метаданные поста без удаления старых. Правильное использование функций WordPress для работы с метаданными повышает надежность вашего приложения, а следование рекомендациям по безопасности защищает вашу систему от возможных уязвимостей.