Добавление записей произвольного типа через фронтенд

3 нояб. 2012 г., 06:41:47
Просмотры: 32.2K
Голосов: 5

Я пытаюсь разобраться, как сделать так, чтобы на моем сайте WordPress можно было добавлять элементы типа portfolio через фронтенд. Плагины вроде WP-User-Frontend позволяют публиковать записи с фронтенда, но работают только с записями блога.

Есть ли какие-то способы или плагины, похожие на wp-user-frontend, но позволяющие добавлять записи произвольных типов?

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

Если вы готовы заплатить за это, плагин Gravity Forms позволяет создавать формы, которые сопоставляются с вашими пользовательскими типами записей (даже с обычными типами записей и страниц), а также с пользовательскими полями.

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

Вот базовый пример:

if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "my_post_type") {

// сохраняем переменные POST в переменные для дальнейшего использования
// сейчас самое время выполнить базовую проверку ошибок/валидацию,
// чтобы убедиться, что данные для этих значений установлены
$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 — если выполнить поиск, можно найти массу полезной информации.

3 нояб. 2012 г. 08:23:20
Комментарии

А как насчет файлов, прикрепленных в метаполях?

Gacek Gacek
12 июн. 2015 г. 16:38:35

@Gacek, ты вообще разобрался с прикрепленными файлами?

User User
31 окт. 2017 г. 06:52:26

нет, честно говоря, не совсем.

Gacek Gacek
31 окт. 2017 г. 12:03:40
1
<?php 

if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "front_post") {

// сохраняем переменные 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>

Попробуй это, это поможет тебе..! Аакиб :)

4 янв. 2017 г. 12:22:58
Комментарии

Пожалуйста, [отредактируйте] ваш ответ и добавьте объяснение: почему это может решить проблему?

fuxia fuxia
4 янв. 2017 г. 13:06:42
0

вставить запись

    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 часть

<style cdn>
<div class="container">
    <form action="" method="post" enctype="multipart/form-data">
        <input type="hidden" name="post_id" value="<?php  echo $post_idd ?>"
        <div class="row mt-3">
            <div class="col-sm-6">
                <label>Имя</label>
                <input type="text" name="name" class="form-control" value="<?php echo isset($user_name) ? $user_name : ''; ?>">
            </div>
            <div class="col-sm-6">
            <label>Описание</label>
                <input type ="text" name= "description" class="form-control" value="<?php echo isset($user_description) ? $user_description : ''; ?>">
            </div>
        </div>
        <div class="row mt-3">
            <div class="col-sm-12">
            <label> Выберите изображение для загрузки </label>
           <input type="file" name="fileToUpload" id="fileToUpload" class="form-control" value=" <?php echo isset($image) ? $image : ''; ?>">
            </div>
        </div>
        <div class="row mt-3">
            <div class="col-sm-4">
            <label>Область/Штат</label>
                <input type ="text" name= "state" class="form-control" value="<?php  echo isset($state) ? $state : ''; ?>">
                </div>

                <div class="col-sm-4">
                    <label>Страна</label>
                <input type ="text" name= "country" class="form-control" value="<?php echo isset($country) ? $country : ''; ?>">
                </div>

                <div class="col-sm-4">
                <label>Почтовый индекс</label>
                <input type ="text" name= "pincode" class="form-control" value="<?php echo isset($pincode) ? $pincode : '' ?>">
            </div>
        </div>
        <div class="row mt-3">
            <div class="col-sm-12">
            <label>Название учебного заведения </label>
                <input type ="text" name= "college" class="form-control" value="<?php echo isset($college) ? $college : ''; ?>">
            </div>
        </div>
        <?php if( isset($_GET['post_id']) && $_GET['post_id']!=""){?>
            <div class="row mb-5 mt-3">
            <div class="col-sm-12">
            <input type="submit" name="update" value="обновить" class="btn btn-primary">
            </div>
            <?php } else {
            ?>
        </div>
        <div class="row mb-5 mt-3">
            <div class="col-sm-12">
            <input type="submit" name="submit" value="отправить" class="btn btn-primary">
            </div>
        </div>
        <?php  }
        ?>
    </form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
5 дек. 2024 г. 18:29:49