Добавить миниатюру записи фронтенд
-
Доброго времени суток!
Возникла необходимость добавлять записи без админки, составить форму не так сложно, но возникла проблема добавления миниатюры к записи не администраторам.
нужно сделать это максимально просто например так
<input type=»file» name=»img» id=»img» multiple accept=»image/*,image/jpeg»>существует ли внутренняя переменная как например ‘title’ ‘cat’ ‘description’
Я так полагаю что ‘post-thumbnails’ только выводит миниатюру.
-
Доброго.
Как-то делал миграцию, может подойдет. $filename — путь к изображению на сервере, $post_id — id записи, к которой добавляется изображение.
require_once( ABSPATH . 'wp-admin/includes/file.php' ); $wp_upload_dir = wp_upload_dir(); $filetype = wp_check_filetype(basename($filename), null); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename($filename), 'post_mime_type' => $filetype['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment($attachment, $filename, $post_id); require_once( ABSPATH . 'wp-admin/includes/image.php' ); $attach_data = wp_generate_attachment_metadata($attach_id, $filename); wp_update_attachment_metadata($attach_id, $attach_data); set_post_thumbnail($post_id, $attach_id);
denisco А как это на практике работает?
Получаете данные с формы.
После добавления записи — функция wp_insert_post вернет Вам $post_id.
Изображение будет в переменной $_FILES[‘img’][‘tmp_name’] (в случае <input type=»file» name=»img»>) документация по теме.Перемещаете в папку wp-uploads (код не тестировал)
require_once( ABSPATH . 'wp-admin/includes/file.php' ); $wp_upload_dir = wp_upload_dir(); $filename = $wp_upload_dir['path'] . '/' . basename($_FILES['img']['name']); move_uploaded_file($_FILES['img']['tmp_name'], $filename);
Собственно, получите $filename.
Затем импортируете файл в WordPress, как я писал выше. Ну и нужно будет сгенерировать миниатюры. Это можно сделать через какой-нибудь плагин, например, Regenerate Thumbnails или создать при загрузке, например, с помощью class.upload.php
Получаете данные с формы.
После добавления записи — функция wp_insert_post вернет Вам $post_id.
Изображение будет в переменной $_FILES[‘img’][‘tmp_name’] (в случае <input type=»file» name=»img»>)А как сделать чтобы данные с формы попали в переменные: текст в post_content, заголовок в post_title и т.д.?
И я так понимаю у топикстартера проблемы с данными для миниатюр, а не изображений.В зависимости от метода отправки данные формы окажутся в массиве $_GET или $_POST и независимо от метода в $_REQUEST (можно почитать тут).
Затем формируем массив с данными (код, естественно, примерный и у каждого будут свои параметры)
$my_post = array( 'post_title' => $_POST['title'], 'post_content' => $_POST['content'], 'post_status' => 'publish', 'post_author' => 1, 'post_category' => array(1) );
И создаем новую запись с помощью функции wp_insert_post
$post_id = wp_insert_post( $my_post );
А что есть «данные миниатюр»?
Не очень понял, но уже перепробовал всё что вы написали.
у меня получается такая форма (взята с форума и допилина)
<meta charset="utf-8" /> <form method="post" action="<?php bloginfo('template_url'); ?>/handler.php" class="form-horizontal"> <fieldset> <legend>Form Name</legend> <label class="col-md-4 control-label" for="title">Заголовок</label> <input id="title" name="title" type="text" placeholder="Введите заголовок" class="form-control input-md"> <label class="col-md-4 control-label" for="description">Материал</label> <?php wp_editor( $listing->description, 'listingeditor', $settings = array('textarea_name' => description) ); ?> <input type="file" name="img" id="img" multiple accept="image/*,image/jpeg"> <label class="col-md-4 control-label" for="send"></label> <button id="send" name="send" class="btn btn-primary">Отправить</button> </fieldset> </form>
И сам обработчик
define('WP_USE_THEMES', false); require( $_SERVER['DOCUMENT_ROOT'] .'/wp-blog-header.php'); ?> <?php if(isset($_POST['send']) == '1') { $post_title = $_POST['title']; $post_category = $_POST['cat']; $post_content = $_POST['description']; $new_post = array( 'ID' => '', 'post_author' => $user->ID, 'post_category' => array($post_category), 'post_content' => $post_content, 'post_title' => $post_title, 'post_status' => 'Pending', 'post-thumbnails' => $post_img, ); $post_id = wp_insert_post($new_post); $post = get_post($post_id); wp_redirect($post->guid);
Я так понял сама запись у Вас добавляется?
в форме убрал параметр multiple у поля img.
<meta charset="utf-8" /> <form method="post" action="<?php bloginfo('template_url'); ?>/handler.php" class="form-horizontal"> <fieldset> <legend>Form Name</legend> <label class="col-md-4 control-label" for="title">Заголовок</label> <input id="title" name="title" type="text" placeholder="Введите заголовок" class="form-control input-md"> <label class="col-md-4 control-label" for="description">Материал</label> <?php wp_editor( $listing->description, 'listingeditor', $settings = array('textarea_name' => description) ); ?> <input type="file" name="img" id="img" accept="image/*,image/jpeg"> <label class="col-md-4 control-label" for="send"></label> <button id="send" name="send" class="btn btn-primary">Отправить</button> </fieldset> </form>
Обработчик должен получиться примерно такой:
$post_title = $_POST['title']; $post_category = $_POST['cat']; $post_content = $_POST['description']; $new_post = array( 'ID' => '', 'post_author' => $user->ID, 'post_category' => array($post_category), 'post_content' => $post_content, 'post_title' => $post_title, 'post_status' => 'Pending', ); $post_id = wp_insert_post($new_post); require_once( ABSPATH . 'wp-admin/includes/file.php' ); $wp_upload_dir = wp_upload_dir(); $filename = $wp_upload_dir['path'] . '/' . basename($_FILES['img']['name']); move_uploaded_file($_FILES['img']['tmp_name'], $filename); $filetype = wp_check_filetype(basename($filename), null); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename($filename), 'post_mime_type' => $filetype['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment($attachment, $filename, $post_id); require_once( ABSPATH . 'wp-admin/includes/image.php' ); $attach_data = wp_generate_attachment_metadata($attach_id, $filename); wp_update_attachment_metadata($attach_id, $attach_data); set_post_thumbnail($post_id, $attach_id); $post = get_post($post_id); wp_redirect($post->guid);
Так пробовали?
500 ошибка при отправке формы, при добавление и без миниатюры
Вот с таким обработчиком статья добавляется, но миниатюра не задается, и после добавления белый экран
<?php define('WP_USE_THEMES', false); require( $_SERVER['DOCUMENT_ROOT'] .'/wp-blog-header.php'); ?> <?php if(isset($_POST['send']) == '1') { $post_title = $_POST['title']; $post_category = $_POST['cat']; $post_content = $_POST['description']; $new_post = array( 'ID' => '', 'post_author' => $user->ID, 'post_category' => array($post_category), 'post_content' => $post_content, 'post_title' => $post_title, 'post_status' => 'Pending', ); $post_id = wp_insert_post($new_post); require_once( ABSPATH . 'wp-admin/includes/file.php' ); $wp_upload_dir = wp_upload_dir(); $filename = $wp_upload_dir['path'] . '/' . basename($_FILES['img']['name']); move_uploaded_file($_FILES['img']['tmp_name'], $filename); $filetype = wp_check_filetype(basename($filename), null); $attachment = array( 'guid' => $wp_upload_dir['url'] . '/' . basename($filename), 'post_mime_type' => $filetype['type'], 'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)), 'post_content' => '', 'post_status' => 'inherit' ); $attach_id = wp_insert_attachment($attachment, $filename, $post_id); } ?>
редирект сделал после добавления на статью, но миниатюра так и не прикрепляется, в медиафайлах появляется неопознанный файл с ссылкой /wp-content/uploads/uploads
Проблема так и осталась(
Собрал плагин-демку на основе Вашего кода. Установить, вставить в нужное место
<?php echo do_shortcode('[upload_form][/upload_form]'); ?>
этот шорткод выведет форму и можно пробовать. Реализацию можно посмотреть в самом файле плагина.Вот так работает! Спасибо большое)
Надеюсь этот плагин поможет многим)Да, молодец denisco, рабочий плагин, только нужно вставить лишь [upload_form], иначе на странице выводится <?php echo do_shortcode(»); ?>. Но непонятно зачем нужно было это решать, ведь есть же плагины для этого, например Front-End Publishing ?
Да, молодец denisco, рабочий плагин, только нужно вставить лишь [upload_form], иначе на странице выводится <?php echo do_shortcode(»); ?>.
Это смотря куда вставлять. Если в редакторе, то да [upload_form][/upload_form], а если через файлы темы, то <?php echo do_shortcode(‘[upload_form][/upload_form]’); ?>
Но непонятно зачем нужно было это решать, ведь есть же плагины для этого, например Front-End Publishing ?
Плагин предназначен исключительно для того, чтобы ответить на вопрос electronikprm почему не работает его код. С тем же успехом я мог вставить просто листинг кода, но с плагином отсутствует проблема, что код вставят не туда или не так. А так да, плагинов всяких разных куча — можно использовать их, но никто не запрещает написать свой велосипед :).
- Тема «Добавить миниатюру записи фронтенд» закрыта для новых ответов.