Поддержка Проблемы и решения Добавить миниатюру записи фронтенд

  • Решено electronikprm

    (@electronikprm)


    Доброго времени суток!

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

    нужно сделать это максимально просто например так
    <input type=»file» name=»img» id=»img» multiple accept=»image/*,image/jpeg»>

    существует ли внутренняя переменная как например ‘title’ ‘cat’ ‘description’

    Я так полагаю что ‘post-thumbnails’ только выводит миниатюру.

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Доброго.

    Как-то делал миграцию, может подойдет. $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 А как это на практике работает?

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Получаете данные с формы.
    После добавления записи — функция 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 и т.д.?
    И я так понимаю у топикстартера проблемы с данными для миниатюр, а не изображений.

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    В зависимости от метода отправки данные формы окажутся в массиве $_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);
    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Я так понял сама запись у Вас добавляется?

    в форме убрал параметр 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

    Проблема так и осталась(

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Собрал плагин-демку на основе Вашего кода. Установить, вставить в нужное место
    <?php echo do_shortcode('[upload_form][/upload_form]'); ?> этот шорткод выведет форму и можно пробовать. Реализацию можно посмотреть в самом файле плагина.

    Вот так работает! Спасибо большое)
    Надеюсь этот плагин поможет многим)

    Да, молодец denisco, рабочий плагин, только нужно вставить лишь [upload_form], иначе на странице выводится <?php echo do_shortcode(»); ?>. Но непонятно зачем нужно было это решать, ведь есть же плагины для этого, например Front-End Publishing ?

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Да, молодец denisco, рабочий плагин, только нужно вставить лишь [upload_form], иначе на странице выводится <?php echo do_shortcode(»); ?>.

    Это смотря куда вставлять. Если в редакторе, то да [upload_form][/upload_form], а если через файлы темы, то <?php echo do_shortcode(‘[upload_form][/upload_form]’); ?>

    Но непонятно зачем нужно было это решать, ведь есть же плагины для этого, например Front-End Publishing ?

    Плагин предназначен исключительно для того, чтобы ответить на вопрос electronikprm почему не работает его код. С тем же успехом я мог вставить просто листинг кода, но с плагином отсутствует проблема, что код вставят не туда или не так. А так да, плагинов всяких разных куча — можно использовать их, но никто не запрещает написать свой велосипед :).

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Тема «Добавить миниатюру записи фронтенд» закрыта для новых ответов.