Make WordPress Core


Ignore:
Timestamp:
12/03/2012 02:38:10 AM (13 years ago)
Author:
nacin
Message:

Bring Featured Images back into the main media dialog.

Most users don't realize that the Featured Image meta box exists; if they do, few use it.

Restores the old meta box UI, including the admin_post_thumbnail_html filter. If a plugin is using _wp_post_thumbnail_html() in conjunction with Thickbox elsewhere, it will also magically still work.

Specific underlying changes:

  • Converts the modal view to use the view manager, which means that a call to open() will automatically call render and attach if necessary.
  • Doesn't automatically set a state in wp.media, to allow code to customize the states to be added before activation.

props koopersmith.
fixes #21776.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/meta-boxes.php

    r22962 r22979  
    10021002 */
    10031003function post_thumbnail_meta_box( $post ) {
    1004     global $_wp_additional_image_sizes;
    1005 
    1006     ?><script type="text/javascript">
    1007     jQuery( function($) {
    1008         var $element     = $('#select-featured-image'),
    1009             $thumbnailId = $element.find('input[name="thumbnail_id"]'),
    1010             title        = '<?php _e( "Choose a Featured Image" ); ?>',
    1011             update       = '<?php _e( "Update Featured Image" ); ?>',
    1012             Attachment   = wp.media.model.Attachment,
    1013             frame, setFeaturedImage;
    1014 
    1015         setFeaturedImage = function( thumbnailId ) {
    1016             var selection;
    1017 
    1018             $element.find('img').remove();
    1019             $element.toggleClass( 'has-featured-image', -1 != thumbnailId );
    1020             $thumbnailId.val( thumbnailId );
    1021 
    1022             if ( frame ) {
    1023                 selection = frame.state('library').get('selection');
    1024 
    1025                 if ( -1 === thumbnailId )
    1026                     selection.clear();
    1027                 else
    1028                     selection.add( Attachment.get( thumbnailId ) );
    1029             }
    1030         };
    1031 
    1032         $element.on( 'click', '.choose, img', function( event ) {
    1033             var options, thumbnailId, attachment;
    1034 
    1035             event.preventDefault();
    1036 
    1037             if ( frame ) {
    1038                 frame.open();
    1039                 return;
    1040             }
    1041 
    1042             options = {
    1043                 title:   title,
    1044                 library: {
    1045                     type: 'image'
    1046                 }
    1047             };
    1048 
    1049             thumbnailId = $thumbnailId.val();
    1050             if ( '' !== thumbnailId && -1 !== thumbnailId ) {
    1051                 attachment = Attachment.get( thumbnailId );
    1052                 attachment.fetch();
    1053                 options.selection = [ attachment ];
    1054             }
    1055 
    1056             frame = wp.media( options );
    1057 
    1058             frame.state('library').set( 'filterable', 'uploaded' );
    1059 
    1060             frame.toolbar.on( 'activate:select', function() {
    1061                 frame.toolbar.view().set({
    1062                     select: {
    1063                         style: 'primary',
    1064                         text:  update,
    1065 
    1066                         click: function() {
    1067                             var selection = frame.state().get('selection'),
    1068                                 model = selection.first(),
    1069                                 sizes = model.get('sizes'),
    1070                                 size;
    1071 
    1072                             setFeaturedImage( model.id );
    1073 
    1074                             // @todo: might need a size hierarchy equivalent.
    1075                             if ( sizes )
    1076                                 size = sizes['post-thumbnail'] || sizes.medium;
    1077 
    1078                             // @todo: Need a better way of accessing full size
    1079                             // data besides just calling toJSON().
    1080                             size = size || model.toJSON();
    1081 
    1082                             frame.close();
    1083 
    1084                             $( '<img />', {
    1085                                 src:    size.url,
    1086                                 width:  size.width
    1087                             }).prependTo( $element );
    1088                         }
    1089                     }
    1090                 });
    1091             });
    1092 
    1093             frame.toolbar.mode('select');
    1094         });
    1095 
    1096         $element.on( 'click', '.remove', function( event ) {
    1097             event.preventDefault();
    1098             setFeaturedImage( -1 );
    1099         });
    1100     });
    1101     </script>
    1102 
    1103     <?php
    1104     $thumbnail_id   = get_post_meta( $post->ID, '_thumbnail_id', true );
    1105     $thumbnail_size = isset( $_wp_additional_image_sizes['post-thumbnail'] ) ? 'post-thumbnail' : 'medium';
    1106     $thumbnail_html = wp_get_attachment_image( $thumbnail_id, $thumbnail_size );
    1107 
    1108     $classes = empty( $thumbnail_id ) ? '' : 'has-featured-image';
    1109 
    1110     ?><div id="select-featured-image"
    1111         class="<?php echo esc_attr( $classes ); ?>"
    1112         data-post-id="<?php echo esc_attr( $post->ID ); ?>">
    1113         <?php echo $thumbnail_html; ?>
    1114         <input type="hidden" name="thumbnail_id" value="<?php echo esc_attr( $thumbnail_id ); ?>" />
    1115         <a href="#" class="choose button-secondary"><?php _e( 'Choose a Featured Image' ); ?></a>
    1116         <a href="#" class="remove"><?php _e( 'Remove Featured Image' ); ?></a>
    1117     </div>
    1118     <?php
    1119 }
     1004    $thumbnail_id = get_post_meta( $post->ID, '_thumbnail_id', true );
     1005    echo _wp_post_thumbnail_html( $thumbnail_id, $post->ID );
     1006}
Note: See TracChangeset for help on using the changeset viewer.