Почему wordpress перезаписывает записи?
Делаю создание записи через 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); } }
Дополнительно:
Начнём с того, что у тебя нет никаких критериев проверки существования поста (вместо этого написана какая-то жуткая хрень). И какой пост обновлять соответственно тоже.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Записи в 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); }
Если при добавлении новых записей меняется старая, проверьте три места:
IDв массиве дляwp_insert_post();post_nameили meta-поле, по которому вы считаете запись существующей.Кэш-плагин здесь почти наверняка ни при чём. Кэш может показать старую версию страницы, но он не должен менять данные в таблице
wp_posts. Для диагностики после каждого шага логируйте найденный ID и действие: “create” или “update”. Тогда сразу будет видно, на каком условии код решает обновлять существующую запись.Итог: не используйте расплывчатую проверку “нашлась запись по параметрам”. Сделайте один уникальный внешний ключ, храните его в meta и обновляйте только запись, найденную по этому ключу. Тогда новые записи перестанут затирать старые.