Почему wordpress перезаписывает записи?

Ссылка скопирована
1 ответ

Делаю создание записи через php, и сую туда проверку - если запись по параметрам найдена, тогда параметр "ОКР" я изменяю, но если не найдена запись - тогда я её добавляю. Проблема в том, что записи при добавление новых - перезаписываются, что делать? Плагин для кэширования - убрал, но не помогло.

$args = array(                     'post_type' => 'users',                     'post_status' => 'publish',                     'posts_per_page' => 1, // Находим только одну запись                     'title' => $val['Фамилия_Имя_М'], // Заголовок                      'meta_query' => array(                         'relation' => 'AND',                         array(                             'key' => 'ДР_М',                             'value' => $val['ДР_М'],                             'compare' => '='                         )                      ),                 );                  $query = new WP_Query($args);                  if ($query->have_posts()) {                     // Запись с указанными параметрами найдена                     while ($query->have_posts()) {                         $query->the_post();                         $okr = get_post_meta( get_the_ID(), 'ОКР', true );                         $newOKR = $okr + $val['ОКР'];                         update_post_meta( get_the_ID(), 'ОКР', $newOKR);                     }                 } else {                     $new_post = array(                         'post_title' => $val['Фамилия_Имя_М'], // Заголовок новой записи                         'post_type' => 'users', // Тип записи                         'post_status' => 'publish' // Статус публикации                     );                      $new_post_id = wp_insert_post($new_post);                     foreach($val as $k1 => $v)                     {                         add_post_meta($new_post_id, $k1, $v);                     }                 }

$args = array( 'post_type' => 'users', 'post_status' => 'publish', 'posts_per_page' => 1, // Находим только одну запись 'title' => $val['Фамилия_Имя_М'], // Заголовок 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'ДР_М', 'value' => $val['ДР_М'], 'compare' => '=' ) ), ); $query = new WP_Query($args); if ($query->have_posts()) { // Запись с указанными параметрами найдена while ($query->have_posts()) { $query->the_post(); $okr = get_post_meta( get_the_ID(), 'ОКР', true ); $newOKR = $okr + $val['ОКР']; update_post_meta( get_the_ID(), 'ОКР', $newOKR); } } else { $new_post = array( 'post_title' => $val['Фамилия_Имя_М'], // Заголовок новой записи 'post_type' => 'users', // Тип записи 'post_status' => 'publish' // Статус публикации ); $new_post_id = wp_insert_post($new_post); foreach($val as $k1 => $v) { add_post_meta($new_post_id, $k1, $v); } }

Дополнительно:

Начнём с того, что у тебя нет никаких критериев проверки существования поста (вместо этого написана какая-то жуткая хрень). И какой пост обновлять соответственно тоже.

  • Refguser, Сможешь подсказать как сделать в таком случае корректно проверку на существования поста по title и доп.полям?
  • crack_user, вначале нужно найти ID поста, удовлетворяющего критериям "существования", а потом уже wp_insert_post. Который или обновит (если найден) или создаст новый.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Елена Вебер Ответ

    Записи в WordPress обычно “перезаписываются” не сами по себе, а из-за логики импорта: вы либо передаёте в wp_insert_post() существующий ID, либо ищете запись слишком широким условием и потом обновляете не ту запись.

    Правильная схема такая: у каждой внешней записи должен быть свой стабильный уникальный ключ. Это может быть ID из внешней системы, артикул, URL источника или другой параметр. Этот ключ нужно хранить в post meta и искать запись именно по нему.

    $external_id = 'okr-12345';
     
    $existing = get_posts([
        'post_type'      => 'post',
        'posts_per_page' => 1,
        'fields'         => 'ids',
        'meta_key'       => '_external_okr_id',
        'meta_value'     => $external_id,
    ]);
     
    $post_data = [
        'post_title'   => $title,
        'post_content' => $content,
        'post_status'  => 'publish',
        'post_type'    => 'post',
    ];
     
    if ($existing) {
        $post_data['ID'] = (int) $existing[0];
        $post_id = wp_update_post($post_data, true);
    } else {
        $post_id = wp_insert_post($post_data, true);
        update_post_meta($post_id, '_external_okr_id', $external_id);
    }

    $external_id = 'okr-12345'; $existing = get_posts([ 'post_type' => 'post', 'posts_per_page' => 1, 'fields' => 'ids', 'meta_key' => '_external_okr_id', 'meta_value' => $external_id, ]); $post_data = [ 'post_title' => $title, 'post_content' => $content, 'post_status' => 'publish', 'post_type' => 'post', ]; if ($existing) { $post_data['ID'] = (int) $existing[0]; $post_id = wp_update_post($post_data, true); } else { $post_id = wp_insert_post($post_data, true); update_post_meta($post_id, '_external_okr_id', $external_id); }

    Если при добавлении новых записей меняется старая, проверьте три места:

    • не передаётся ли старый ID в массиве для wp_insert_post();
    • не ищете ли вы существующую запись только по заголовку, который может повторяться;
    • не совпадает ли post_name или meta-поле, по которому вы считаете запись существующей.

    Кэш-плагин здесь почти наверняка ни при чём. Кэш может показать старую версию страницы, но он не должен менять данные в таблице wp_posts. Для диагностики после каждого шага логируйте найденный ID и действие: “create” или “update”. Тогда сразу будет видно, на каком условии код решает обновлять существующую запись.

    Итог: не используйте расплывчатую проверку “нашлась запись по параметрам”. Сделайте один уникальный внешний ключ, храните его в meta и обновляйте только запись, найденную по этому ключу. Тогда новые записи перестанут затирать старые.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно