Вопрос или проблема
Я пытаюсь выяснить, как сделать так, чтобы мой сайт на WordPress мог добавлять портфолио
элементы с фронтенда. Плагины, такие как WP-User-Frontend, позволяют размещать материалы с фронтенда, но работают только с записями блога.
Существуют ли какие-либо способы или плагины, аналогичные wp-user-frontend, но позволяющие добавлять элементы пользовательского типа записи?
Если вы готовы за это заплатить, плагин Gravity Forms позволяет вам создавать формы, которые соответствуют вашим пользовательским типам записей (даже обычным записям и страницам), а также соответствуют вашим пользовательским полям.
Для тех, кто не хочет платить и кто готов засучить рукава, вы можете довольно легко создать форму на фронтенде, которая будет отправлять данные в любой выбранный вами тип записи.
Вот простой пример;
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "my_post_type") {
//храните наши переменные поста в переменные для дальнейшего использования
//сейчас будет хорошее время для выполнения базовой проверки/валидации ошибок
//чтобы убедиться, что данные для этих значений установлены
$title = $_POST['title'];
$content = $_POST['content'];
$post_type="my_custom_post";
$custom_field_1 = $_POST['custom_1'];
$custom_field_2 = $_POST['custom_2'];
//массив аргументов для вставки с помощью wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => $post_type
);
//вставьте запись в базу данных, передавая $new_post в wp_insert_post
//сохраните наш ID поста в переменной $pid
$pid = wp_insert_post($new_post);
//теперь мы используем $pid (ID поста), чтобы помочь добавить метаданные поста
add_post_meta($pid, 'meta_key', $custom_field_1, true);
add_post_meta($pid, 'meta_key', $custom_field_2, true);
}
Ваша HTML-форма будет выглядеть примерно так;
<form method="post" name="front_end" action="" >
<input type="text" name="title" value="Заголовок моего поста" />
<input type="text" name="content" value="Содержимое моего поста" />
<input type="text" name="custom_1" value="Содержимое пользовательского поля 1" />
<input type="text" name="custom_2" value="Содержимое пользовательского поля 2" />
<button type="button">Отправить</button>
<input type="hidden" name="action" value="my_post_type" />
</form>
Вы можете разместить это все в файле шаблона вашей темы. Обычно я бы сделал это еще на шаг дальше и запустил логику обработки (PHP) из функции внутри моего functions.php, подключенной к действию, хотя это также будет работать и в файле темы.
Это предназначено только как простой пример и не содержит серьезной проверки и валидации ошибок. Тем не менее, это дает вам основную структуру для того, что вам нужно, чтобы размещать материалы с фронтенда в ваши типы записей на бэкенде.
Также существует множество учебных пособий, которые расширяют эту тему на WPSE, если вы выполните поиск, вы найдете много информации.
<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "front_post") {
//храните наши переменные поста в переменные для дальнейшего использования
//сейчас будет хорошее время для выполнения базовой проверки/валидации ошибок
//чтобы убедиться, что данные для этих значений установлены
$title = $_POST['title'];
$content = $_POST['content'];
$tags = $_POST['tag'];
$custom_field = $_POST['custom_1'];
$post_type="frontpost";
//массив аргументов для вставки с помощью wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'tags_input' => $tags,
'post_status' => 'publish',
'post_category' => array('0',$_POST['cat']),
'post_type' => $post_type
);
//вставьте запись в базу данных, передавая $new_post в wp_insert_post
//сохраните наш ID поста в переменной $pid
//теперь мы используем $pid (ID поста), чтобы помочь добавить метаданные поста
$pid=wp_insert_post($new_post);
//теперь мы используем $pid (ID поста), чтобы помочь добавить метаданные поста
add_post_meta($pid, 'cust_key', $custom_field);
}
?>
<div class="front-form col-sm-6">
<form method="post" name="front_end" action="" >
<input type="text" name="title" placeholder="Заголовок FrontPost" required />
<textarea name="content" placeholder="Содержимое FrontPost" rows="5" ></textarea>
<input type="text" name="tag" placeholder="Теги FrontPost" />
<input type="text" name="custom_1" placeholder="Содержимое пользовательского поля" />
<span><?php wp_dropdown_categories( 'tab_index=10&taxonomy=category&hide_empty=0' ); ?></span>
<button type="submit">Отправить</button>
<input type="hidden" name="action" value="front_post" />
</form>
</div>
Попробуйте это, это поможет вам..! Акиб 🙂
//вставка поста
add_action(‘init’, function() {
if (isset($_POST[‘submit’])) {
if (!is_user_logged_in()) {
echo ‘Вы должны войти, чтобы отправить пост.’;
return;
}
$title = sanitize_text_field($_POST['name']);
$description = sanitize_textarea_field($_POST['description']);
$create_post = array(
'post_status' => 'publish',
'post_type' => 'user', // Убедитесь, что тип записи 'user' зарегистрирован
'post_title' => $title,
'post_content' => $description,
);
$post_id = wp_insert_post($create_post);
if(isset($_FILES['fileToUpload']) && !empty($_FILES['fileToUpload']['name'])){
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attachement_id = media_handle_upload('fileToUpload',$post_id);
if(is_wp_error($attachement_id)){
echo 'Ошибка загрузки !!';
}else{
set_post_thumbnail($post_id,$attachement_id);
}
}
return $post_id ? 'пост успешно создан' : 'ошибка при создании поста';
if ($post_id) {
$state = sanitize_text_field($_POST['state']);
$country = sanitize_text_field($_POST['country']);
$pincode = sanitize_text_field($_POST['pincode']);
$college = sanitize_text_field($_POST['college']);
update_post_meta($post_id, 'state', $state);
update_post_meta($post_id, 'country', $country);
update_post_meta($post_id, 'pincode', $pincode);
update_post_meta($post_id, 'college', $college);
echo 'Пост успешно создан!';
} else {
echo 'Не удалось создать пост.';
}
}
});
вот HTML часть
”
Имя
“>
Описание
“>
Выберите изображение для загрузки
“>
Штат
“>
Страна
“>
Почтовый индекс
“>
Название колледжа
“>
.
Ответ или решение
Добавление элементов кастомного поста с фронтенда в WordPress
В рамках разработки веб-сайта на WordPress может возникнуть необходимость обеспечить пользователям возможность добавления кастомных постов, таких как элементы портфолио, непосредственно с фронтенда. Это особенно актуально, поскольку многие плагины, такие как WP-User-Frontend, предлагают функционал только для стандартных постов блога. В данном ответе мы рассмотрим наиболее эффективные методы, включая использование плагинов и написание собственного кода.
1. Использование готовых плагинов
Если вы предпочитаете не углубляться в программирование, существуют плагины, которые могут значительно упростить процесс. К примеру, Gravity Forms — это платный плагин, который позволяет создавать формы для ввода данных, которые можно сопоставить с кастомными пост-типами, а также с кастомными полями.
Другим вариантом является плагин Custom Post Type UI, который в сочетании с формы может предоставить вам необходимую функциональность. Однако в большинстве случаев необходимые плагины будут платными, но они обеспечивают гораздо более продвинутую настройку и поддержку.
2. Создание пользовательской формы
Если ваш бюджет ограничен или вы хотите полностью контролировать процесс, вы можете создать свою форму для фронтенда. Ниже представлен базовый пример, как это можно сделать:
Шаг 1: Создание HTML формы
<div class="front-form">
<form method="post" name="front_end" action="">
<input type="text" name="title" placeholder="Название поста" required />
<textarea name="content" placeholder="Содержимое поста" rows="5" required></textarea>
<input type="text" name="custom_1" placeholder="Кастомное поле 1" />
<input type="hidden" name="action" value="my_custom_post" />
<button type="submit">Отправить</button>
</form>
</div>
Шаг 2: Обработка данных с помощью PHP
Наполняем шаблон кода для обработки отправленных данных:
add_action('init', function() {
if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['action']) && $_POST['action'] == 'my_custom_post') {
// Запрос на получение данных и их обработка
$title = sanitize_text_field($_POST['title']);
$content = wp_kses_post($_POST['content']);
$custom_field_1 = sanitize_text_field($_POST['custom_1']);
// Параметры для добавления нового поста
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => 'portfolio' // ваш кастомный тип поста
);
// Вставляем пост в базу данных
$post_id = wp_insert_post($new_post);
// Добавляем кастомные поля
if ($post_id) {
add_post_meta($post_id, 'custom_field_1', $custom_field_1, true);
echo "Пост успешно создан!";
} else {
echo "Ошибка создания поста.";
}
}
});
Шаг 3: Обеспечение безопасности и валидации
Для повышения безопасности вашего кода очень важно добавлять функции валидации и санирования данных. Используйте функции sanitize_text_field()
, wp_kses_post()
и другие функции WordPress для предотвращения атак хакеров (например, XSS).
Заключение
Создание возможностей для пользователей добавлять кастомные посты с фронтенда — это полезное и эффективное решение для большинства веб-сайтов на WordPress. Если вы хотите быстро реализовать этот функционал, рекомендую использовать плагины, такие как Gravity Forms. Однако, если вы ищете больше контроля и готовы к дополнительным усилиям, создание собственной формы — это отличный способ.
Обращаясь к вашему вопросу, данный подход позволяет избежать ограничений использования только стандартных форм и вопросов авторизации, которые могут возникнуть при использовании готовых решений. Выбирайте подход, который наилучшим образом соответствует вашим потребностям и уровню доступных ресурсов.