sus-happy
11/15/2014 - 7:25 AM

WordPress CustomFIeld MediaUpload

WordPress CustomFIeld MediaUpload

<?php
 
// カスタムフィールドを追加する処理を色々
// 上記JSとCSSを読み込む処置も書く
 
function _add_meta_box( $post )
{
    // 登録済みであれば、ファイル情報を取得する
    $image_value = get_post_meta( $post->ID, 'field-image', TRUE );
    if( ! empty( $image_value ) ){
        $attached = get_post( $image_value );
        if( $attached ) {
            $image_attach_id = $attached->ID;
            $image_file      = $attached->guid;
            $image_file_name = basename( $image_file );
        }
    }
    
    $file_value = get_post_meta( $post->ID, 'field-file', TRUE );
    if( ! empty( $file_value ) ){
        $attached = get_post( $file_value );
        if( $attached ) {
            $file_attach_id = $attached->ID;
            $file_file      = $attached->guid;
            $file_file_name = basename( $file_file );
        }
    }

    ?>
    <!--
    data-type:   image / file
    data-title:  メディアアップロードのモーダルウィンドウのタイトル
    data-target: '#'+カスタムフィールド名
    -->
    
    <!-- data-type: imageの場合 -->
    <div class="custom-media" data-type="image" data-title="画像" data-target="#field-image">
        <input type="hidden" name="field-image" id="field-image" value="<?php echo $image_attach_id !== NULL ? esc_attr( $image_attach_id ) : ''; ?>" />
        <p>
            <a href="#" class="button button-primary custom-media-append">イラスト画像選択</a>
            <a href="#" class="button custom-media-delete">選択解除</a>
        </p>
    
        <!-- カスタムフィールド名(field-image)+'-photo'というIDを指定します -->
        <div class="media-photo" id="field-image-photo">
            <?php if( $image_attach_id !== NULL ): ?>
            <img src="<?php echo esc_url( $image_file ) ?>">
            <?php endif; ?>
        </div>
    </div>
    
    <!-- data-type: fileの場合 -->
    <div class="custom-media" data-type="file" data-title="画像" data-target="#field-file">
        <input type="hidden" name="field-file" id="field-file" value="<?php echo $file_attach_id !== NULL ? esc_attr( $file_attach_id ) : ''; ?>" />
        <p>
            <a href="#" class="button button-primary custom-media-append">イラスト画像選択</a>
            <a href="#" class="button custom-media-delete">選択解除</a>
        </p>
    
        <!-- カスタムフィールド名(field-file)+'-file'というIDを指定します -->
        <div class="media-file" id="field-file-file">
            <?php if( $file_attach_id !== NULL ): ?>
            <span class="filename"><?php echo esc_html( $file_file_name ) ?></span>
            <a class="button" href="<?php echo esc_url( $file_file ) ?>" target="_blank">プレビュー</a>
            <?php endif; ?>
        </div>
    </div>
    <?php
    
    wp_nonce_field( 'custom_key', 'custom_nonce' );
}

?>
/**
 * ファイル未選択時は「選択解除」ボタンが出ないようにする
 */
.wp-core-ui .custom-media .custom-media-delete {
    display: none;
}

/**
 * 画像がはみ出さないようにサイズ調整
 */
.media-photo {
}
    .media-photo img {
        max-width: 100%;
    }
/**
 * ファイル名とボタンの位置調整
 */
.media-file {
}
    .media-file span.filename {
        display: inline-block;
        /display: inline;
        /zoom: 1;
        margin-right: 15px;
        vertical-align: middle;
    }
/**
 * admin-media.js
 * 
 * @author SUSH <sush@sus-happy.ner>
 */
( function( $, U ) {
    $( function() {
        var target = $( '.custom-media' );

        // 対象要素がなければ終了
        if(! target.length ) {
            return false;
        }

        // 初期設定
        var CustomMediaWindow = function( wrap ) {
            this._wrap   = wrap;
            this._append = wrap.find( '.custom-media-append' );
            this._delete = wrap.find( '.custom-media-delete' );
            this._target = $( wrap.attr( 'data-target' ) );
            this._tgt_ap = null;
            this._type   = wrap.attr( 'data-type' );
            this._title  = wrap.attr( 'data-title' );

            this._window = U;

            this.init();
        };
        CustomMediaWindow.prototype = {
            // コンストラクタ
            init: function() {
                var that = this;

                this._append.bind( 'click.customMedia', function( e ) {
                    return that.open_window();
                } );

                this._delete.bind( 'click.customMedia', function( e ) {
                    return that.delete_selected();
                } );

                switch( that._type ) {
                    case 'image':
                        that.init_image();
                        break;
                    case 'file':
                        that.init_file();
                        break;
                }
            },
            // type: image のコンストラクタ
            init_image: function() {
                this._tgt_ap = $( this._wrap.attr( 'data-target' )+'-photo' );

                if( this._target.val() ) {
                    this._delete.show();
                }
            },
            // type: file のコンストラクタ
            init_file: function() {
                this._tgt_ap = $( this._wrap.attr( 'data-target' )+'-file' );

                if( this._target.val() ) {
                    this._delete.show();
                }
            },
            // メディアアップローダの表示
            open_window: function() {
                var that = this;

                // 未定義であれば設定
                if( this._window === U ) {
                    this._window = wp.media( {
                        title: this._title,
                        multiple: false,
                        button: { text: '登録' }
                    } );

                    // 画像選択時のイベント
                    this._window.on( 'select', function() {
                        var first = that._window.state().get( 'selection' ).first().toJSON();
                        that._target.val( first.id );
                        that._delete.show();

                        switch( that._type ) {
                            case 'image':
                                that.append_image( first );
                                break;
                            case 'file':
                                that.append_file( first );
                                break;
                        }
                    } );
                }

                // 表示
                this._window.open();

                return false;
            },
            // 画像選択
            append_image: function( selection ) {
                if( this._tgt_ap.length ) {
                    this._tgt_ap.html( '' );
                    $('<img>', { src: selection.url } ).appendTo( this._tgt_ap );
                }
            },
            // ファイル選択
            append_file: function( selection ) {
                if( this._tgt_ap.length ) {
                    this._tgt_ap.html( '' );
                    $('<span>', { class: 'filename' } ).text( selection.filename ).appendTo( this._tgt_ap );
                    $('<a>', { href: selection.url, target: '_blank', class: 'button' } ).text( 'プレビュー' ).appendTo( this._tgt_ap );
                }
            },
            // 選択解除
            delete_selected: function() {
                this._target.val( '' );
                this._delete.hide();

                switch( this._type ) {
                    case 'image':
                        this.delete_selected_image();
                        break;
                    case 'file':
                        this.delete_selected_file();
                        break;
                }

                return false;
            },
            // 画像選択解除
            delete_selected_image: function() {
                if( this._tgt_ap.length ) {
                    this._tgt_ap.html( '' );
                }
            },
            // ファイル選択解除
            delete_selected_file: function() {
                if( this._tgt_ap.length ) {
                    this._tgt_ap.html( '' );
                }
            }
        };

        // 対象要素の分だけインスタンスを作成
        target.each( function() {
            new CustomMediaWindow( $(this) );
        } );
    } );
} )( jQuery );