Как позволить пользователю создать пост, отправив форму POST?

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

У меня есть следующая простая форма POST на главной странице:

<form action="/wp-content/plugins/myplugin/my_create_post.php" method="POST">
  <label for="title_given">Название:</label>
  <textarea id="title_given" name="title_given" rows="3" cols="100" maxlength="150"></textarea>
  <br>
  <input type="submit" value="Создать пост">
</form>

Файл “my_create_post.php” выглядит так:

<?php
if( $_POST['title_given'] ) {
    // Этот echo успешно отображает title_given из формы
    echo "Название: " . $_POST['title_given'] . "<br />";

    // Создание объекта поста
    $my_post = array(
      'post_title'    => wp_strip_all_tags( $_POST['title_given'] ),
      'post_content'  => 'Это сработало??',
      'post_status'   => 'publish',
      'post_author'   => 1,
      'post_type'     => 'post'
    );

    // Вставка поста в базу данных
    $return_value = wp_insert_post( $my_post, true );   
    
    // Этот echo по какой-то причине никогда не появляется
    echo "wp_insert_post() вернул: " . var_dump( $return_value ) . "<br />";

    exit();
}
?>

Я провожу все свои тесты как администратор. Когда я нажимаю кнопку отправки, я вижу белую страницу только с первым echo, который успешно распечатан, и следующую ошибку в консоли:

введите описание изображения здесь

Пост, похоже, никогда не создается, когда я проверяю из админки или из mysql cli. Идеально было бы, чтобы пользователь был перенаправлен на новый пост с названием, которое он отправил. Есть ли у кого-то идеи, что я делаю не так? Или есть ли лучший способ выполнить мою задачу без wp_insert_post()? Спасибо!

Часть echo должна быть в конце вашего кода. Имейте это в виду, любой echo или print должны быть в конце вашего кода.

<?php
    if( $_POST['title_given'] ) {
        // Создание объекта поста
        $my_post = array(
          'post_title'    => wp_strip_all_tags( $_POST['title_given'] ),
          'post_content'  => 'Это сработало??',
          'post_status'   => 'publish',
          'post_author'   => 1,
          'post_type'     => 'post'
        );
    
        // Вставка поста в базу данных
        $return_value = wp_insert_post( $my_post, true );   
        
        // Этот echo по какой-то причине никогда не появляется
        echo "Название: " . $_POST['title_given'] . "<br />";
        echo "wp_insert_post() вернул: " . var_dump( $return_value ) . "<br />";
   
    }

.

Ответ или решение

Как позвольте пользователю создать пост, отправив POST-форму в WordPress

Создание постов в WordPress при помощи формы является распространенной задачей для разработчиков плагинов и тем. Если вы хотите позволить пользователям создавать посты через форму, вы можете использовать следующие шаги, например, с уже имеющимся кодом, который вы предоставили. Давайте разберем ошибки и улучшения, которые можно внести в ваш код.

1. HTML-форма

Ваша форма выглядит корректно. Убедитесь, что она помещена в подходящее место на вашем сайте. Вот ваш код формы:

<form action="/wp-content/plugins/myplugin/my_create_post.php" method="POST">
  <label for="title_given">Title:</label>
  <textarea id="title_given" name="title_given" rows="3" cols="100" maxlength="150"></textarea>
  <br>
  <input type="submit" value="Create Post">
</form>

2. Обработка POST-запроса в my_create_post.php

Ваш файл my_create_post.php содержит большинство необходимых компонентов, но в нем есть несколько важных моментов, которые нужно исправить и усовершенствовать.

Исправить порядок вызовов echo

Проблема с тем, что выводится только первая часть, может быть связана с тем, как вы вызываете функции echo. Коды вывода следует вызывать в правильном порядке, чтобы убедиться, что весь вывод будет отправлен на страницу.

Проверка ошибок

Если wp_insert_post возвращает ошибку, важно знать о ней. Вы можете использовать is_wp_error, чтобы проверить, был ли вызов успешным.

Полный код

Ниже приведен пересмотренный код для обработки формирования:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['title_given'])) {

    // Создание объекта поста
    $my_post = array(
        'post_title'    => wp_strip_all_tags($_POST['title_given']),
        'post_content'  => 'Did it work??', // Вы можете заменить это на передаваемое значение или оставить статичным
        'post_status'   => 'publish',
        'post_author'   => get_current_user_id(), // Вместо статического значения 1 используйте get_current_user_id()
        'post_type'     => 'post',
    );

    // Вставка поста в базу данных
    $return_value = wp_insert_post($my_post);

    // Проверка на наличие ошибки
    if (is_wp_error($return_value)) {
        echo "Ошибка при создании поста: " . $return_value->get_error_message() . "<br />";
    } else {
        // Перенаправление на созданный пост
        wp_redirect(get_permalink($return_value));
        exit();
    }
} else {
    echo "Пожалуйста, заполните заголовок поста.<br />";
}
?>

Изменения и улучшения

  1. Проверка метода запроса: Теперь мы проверяем метод запроса на POST, чтобы убедиться, что данные отправлены через форму.

  2. Динамическое значение автора: Вместо использования статического ID автора, мы используем get_current_user_id(), что является более надежным и безопасным.

  3. Проверка на ошибки: Мы добавили проверку на наличие ошибки после вызова wp_insert_post. Это поможет вам идентифицировать, почему не происходит создание поста, если таковая проблема возникла.

  4. Редирект: После успешного создания поста мы перенаправляем пользователя на страницу только что созданного поста, используя функцию wp_redirect().

Эти изменения сделают вашу форму более устойчивой и информативной для пользователей ваших плагинов, а также улучшат общую архитектуру вашего решения. Segue эти шаги, и вы сможете создать полную и функциональную форму для создания постов в WordPress.

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

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