Получение ID поста из wp_insert_post()

20 апр. 2016 г., 13:51:16
Просмотры: 18.8K
Голосов: 6
$new_post = array(
                        'post_title'    =>      $title,
                        'post_content'  =>      $description,
                        'post_category' =>      array($_POST['cat']),  // Также работает с пользовательскими таксономиями
                        'tags_input'    =>      array($tags),
                        'post_status'   =>      'publish',           // Варианты: publish, preview, future, draft и т.д.
                        'post_type'     =>      'my_custom_type'
                );
wp_insert_post($new_post);

Как я могу получить ID поста? Он генерируется автоматически? Как я могу показать его до отправки формы? Я пытаюсь создать фронтенд-форму, где хочу показать пользователю ID поста, который будет создан. Например: "Привет, ты публикуешь статью № <?php echo $postID;?>". Есть ли способ сделать это или я совсем не в себе? Заранее спасибо.

4
Комментарии

Вам нужно будет выполнить отдельный запрос, чтобы получить последний ID из таблицы wp_posts. Новый пост получит этот ID, но будьте осторожны — другой процесс, работающий одновременно, может перехватить этот ID и сохранить черновик или вложение под ним, поэтому новый пост может получить другой ID, отличный от того, который вы отображаете. Просто нет надежного способа узнать ID поста заранее. Помните, что все вложения, черновики, ревизии и автосохраненные черновики хранятся в wp_posts, поэтому у опубликованных постов ID не будут отличаться ровно на единицу. Вам нужно пересмотреть ваш подход.

Pieter Goosen Pieter Goosen
20 апр. 2016 г. 14:07:01

@PieterGoosen Спасибо за ответ! То есть, по сути, я должен отображать ID поста после его публикации, правильно?

Kleeia Kleeia
20 апр. 2016 г. 14:21:08

wp_insert_post возвращает ID нового поста при вызове в форме $id = wp_insert_post( $new_post );. Возможно, вы можете использовать этот факт, чтобы сохранить пост как черновик, как только пользователь начнет вводить текст, а затем вызвать wp_update_post, когда он отправит форму, обновив статус поста на "опубликовано".

Luis Sanz Luis Sanz
20 апр. 2016 г. 14:37:37

@LuisSanz Большое спасибо за это. Я поработаю над этим обходным решением. Отлично!

Kleeia Kleeia
20 апр. 2016 г. 14:59:43
Все ответы на вопрос 2
2
10

Вам нужно выполнить это в два этапа. Сначала вы создадите пост в режиме черновика, используя wp_insert_post(). Сама функция wp_insert_post вернет вам ID созданного поста:

<?php
$new_post = array(
    'post_title' => 'Заголовок черновика',
    'post_status'   => 'draft'
    'post_type'     =>      'my_custom_type'
);
$postId = wp_insert_post($new_post);
?>

<form method="post" action="your-action.php">
    <p>Привет! Вы создаете пост #<?php echo $postId; ?></p>
    <input type="hidden" name="draft_id" value="<?php echo $postId; ?>">
    ...
</form>

После этого на странице обработки вы получите ID черновика и обновите пост. Вы используете wp_update_post, передавая ID черновика.

<?php
$draftId = $_POST['draft_id'];
...

$updated_post = array(
    'ID'            =>      $draftId,
    'post_title'    =>      $title,
    ...
    'post_status'   =>      'publish', // Теперь пост опубликован
    'post_type'     =>      'my_custom_type'
);
wp_update_post($updated_post);
?>

Надеюсь, это поможет :)

20 апр. 2016 г. 17:00:00
Комментарии

Это очень круто!! Спасибо, @André, я как раз искал что-то подобное!

Kleeia Kleeia
20 апр. 2016 г. 17:05:10

Пожалуйста, @Kleeia ;)

André Gumieri André Gumieri
20 апр. 2016 г. 17:08:20
0

Проверьте документацию:

Возвращает: (int|WP_Error) ID записи при успехе. Значение 0 или объект WP_Error при ошибке.

Таким образом:

$result = wp_insert_post( $data );

if ( $result && ! is_wp_error( $result ) ) {
    $post_id = $result;
    // Делаем что-то ещё
}
20 апр. 2016 г. 15:52:45