В работе с WordPress часто возникает необходимость массового обновления метаданных (custom fields) для постов, пользователей или других сущностей. Особенно актуальна эта задача, если вы хотите изменить структуру данных, исправить ошибки или синхронизировать информацию с внешними сервисами. В этой статье я расскажу, как автоматизировать обновление метаданных с помощью PHP-кода, а также приведу примеры использования популярных плагинов для упрощения этой задачи.
Почему важно автоматизировать обновление метаданных
Метаданные в WordPress играют важную роль: они позволяют хранить дополнительную информацию, которая не входит в стандартные поля постов или пользователей. Однако при ручном обновлении метаданных, особенно если их много, легко допустить ошибки или потратить слишком много времени. Автоматизация позволяет:
- Обновить сразу множество записей одним скриптом;
- Обеспечить консистентность данных;
- Встроить обновление в процессы импорта или миграции;
- Избежать ошибок при ручном вводе.
Рассмотрим реализацию на примере обновления метаданных постов.
Используем WP_Query и update_post_meta для массового обновления
Самый простой способ — написать PHP-скрипт, который с помощью WP_Query получает нужные посты, и для каждого обновляет или добавляет метаданные через update_post_meta. Пример кода:
function premiumwp_update_post_meta_automatically() {
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'premiumwp_old_meta',
'compare' => 'EXISTS'
]
]
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
// Читаем старое значение
$old_value = get_post_meta($post_id, 'premiumwp_old_meta', true);
// Логика преобразования метаданных
$new_value = 'Updated: ' . $old_value;
// Обновляем новое мета поле
update_post_meta($post_id, 'premiumwp_new_meta', $new_value);
// Удаляем старое мета поле, если нужно
// delete_post_meta($post_id, 'premiumwp_old_meta');
}
wp_reset_postdata();
}
}
// Запуск функции, например, при инициализации админки
add_action('admin_init', 'premiumwp_update_post_meta_automatically');
Этот код найдет все посты с метаданными premiumwp_old_meta, преобразует их и сохранит в новом мета поле. Если нужно, удалит старое.
Обновление метаданных пользователей и других объектов
Аналогично можно обновлять метаданные пользователей и терминов. Для пользователей используется get_users и update_user_meta:
function premiumwp_update_user_meta_automatically() {
$users = get_users(['meta_key' => 'premiumwp_old_user_meta']);
foreach ($users as $user) {
$old_value = get_user_meta($user->ID, 'premiumwp_old_user_meta', true);
$new_value = strtoupper($old_value); // пример преобразования
update_user_meta($user->ID, 'premiumwp_new_user_meta', $new_value);
}
}
add_action('admin_init', 'premiumwp_update_user_meta_automatically');
Для терминов — get_terms и update_term_meta.
Автоматизация с помощью плагинов: когда стоит использовать
Если вы не хотите писать код или хотите более гибкий интерфейс, можно использовать плагины для управления метаданными:
- Advanced Custom Fields (ACF) — позволяет создавать и обновлять метаполя, но массовое обновление требует дополнительного кода или расширений.
- Clearfy Pro — плагин для оптимизации и чистки базы данных. Позволяет удалять и оптимизировать метаданные, что полезно при работе с избыточными или устаревшими метаполями.
- WP All Import + WP All Export — для сложных задач импорта и обновления метаданных с CSV или XML. Позволяет автоматизировать обновление через cron.
Например, с помощью Clearfy Pro можно быстро удалить неиспользуемые метаполя, освободив место и ускорив работу сайта. Подробнее о Clearfy Pro читайте на официальной странице.
Обработка больших объемов метаданных и производительность
При обновлении большого количества метаданных важно учитывать нагрузку на сервер и время выполнения скриптов. Рекомендую:
- Разбивать обработку на партии (например, по 100 постов за раз), чтобы избежать таймаутов;
- Запускать обновление через WP-CLI — это быстрее и надежнее, чем через HTTP-запросы;
- Использовать транзиенты или опции для сохранения прогресса обработки;
- Тестировать на копии сайта, чтобы избежать сбоев на рабочем ресурсе.
Пример с разбивкой на партии:
function premiumwp_update_post_meta_batch($offset = 0, $batch_size = 100) {
$args = [
'post_type' => 'post',
'posts_per_page' => $batch_size,
'offset' => $offset,
'meta_query' => [
[
'key' => 'premiumwp_old_meta',
'compare' => 'EXISTS'
]
]
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return false; // Все обработано
}
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
$old_value = get_post_meta($post_id, 'premiumwp_old_meta', true);
$new_value = 'Updated batch: ' . $old_value;
update_post_meta($post_id, 'premiumwp_new_meta', $new_value);
}
wp_reset_postdata();
return true; // Есть еще посты
}
Такую функцию можно вызывать по cron или через WP-CLI с увеличением $offset.
Использование WP-CLI для обновления метаданных
WP-CLI — мощный инструмент для выполнения команд WordPress из командной строки. Пример команды для обновления метаданных:
wp post meta update $(wp post list --post_type=post --field=ID) premiumwp_new_meta 'Новое значение'
Для более сложных сценариев лучше написать кастомную команду WP-CLI:
if (class_exists('WP_CLI')) {
WP_CLI::add_command('premiumwp update-meta', function($args, $assoc_args) {
$batch_size = $assoc_args['batch-size'] ?? 100;
$offset = 0;
while (true) {
$args = [
'post_type' => 'post',
'posts_per_page' => $batch_size,
'offset' => $offset,
'meta_query' => [
['key' => 'premiumwp_old_meta', 'compare' => 'EXISTS'],
],
];
$query = new WP_Query($args);
if (!$query->have_posts()) break;
foreach ($query->posts as $post) {
$old_value = get_post_meta($post->ID, 'premiumwp_old_meta', true);
$new_value = 'CLI updated: ' . $old_value;
update_post_meta($post->ID, 'premiumwp_new_meta', $new_value);
}
wp_reset_postdata();
$offset += $batch_size;
}
WP_CLI::success('Обновление метаданных завершено');
});
}
Заключение по обновлению метаданных в WordPress
Автоматизация обновления метаданных в WordPress — важный навык, который поможет вам поддерживать сайт в актуальном состоянии, проводить миграции и обеспечивать качество данных. Используйте WP_Query и функции update_post_meta, update_user_meta или update_term_meta для программной обработки, а для сложных и регулярных задач — WP-CLI или специализированные плагины, например, Clearfy Pro.