Вопрос или проблема
У меня есть следующая простая форма 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 />";
}
?>
Изменения и улучшения
-
Проверка метода запроса: Теперь мы проверяем метод запроса на
POST
, чтобы убедиться, что данные отправлены через форму. -
Динамическое значение автора: Вместо использования статического ID автора, мы используем
get_current_user_id()
, что является более надежным и безопасным. -
Проверка на ошибки: Мы добавили проверку на наличие ошибки после вызова
wp_insert_post
. Это поможет вам идентифицировать, почему не происходит создание поста, если таковая проблема возникла. -
Редирект: После успешного создания поста мы перенаправляем пользователя на страницу только что созданного поста, используя функцию
wp_redirect()
.
Эти изменения сделают вашу форму более устойчивой и информативной для пользователей ваших плагинов, а также улучшат общую архитектуру вашего решения. Segue эти шаги, и вы сможете создать полную и функциональную форму для создания постов в WordPress.