Обработка загрузок переднего плана с учетом безопасности и простоты использования

8

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

Плагин работает как пользовательский тип сообщения, поэтому он будет таким же «простым», как прикрепление изображения к сообщению.

Меня интересует только прикрепление изображений, а не файлов любого типа, но плагин все же использует, wp_editorи поэтому решение должно каким-то образом интегрироваться с этим. Я не слишком беспокоюсь о создании кнопки tinyMCE, если решение способно вставлять миниатюру изображения в текстовую область tinyMCE.

Обратите внимание, я имею в виду интерфейс моего сайта, а не административную область.

В абсолютно идеальной ситуации я бы хотел, чтобы этот сценарий происходил:

  • Пользователь нажимает «Задать вопрос»
  • Использование входит в их детали сообщения
  • Пользователь нажимает кнопку на интерфейсе tinyMCE, который, как и StackExchange, просит пользователя загрузить файл.
  • Затем система вставляет миниатюру правильного размера в текстовую область tinyMCE, сократив файл до размера миниатюры
  • Нажав на это изображение, вы получите ту же функциональность, что и вложение изображения в сообщении.
  • Затем пользователь может нажать еще раз, чтобы вставить новое изображение
  • Пользователь также может при необходимости удалить изображение из текстовой области tinyMCE.

Тем не менее, я рад, что кнопка tinyMCE является периферийной - если окно «загрузки файла» значительно проще, это нормально.

Я сталкивался с этой ссылкой, но я всегда опасаюсь читать статьи WordPress на t'interwebs, так как я никогда не уверен, насколько они безопасны, и я не являюсь экспертом в области безопасности php.

Заранее спасибо,

Dunc
источник
Я знаю автора этого конкретного урока. Позвоните ему, чтобы он мог ответить на ваш вопрос более конкретно ...
EAMann
Вопрос: если вы уже используете эту wp_editor()функцию, почему бы просто не использовать встроенный в нее набор для загрузки медиафайлов? Я не использовал wp_editorинтерфейс на переднем крае, но есть люди, которые успешно
справились с загрузкой
Спасибо Е.А.Манн. золотые яблоки, которые были бы предпочтительнее, но авторы плагинов сказали, что предоставление доступа к загрузке wp_editorмультимедиа даст пользователям любого уровня доступ ко всей моей медиатеке? Я бы не хотел, чтобы это имело место, просто чтобы они загрузили свои собственные.
Дан
Ах, это правда. Я не думал об этой проблеме. Я давно не смотрел на media-upload.phpисточник, но я уверен, что на media_upload_tabs есть фильтр, где вы можете отключить вкладку «Медиатека». Я посмотрю на это и увижу ...
золотые яблоки

Ответы:

4

Я думаю, что самый простой способ, поскольку вы уже используете эту wp_editorфункцию, это просто включить кнопки мультимедиа в экземпляр WP_Editor - таким образом, у вас будут встроенные функции, в том числе кнопка «Вставить в сообщение», встроенная в бесплатно.

Как вы это сделаете, очевидно, зависит от плагина, с которым вы пытаетесь работать. Тем не менее, это должно начать вас. Включите такой код в шаблон страницы для отображения редактора, и вы получите редактор на своей странице. Включение этого в форму и обработка результатов - это еще один шаг, не описанный здесь.

// Define the global variable $post_id - this is used by the media uploader
// to attach uploads to a specific post (so that the uploader can see uploads
// attached to this post and not others)
global $post_id;
$post_id = $post->ID; // should be the ID of the new post created

// Now filter the list of tabs available in the media editor.
// Remove everything but the "From Computer" option.

add_filter( 'media_upload_tabs', 'wpse42068_remove_additional_tabs' );

function wpse42068_remove_additional_tabs( $_default_tabs ) {
    return array( 'type' => __('From Computer') );
}

// Now just include the WP_Editor. See
// http://codex.wordpress.org/Function_Reference/wp_editor
// for settings available
wp_editor( '', 'posteditor', array( 'media_buttons' => true ) );

Определение почтового идентификатора, вероятно, является важной частью, и то, как вы это сделаете, будет зависеть от логики вашей функциональности. Я бы предложил:

  • Создание автоматического черновика при первом посещении этой страницы и сохранение идентификатора сообщения, возвращенного в глобальной переменной $ post_id.
  • Затем сохраните созданную запись с тем же идентификатором при отправке формы.
goldenapples
источник
Не легко понять для начинающих. В любом случае, спасибо
whiteletters в чистых листах
6

Может быть, это не ваше идеальное решение, но оно того стоит. Получил это, прибегая к помощи, но, к сожалению, я забыл URL. Присоединяемая часть похожа на статью в @goldenapples.

Вот основная функция.

function attach_uploads($uploads,$post_id = 0){
    $files = rearrange($uploads);
    if($files[0]['name']==''){
        return false;   
    }
    foreach($files as $file){
        $upload_file = wp_handle_upload( $file, array('test_form' => false) );
        $attachment = array(
        'post_mime_type' => $upload_file['type'],
        'post_title' => preg_replace('/\.[^.]+$/', '', basename($upload_file['file'])),
        'post_content' => '',
        'post_status' => 'inherit'
    );
        $attach_id = wp_insert_attachment( $attachment, $upload_file['file'], $post_id );
        $attach_array[] = $attach_id;
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata( $attach_id, $upload_file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_data );
    }
    return $attach_array;
}

Функция ajax

add_action('wp_ajax_attach_file', 'process_attach_file');
function process_attach_file() {

    // add some filter and validation on the id and the files here
    $post_id = $_POST['post_id'];
    $files = $_FILES['profile-picture'];

    // insert attachment
    $attached_files = attach_uploads($files,$post_id);

    // set the first file as post thumbnail
    if($attached_files){
        set_post_thumbnail( $post_id, $attached_files[0] ); 
    }

    // now all you have to do is set the response data

}

Разметка

<form id="upload-form" action="<?php echo admin_url('admin-ajax.php'); ?>" method="post" class="form" enctype="multipart/form-data" >
    <label for="profile-picture">Foto Profil</label>
    <input type="file" id="profile-picture" name="profile-picture[]" size="40" multiple />
    <?php wp_nonce_field( // intention nonce); ?>
    <input name="action" value="attach_file" type="hidden">
    <input name="post_id" value="12" type="hidden">
</form>

Надеюсь это поможет

ifdion
источник
Можете ли вы обобщить, что делает эта функция?
Дан
1
Конечно. Первая функция - это та, которая обрабатывает загрузку файлов. Прежде всего, он переставляет массив загруженных файлов, чтобы сделать его пригодным для цикла «foreach».
ifdion
1
wp_handle_uploadпомещает загруженный файл в каталог wp-content / uploads. wp_insert_attachmentловит информацию о файле и сохраняет ее как вложение в таблице wp_posts. wp_generate_attachment_metadata и wp_update_attachment_metadata делает то, что говорит. Вторая часть - это функция ajax, которая обрабатывает форму, показанную в разметке, используя attach uploadsфункцию.
ifdion
1
Дополнительная ссылка для функции перестановки [ссылка] ( php.net/manual/en/features.file-upload.multiple.php )
ifdion