Проверка существования заголовка записи, создание записи если не существует, добавление инкрементного числа в мета-поле если существует

15 июл. 2012 г., 21:58:08
Просмотры: 37.5K
Голосов: 14

У меня уже есть функция, где пользователь отправляет форму и создает произвольную запись...

<?php 
// Получаем заголовок записи и значение кнопки отправки
$postTitle = $_POST['post_title'];
$submit = $_POST['submit'];

if(isset($submit)){
    global $user_ID;
    
    // Проверяем существование записи с таким заголовком
    $existing_post = get_page_by_title($postTitle, OBJECT, 'stuff');
    
    if(!$existing_post) {
        // Если запись не существует, создаем новую
        $new_post = array(
            'post_title' => $postTitle,
            'post_content' => '',
            'post_status' => 'publish',
            'post_date' => date('Y-m-d H:i:s'),
            'post_author' => '',
            'post_type' => 'stuff',
            'post_category' => array(0)
        );
        
        $post_id = wp_insert_post($new_post);
        add_post_meta($post_id, 'times', '1');
    } else {
        // Если запись существует, увеличиваем значение мета-поля на 1
        $current_value = get_post_meta($existing_post->ID, 'times', true);
        $new_value = intval($current_value) + 1;
        update_post_meta($existing_post->ID, 'times', $new_value);
    }
}

Я хочу проверить, существует ли заголовок произвольной записи, и если НЕТ - создать запись с числом #1 в мета-поле, а если существует - просто добавить 1 к значению мета-поля

0
Все ответы на вопрос 6
1
12

Более современный метод может использовать функцию post_exists() следующим образом:

if( isset( $_POST['submit'] ) ){

   $post_title = sanitize_title( $_POST['post_title'] );

   $new_post = array(
       'post_title' => $post_title,
       'post_content' => '',
       'post_status' => 'publish',
       'post_date' => date('Y-m-d H:i:s'),
       'post_author' => '',
       'post_type' => 'stuff',
       'post_category' => array(0)
   );

   $post_id = post_exists( $post_title ) or wp_insert_post( $new_post );

   update_post_meta( $post_id, 'times', '1' );

}
29 нояб. 2017 г. 07:19:14
Комментарии

Не совсем понятно, хотел ли автор увеличить метаполе на 1, если пост существует, или просто установить метаполе в 1. Приведённый код всегда будет устанавливать значение 1. Для увеличения значения следует разбить тернарный оператор $post_id = post_exists[...] на конструкцию if / else, чтобы можно было увеличить значение метаполя.

Tim Hallman Tim Hallman
8 нояб. 2018 г. 21:50:18
8

Это потребует выполнения запроса.

Продолжая ваш код:

<?php
$postTitle = $_POST['post_title'];
$submit = $_POST['submit'];

if(isset($submit)){

    global $user_ID, $wpdb;

    $query = $wpdb->prepare(
        'SELECT ID FROM ' . $wpdb->posts . '
        WHERE post_title = %s
        AND post_type = \'stuff\'',
        $postTitle
    );
    $wpdb->query( $query );

    if ( $wpdb->num_rows ) {
        $post_id = $wpdb->get_var( $query );
        $meta = get_post_meta( $post_id, 'times', TRUE );
        $meta++;
        update_post_meta( $post_id, 'times', $meta );
    } else {
        $new_post = array(
            'post_title' => $postTitle,
            'post_content' => '',
            'post_status' => 'publish',
            'post_date' => date('Y-m-d H:i:s'),
            'post_author' => '',
            'post_type' => 'stuff',
            'post_category' => array(0)
        );

        $post_id = wp_insert_post($new_post);
        add_post_meta($post_id, 'times', '1');
    }
}

Должно сработать

16 июл. 2012 г. 00:08:14
Комментарии

Возможно, вы захотите добавить AND post_status = 'publish' к первоначальному запросу, чтобы возвращались только опубликованные записи.

Barry Carlyon Barry Carlyon
16 июл. 2012 г. 00:09:21

Ещё раз спасибо за помощь! Однако записи по какой-то причине не попадают в базу данных... ни новые, ни обновлённые старые.

marctain marctain
16 июл. 2012 г. 02:28:53

Возможно, где-то опечатка? Никак не могу разобраться.

marctain marctain
16 июл. 2012 г. 06:32:22

Я проведу тест, когда вернусь домой с работы

Barry Carlyon Barry Carlyon
16 июл. 2012 г. 13:48:15

Эпический провал с моей стороны WHERE post_title = %d должно быть WHERE post_title = %s бьётся головой об стол

Barry Carlyon Barry Carlyon
16 июл. 2012 г. 22:10:22

С каждым бывает! Ладно, теперь новые посты добавляются, но мета-значение для "times" не увеличивается. Вместо этого создаётся новое мета-значение с названием "2". Оно тоже не увеличивается автоматически.

marctain marctain
16 июл. 2012 г. 22:18:46

Упс, забыл обновить эту строку тоже. update_post_meta( $post_id, $meta ); должно быть update_post_meta( $post_id, 'times', $meta );

Barry Carlyon Barry Carlyon
16 июл. 2012 г. 22:19:58

А, теперь понятно! Я должен был это заметить. Большое спасибо. Это твоя эпичная победа!

marctain marctain
16 июл. 2012 г. 22:21:19
Показать остальные 3 комментариев
1

Вы можете использовать функцию WordPress get_page_by_title():

<?php $postTitle = $_POST['post_title'];
$submit = $_POST['submit'];


if(isset($submit)){
    $customPost = get_page_by_title($postTitle, OBJECT, 'stuff');

    if(!is_null($customPost)) {
       $meta = get_post_meta($customPost->ID, 'times', true);
       $meta++;
       update_post_meta($customPost->ID, 'times', $meta);

       return
    }

    global $user_ID;

    $new_post = array(
        'post_title' => $postTitle,
        'post_content' => '',
        'post_status' => 'publish',
        'post_date' => date('Y-m-d H:i:s'),
        'post_author' => '',
        'post_type' => 'stuff',
        'post_category' => array(0)
    );

    $post_id = wp_insert_post($new_post);
    add_post_meta($post_id, 'times', '1');

}
16 мая 2016 г. 12:57:03
Комментарии

Привет, Алекс, добро пожаловать на WPSE. Не стесняйся ознакомиться с экскурсией. Здесь мы придерживаемся принципа "научить человека ловить рыбу, а не просто давать ему рыбу". Не мог бы ты отредактировать свой пост, добавив объяснение, почему это решение помогает автору вопроса?

Tim Malone Tim Malone
16 мая 2016 г. 13:27:26
1

@Tim Hallman хороший ответ. Используйте функцию post_exists() для проверки существования записи. Подробнее смотрите на https://developer.wordpress.org/reference/

Документация разработчика WordPress

20 мар. 2018 г. 13:13:49
Комментарии

Для использования этой функции на фронтенде потребуется некоторая доработка.

Tami Tami
10 июн. 2021 г. 02:44:06
1

Вы можете сделать это по ID


$post_title = "Это Заголовок";
$post_content = "Мой контент о чем-то крутом.";
$post_status = "publish"; //publish, draft и т.д.
$post_type = "page" // или любой желаемый тип записи

/* Попытка найти ID записи по заголовку, если она существует */
$found_post_title = get_page_by_title( $post_title, OBJECT, $post_type );
$found_post_id = $found_post_title->ID;

/**********************************************************
** Проверка, существует ли страница, если нет - создать новую запись 
************************************************************/
if ( FALSE === get_post_status( $found_post_id ) ): 

      $post_args = array(
        'post_title' => $post_title,
        'post_type' => $post_type,
        'post_content'=> $post_content,
        'post_status'  => $post_status,
        //'post_author'  => get_current_user_id(),

        /* Если у вас есть мета-поля для ввода данных */ 
        'meta_input'   => array(
            'meta_key1' => 'мое значение',
            'meta_key2' => 'мое другое значение',
        ),
      );      


      /* Добавить новую запись WordPress в базу данных, вернуть её ID */
      $returned_post_id = wp_insert_post( $post_args );  

      /* Обновить шаблон страницы только если используется "page" как post_type */ 
      update_post_meta( $returned_post_id, '_wp_page_template', 'my-page-template.php' ); 

      /* Добавить значения в мета-поля. Работает с ACF CUSTOM FIELDS!! */
      $field_key = "My_Field_KEY";
      $value = "мое кастомное значение";
      update_field( $field_key, $value, $returned_post_id );

      $field_key = "My_Other_Field_KEY";
      $value = "мое другое кастомное значение";
      update_field( $field_key, $value, $returned_post_id );

      /* Сохранить значение чекбокса или выпадающего списка */
      // $field_key = "My_Field_KEY";
      // $value = array("красный", "синий", "желтый");
      // update_field( $field_key, $value, $returned_post_id );

      /* Сохранить значение повторяющегося поля */
      // $field_key = "My_Field_KEY";
      // $value = array(
      //   array(
      //     "ss_name" => "Foo",
      //     "ss_type" => "Bar"
      //   )
      // );
      // update_field( $field_key, $value, $returned_post_id );

      /* Вывести ответ! */
      echo "<span class='pg-new'><strong>". $post_title . " Создана!</strong></span><br>";
      echo "<a href='".esc_url( get_permalink($returned_post_id) )."' target='_Blank'>". $post_title . "</a><p>";


else:        
/***************************
** ЕСЛИ ЗАПИСЬ СУЩЕСТВУЕТ, обновить её 
****************************/

      /* Обновить запись */
      $update_post_args = array(
        'ID'           => $found_post_id,
        'post_title'   => $post_title,
        'post_content' => $post_content,
      );

      /* Обновить запись в базе данных */
      wp_update_post( $update_post_args );

      /* Обновить значения в мета-полях */
      $field_key = "My_Field_KEY";
      $value = "мое кастомное значение";
      update_field( $field_key, $value, $found_post_id );

      $field_key = "My_Other_Field_KEY";
      $value = "мое другое кастомное значение";
      update_field( $field_key, $value, $found_post_id );

      /* Вывести ответ! */
      echo "<span class='pg-update'><strong>". $post_title . " Обновлена!</strong></span><br>"; 
      echo "<a href='".esc_url( get_permalink($found_post_id) )."' target='_Blank'>Просмотр</a> | <a href='post.php?post=".$found_post_id."&action=edit'>". $post_title . "</a><p>";

endif;

10 февр. 2019 г. 23:53:23
Комментарии

На самом деле безопаснее использовать встроенные функции WordPress, предназначенные для этого: post_exists и wp_insert_post, как в ответе @TimHallman. Чем больше лишнего кода вы добавляете, тем выше вероятность появления ошибок или проблем с поддержкой в долгосрочной перспективе.

FluffyKitten FluffyKitten
23 февр. 2019 г. 19:57:55
0
-1

Проверка существования записи в WordPress по заголовку

function wp_exist_post_by_title( $title ) {
    global $wpdb;
    $return = $wpdb->get_row( "SELECT ID FROM wp_posts WHERE post_title = '" . $title . "' && post_status = 'publish' && post_type = 'post' ", 'ARRAY_N' );
    if( empty( $return ) ) {
        return false;
    } else {
        return true;
    }
}

// использование
if( wp_exist_post_by_title( $post->name ) ) {
// запись существует
} else { 
// запись не существует
}
13 апр. 2015 г. 16:51:40