Вопрос или проблема
Я хочу удалить элемент (id записи) из сериализованного массива, связанного с определенным meta_key. Следующий скриншот рассказывает всю историю.
На что вы смотрите, так это на id записей, сохраненные в сериализованном массиве. При удалении любой записи id записи должен быть удален из meta_value, где meta_key равен “whatever”. Я хочу обернуть unset для элементов (как ключ, так и значение) внутри функции, как показано ниже. Звучит сложно для меня.
add_action('before_delete_post', 'upon_deleting_post');
function upon_deleting_post($post_id){
....
};
Не сосредотачивайтесь на сериализованном аспекте этого.
- Получите данные, используя соответствующую API функцию.
- Измените данные.
- Сохраните данные обратно.
API WordPress заботятся о сериализации прозрачно, нет необходимости с этим непосредственно возиться.
Ответ или решение
Чтобы удалить элемент (идентификатор поста) из сериализованного массива, связанного с определенным meta_key
, при удалении поста в WordPress, необходимо реализовать функционал в вашем плагине или теме. В этой инструкции мы подробно рассмотрим шаги для достижения этой цели, следуя принципу разработки через использование соответствующих API WordPress.
Шаг 1: Получение данных с помощью API WordPress
Для начала, нужно получить значение мета-поля, связанного с идентификатором поста, который вы собираетесь удалить. Используйте функцию get_post_meta()
, чтобы извлечь сериализованный массив.
Шаг 2: Модификация данных
После извлечения данных, вам необходимо преобразовать массив, удалив из него идентификатор поста, который был удалён. Для этого стоит использовать функцию array_filter()
или array_diff()
для эффективного удаления нужного элемента.
Шаг 3: Сохранение данных обратно
После внесения изменений в массив, сохраните его обратно с помощью функции update_post_meta()
. При этом WordPress сам позаботится о сериализации данных для вас.
Код реализации
Ниже представлена примерная реализация, которая включается в хук before_delete_post
:
add_action('before_delete_post', 'upon_deleting_post');
function upon_deleting_post($post_id) {
// Определяем ключ мета-поля
$meta_key = 'whatever';
// Получаем текущее значение мета-поля
$meta_value = get_post_meta($post_id, $meta_key, true);
// Убедимся, что мы получили массив
$ids_array = is_array($meta_value) ? $meta_value : [];
// Удаляем идентификатор поста из массива
if (($key = array_search($post_id, $ids_array)) !== false) {
unset($ids_array[$key]);
}
// Сохраняем обратно измененный массив
update_post_meta($post_id, $meta_key, array_values($ids_array));
}
Пояснения к коду
- Хук
before_delete_post
– выполняется перед удалением поста, что позволяет обработать данные до их окончательной потери. - Получение мета-данных – используется функция
get_post_meta()
, которая получает сериализованные данные, сохраняемые в базе данных. - Проверка и модификация – мы проверяем, является ли полученное значение массивом, а затем используем
array_search()
для нахождения индекса удаляемого поста иunset()
для его удаления. - Сохранение мета-данных – функция
update_post_meta()
сохраняет измененный массив обратно, где WordPress автоматически сериализует его, если это необходимо.
Заключение
Следуя описанным шагам, вы сможете эффективно удалить идентификатор поста из связанного мета-поля при его удалении. Такой подход не требует манипуляций с сериализацией напрямую, позволяя вам использовать мощь встроенных функций WordPress для управления метаданными.