web-dev-qa-db-ja.com

安全性と使いやすさを考慮した、フロントエンドファイルのアップロード処理

私はメディアを添付するための機能を持たない既存のフォーラムのようなプラグインを適応させようとしています。

このプラグインはカスタム投稿タイプとして機能するため、投稿に画像を添付するのと同じくらい簡単です。

私はどんなファイルタイプではなく画像を添付することについてだけ心配しています、しかしプラグインはwp_editorを使います、そしてそのようなものとして解決策はそれと何らかの形で統合するべきです。ソリューションが画像のサムネイルをtinyMCEテキストエリアに挿入することができる限り、私はtinyMCEボタンの作成について過度に悩んではいません。

注意してください、私は管理領域よりもむしろ私のウェブサイトのフロントエンドに言及しています。

絶対に理想的な状況では、私はこのシナリオが起こることを望みます:

  • ユーザーが「質問する」をクリックします
  • 投稿の詳細を入力する
  • ユーザーがtinyMCEインターフェースのボタンをクリックすると、StackExchangeと同様に、ユーザーにファイルのアップロードを要求します。
  • 次に、システムは、正しいサイズのサムネイルをtinyMCEテキストエリアに挿入します。ファイルはこのサムネイルサイズに圧縮されています。
  • この画像をクリックすると、投稿の画像添付ファイルと同じ機能が提供されます。
  • ユーザーは再度クリックして新しい画像を挿入できます
  • ユーザーは必要に応じてtinyMCEテキストエリアから画像を削除することもできます。

しかしながら、私はtinyMCEボタンが周辺機器になることを嬉しく思います - 「ファイルアップロード」ボックスが非常に簡単であれば、それで大丈夫です。

私は遭遇しました このリンク しかし、私はt'interwebsでWordPressの記事を読むことに不安を感じています。

前もって感謝します、

8
dunc

私は最も簡単な方法だと思います。すでにwp_editor関数を使用しているのはWP_Editorインスタンスにメディアボタンを含めることになるでしょう - このようにしてネイティブの関数( "Insert into post"ボタンを含む)を構築します無料で。

どのようにこれを行うかは明らかにあなたが作業しようとしているプラ​​グインに依存します。しかし、これであなたは始められるはずです。このようなコードをページテンプレートに含めてエディタを表示すると、ページにエディタが表示されます。これをフォームに含めて結果を処理することは、ここでは詳述しない別のステップです。

// 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 ) );

投稿IDを定義することはおそらく非常に重要な部分です。これをどのように行うかは、機能のロジックによって異なります。私はお勧めします:

  • このページに最初にアクセスしたときに自動ドラフトを作成し、返された投稿IDをグローバル$ post_id変数に保存します。
  • 次に、フォームが送信されたときに、作成した投稿を同じIDで保存します。
4
goldenapples

たぶんこれはあなたの理想的な解決策ではありませんが、それは一撃の価値があります。グーグルでそれを得たが、残念ながら私は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>

この助けを願っています

6
ifdion