Вопрос или проблема
Я пытаюсь создать кнопку, которая будет создавать страницу и наполнять её всеми моими данными ACF (несколько повторяющихся полей с уже заполненными редакторами WYSIWYG и т.д.). Я использую ACF-extended, так что все мои данные ACF сохраняются в одном поле под ID страницы.
Это работает, но не совсем. Всё будет работать нормально, если добавить кучу гибкого контента с изображениями, кнопками и т.д. Но как только вы добавляете поле WYSIWYG с каким-то контентом и HTML, это как-то ломается.
$check_page_exist = get_page_by_title($title, 'OBJECT', 'page');
// Проверяем, существует ли страница
if (empty($check_page_exist)) {
$page_id = wp_insert_post(
array(
'comment_status' => 'close',
'ping_status' => 'close',
'post_author' => 1,
'post_title' => ucwords($title),
'post_name' => strtolower(str_replace(' ', '-', trim($title))),
'post_status' => 'publish',
'post_type' => 'page',
)
);
$posts = get_posts(
array(
'post_type' => 'page',
'title' => $title,
'post_status' => 'all',
'numberposts' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'orderby' => 'post_date ID',
'order' => 'ASC',
)
);
$id = $posts[0]->ID;
global $wpdb;
$table_name = $wpdb->prefix . 'postmeta';
$wpdb->insert('wp_postmeta', array(
'meta_id' => '99999999999',
'post_id' => $id,
'meta_key' => 'acf',
'meta_value' => $value
), ['%s', '%s', '%s', '%s']);
}
}
$value — это огромный сериализованный дамп данных, который я скопировал и вставил из базы данных после того, как создал страницу вручную (не буду публиковать его здесь, так как он огромный).
Однако происходит странная вещь: все данные копируются в правильную таблицу, и они идентичны, но повторитель ACF со всем гибким контентом не появляется на экране редактирования страницы. Даже ещё страннее, если вы нажмёте Сохранить в базе данных MySQL после поиска строки/столбцов в таблице, она обновляется и появляются на странице.
Скопированные данные и данные, которые вставляются в БД, идентичны во всех отношениях. Я не могу понять, почему они не отображаются, пока база данных не будет пересохранена.
Помогите!!
Ответ или решение
Вы сталкиваетесь с проблемой, когда данные ACF не отображаются на экране редактирования страницы после их вставки в таблицу wp_postmeta
с помощью функции $wpdb->insert
. Несмотря на то, что данные кажутся идентичными тем, что вы получаете при ручном создании страницы, они не появляются до тех пор, пока вы вручную не обновите запись в базе данных. Давайте детально рассмотрим возможные причины этой проблемы и предложим пути её решения.
1. Понимание структуры данных ACF
ACF (Advanced Custom Fields) сохраняет данные в виде метаданных, особенно если вы используете многоуровневые поля, такие как повторители и гибкий контент. Эти данные часто сериализуются, и простая вставка в таблицу wp_postmeta
может не быть достаточной.
2. Проблемы согласованности данных
При использовании функции $wpdb->insert
, необходимо убедиться, что вы правильно форматируете данные. Основной проблемой в вашем коде может быть неправильная структура данных, включая или исключая некоторые обязательные поля. Обратите внимание в частности на следующее:
meta_key
должно соответствовать тому, что ожидает ACF. Например, если у вас есть поля повторителей, убедитесь, что вы добавляете данные, как это делается при обычном заполнении через интерфейс ACF.- Проверьте, корректно ли сериализуются данные. Убедитесь, что
$value
действительно имеет корректный формат. Вы можете использоватьserialize()
иunserialize()
для проверки.
3. Прин forced обновления
Проблема заключается в том, что данные не "считываются" ACF, пока запись не будет обновлена. Это может быть связано с кэшированием или тем, как ACF обрабатывает данные. Для разрешения этого вопроса:
- Вызвать обновление поста: После вставки данных попробуйте использовать функцию
update_post_meta()
или обновить пост следующим образом:wp_update_post(array( 'ID' => $id, 'post_modified' => current_time('mysql'), 'post_modified_gmt' => current_time('mysql', 1) ));
Это может заставить ACF сгенерировать необходимые данные заново.
4. Использование корректного формата вставки
Ваш запрос на вставку выглядит следующим образом:
$wpdb->insert('wp_postmeta', array(
'meta_id' => '99999999999',
'post_id' => $id,
'meta_key' => 'acf',
'meta_value' => $value
), ['%s', '%s', '%s', '%s']);
Вместо этого вы должны удалить meta_id
, так как оно автоматически увеличивается в базе данных. Правильный формат будет выглядеть так:
$wpdb->insert($table_name, array(
'post_id' => $id,
'meta_key' => 'acf',
'meta_value' => $value
), ['%d', '%s', '%s']);
5. Проверка и очистка кэша
Если у вас установлены плагины кэширования, они могут мешать отображению обновленной информации. Временно отключите все плагины кэширования и проверьте, решает ли это проблему.
Заключение
Ваше решение задачи связано с правильной обработкой и вставкой данных ACF через $wpdb->insert
. Следует удостовериться в корректном синтаксисе данных, а также, желательно, обновлять пост, чтобы ACF распознал новые метаданные. Проверяйте данные на корректность, избегая прямых манипуляций с базой данных, если это возможно. Если ни одно из этих предложений не помогает, рассмотрите возможность обращения к команде поддержки ACF или поиску информации на форумах, посвященных WordPress.