$wpdb->insert и acf данные, не работают

Вопрос или проблема

Я пытаюсь создать кнопку, которая будет создавать страницу и наполнять её всеми моими данными 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.

Оцените материал
Добавить комментарий

Капча загружается...