WordPress.org

Make WordPress Core

Ticket #30062: 30062.diff

File 30062.diff, 27.8 KB (added by ericmann, 5 years ago)

Original proposed patch to address the issues presented by the ticket. Props due to @bswatson @jonbellah @ednoles @kylereicks @sabreuse @ericmann

  • src/wp-admin/includes/image-edit.php

     
    66 * @subpackage Administration
    77 */
    88
     9/**
     10 * Print the WordPress Image Editor
     11 *
     12 * @global array $_imgedit_groups Editor groups
     13 *
     14 * @param int  $post_id ID of image being edited
     15 * @param bool $msg     Admin message
     16 */
    917function wp_image_editor($post_id, $msg = false) {
     18        global $_imgedit_groups;
     19
    1020        $nonce = wp_create_nonce("image_editor-$post_id");
    1121        $meta = wp_get_attachment_metadata($post_id);
    12         $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    13         $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    1422        $note = '';
    1523
    1624        if ( isset( $meta['width'], $meta['height'] ) )
     
    2028
    2129        $sizer = $big > 400 ? 400 / $big : 1;
    2230
    23         $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
    24         $can_restore = false;
    25         if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) )
    26                 $can_restore = $backup_sizes['full-orig']['file'] != basename( $meta['file'] );
     31        // Add the default image groups
     32        add_imgedit_group( 'scale-image' );
     33        add_imgedit_group( 'restore-image' );
     34        add_imgedit_group( 'crop-image' );
     35        add_imgedit_group( 'applyto' );
    2736
    2837        if ( $msg ) {
    2938                if ( isset($msg->error) )
     
    3746        <div id="imgedit-panel-<?php echo $post_id; ?>">
    3847
    3948        <div class="imgedit-settings">
    40         <div class="imgedit-group">
    41         <div class="imgedit-group-top">
    42                 <h3><?php _e( 'Scale Image' ); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
    43                 <div class="imgedit-help">
    44                 <p><?php _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.'); ?></p>
     49                <?php foreach ( $_imgedit_groups as $imgedit_group_name => $imgedit_group_view ) : ?>
     50                <div class="imgedit-group imgedit-<?php echo esc_attr( sanitize_title( $imgedit_group_name ) ); ?>">
     51                        <?php if ( function_exists( $imgedit_group_view ) ) : ?>
     52                                <?php $imgedit_group_view( $post_id, $nonce, $meta ); ?>
     53                        <?php endif; ?>
    4554                </div>
    46                 <?php if ( isset( $meta['width'], $meta['height'] ) ): ?>
    47                 <p><?php printf( __('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height'] ); ?></p>
    48                 <?php endif ?>
    49                 <div class="imgedit-submit">
    50                 <span class="nowrap"><input type="text" id="imgedit-scale-width-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1)" style="width:4em;" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0)" style="width:4em;" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
    51                 <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo $post_id; ?>">!</span></span>
    52                 <input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'scale')" class="button button-primary" value="<?php esc_attr_e( 'Scale' ); ?>" />
    53                 </div>
     55                <?php endforeach; ?>
    5456        </div>
    55         </div>
    5657
    57 <?php if ( $can_restore ) { ?>
    58 
    59         <div class="imgedit-group">
    60         <div class="imgedit-group-top">
    61                 <h3><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php _e('Restore Original Image'); ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h3>
    62                 <div class="imgedit-help">
    63                 <p><?php _e('Discard any changes and restore the original image.');
    64 
    65                 if ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE )
    66                         echo ' '.__('Previously edited copies of the image will not be deleted.');
    67 
    68                 ?></p>
    69                 <div class="imgedit-submit">
    70                 <input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'restore')" class="button button-primary" value="<?php esc_attr_e( 'Restore image' ); ?>" <?php echo $can_restore; ?> />
    71                 </div>
    72                 </div>
    73         </div>
    74         </div>
    75 
    76 <?php } ?>
    77 
    78         <div class="imgedit-group">
    79         <div class="imgedit-group-top">
    80                 <h3><?php _e('Image Crop'); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
    81 
    82                 <div class="imgedit-help">
    83                 <p><?php _e('To crop the image, click on it and drag to make your selection.'); ?></p>
    84 
    85                 <p><strong><?php _e('Crop Aspect Ratio'); ?></strong><br />
    86                 <?php _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.'); ?></p>
    87 
    88                 <p><strong><?php _e('Crop Selection'); ?></strong><br />
    89                 <?php _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.'); ?></p>
    90                 </div>
    91         </div>
    92 
    93         <p>
    94                 <?php _e('Aspect ratio:'); ?>
    95                 <span  class="nowrap">
    96                 <input type="text" id="imgedit-crop-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" style="width:3em;" />
    97                 :
    98                 <input type="text" id="imgedit-crop-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" style="width:3em;" />
    99                 </span>
    100         </p>
    101 
    102         <p id="imgedit-crop-sel-<?php echo $post_id; ?>">
    103                 <?php _e('Selection:'); ?>
    104                 <span  class="nowrap">
    105                 <input type="text" id="imgedit-sel-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>)" style="width:4em;" />
    106                 &times;
    107                 <input type="text" id="imgedit-sel-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>)" style="width:4em;" />
    108                 </span>
    109         </p>
    110         </div>
    111 
    112         <?php if ( $thumb && $sub_sizes ) {
    113                 $thumb_img = wp_constrain_dimensions( $thumb['width'], $thumb['height'], 160, 120 );
    114         ?>
    115 
    116         <div class="imgedit-group imgedit-applyto">
    117         <div class="imgedit-group-top">
    118                 <h3><?php _e('Thumbnail Settings'); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
    119                 <p class="imgedit-help"><?php _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.'); ?></p>
    120         </div>
    121 
    122         <p>
    123                 <img src="<?php echo $thumb['url']; ?>" width="<?php echo $thumb_img[0]; ?>" height="<?php echo $thumb_img[1]; ?>" class="imgedit-size-preview" alt="" draggable="false" />
    124                 <br /><?php _e('Current thumbnail'); ?>
    125         </p>
    126 
    127         <p id="imgedit-save-target-<?php echo $post_id; ?>">
    128                 <strong><?php _e('Apply changes to:'); ?></strong><br />
    129 
    130                 <label class="imgedit-label">
    131                 <input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="all" checked="checked" />
    132                 <?php _e('All image sizes'); ?></label>
    133 
    134                 <label class="imgedit-label">
    135                 <input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="thumbnail" />
    136                 <?php _e('Thumbnail'); ?></label>
    137 
    138                 <label class="imgedit-label">
    139                 <input type="radio" name="imgedit-target-<?php echo $post_id; ?>" value="nothumb" />
    140                 <?php _e('All sizes except thumbnail'); ?></label>
    141         </p>
    142         </div>
    143 
    144         <?php } ?>
    145 
    146         </div>
    147 
    14858        <div class="imgedit-panel-content">
    14959                <?php echo $note; ?>
    15060                <div class="imgedit-menu">
     
    826736        $return->msg = esc_js( __('Image saved') );
    827737        return $return;
    828738}
     739
     740/**
     741 * Register default image groups so they're available for `wp_image_editor()`
     742 */
     743function add_default_imgedit_groups(){
     744        register_imgedit_group( 'scale-image',   'view_image_edit_group_scale_image'   );
     745        register_imgedit_group( 'restore-image', 'view_image_edit_group_restore_image' );
     746        register_imgedit_group( 'crop-image',    'view_image_edit_group_crop_image'    );
     747        register_imgedit_group( 'applyto',       'view_image_edit_group_apply_to'      );
     748}
     749add_action( 'init', 'add_default_imgedit_groups' );
     750
     751/**
     752 * Print out the Scale Image edit group.
     753 *
     754 * @param int    $post_id
     755 * @param string $nonce
     756 * @param array  $meta
     757 */
     758function view_image_edit_group_scale_image( $post_id, $nonce, $meta ){
     759        ?>
     760        <div class="imgedit-group-top">
     761                <h3><?php _e( 'Scale Image' ); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
     762                <div class="imgedit-help">
     763                        <p><?php _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.'); ?></p>
     764                </div>
     765                <?php if ( isset( $meta['width'], $meta['height'] ) ): ?>
     766                        <p><?php printf( __('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height'] ); ?></p>
     767                <?php endif ?>
     768                <div class="imgedit-submit">
     769                        <span class="nowrap"><input type="text" id="imgedit-scale-width-<?php echo esc_attr( $post_id ); ?>" onkeyup="imageEdit.scaleChanged(<?php echo esc_js( $post_id ); ?>, 1)" onblur="imageEdit.scaleChanged(<?php echo esc_js( $post_id ); ?>, 1)" style="width:4em;" value="<?php echo isset( $meta['width'] ) ? esc_attr( $meta['width'] ) : 0; ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php echo esc_attr( $post_id ); ?>" onkeyup="imageEdit.scaleChanged(<?php echo esc_js( $post_id ); ?>, 0)" onblur="imageEdit.scaleChanged(<?php echo esc_js( $post_id ); ?>, 0)" style="width:4em;" value="<?php echo isset( $meta['height'] ) ? esc_attr( $meta['height'] ) : 0; ?>" />
     770                        <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo esc_attr( $post_id ); ?>">!</span></span>
     771                        <input type="button" onclick="imageEdit.action(<?php echo esc_js( "$post_id, '$nonce'" ); ?>, 'scale')" class="button button-primary" value="<?php esc_attr_e( 'Scale' ); ?>" />
     772                </div>
     773        </div>
     774<?php
     775}
     776
     777/**
     778 * Print the Restore Image edit group
     779 *
     780 * @param int    $post_id
     781 * @param string $nonce
     782 * @param array  $meta
     783 */
     784function view_image_edit_group_restore_image( $post_id, $nonce, $meta ){
     785        $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
     786        $can_restore = false;
     787
     788        if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) ) {
     789                $can_restore = $backup_sizes['full-orig']['file'] != basename( $meta['file'] );
     790        }
     791
     792        if ( $can_restore ) { ?>
     793                <div class="imgedit-group-top">
     794                        <h3><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php _e('Restore Original Image'); ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h3>
     795                        <div class="imgedit-help">
     796                                <p><?php _e('Discard any changes and restore the original image.');
     797
     798                                        if ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) {
     799                                                echo ' '.__('Previously edited copies of the image will not be deleted.');
     800                                        }
     801
     802                                        ?></p>
     803                                <div class="imgedit-submit">
     804                                        <input type="button" onclick="imageEdit.action(<?php echo esc_js( "$post_id, '$nonce'" ); ?>, 'restore')" class="button button-primary" value="<?php esc_attr_e( 'Restore image' ); ?>" <?php echo $can_restore; ?> />
     805                                </div>
     806                        </div>
     807                </div>
     808        <?php } ?>
     809<?php
     810}
     811
     812/**
     813 * Print the Crop Image edit group
     814 *
     815 * @param int    $post_id
     816 * @param string $nonce
     817 * @param array  $meta
     818 */
     819function view_image_edit_group_crop_image( $post_id, $nonce, $meta ){
     820        ?>
     821        <div class="imgedit-group-top">
     822                <h3><?php _e('Image Crop'); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
     823
     824                <div class="imgedit-help">
     825                        <p><?php _e('To crop the image, click on it and drag to make your selection.'); ?></p>
     826
     827                        <p><strong><?php _e('Crop Aspect Ratio'); ?></strong><br />
     828                                <?php _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.'); ?></p>
     829
     830                        <p><strong><?php _e('Crop Selection'); ?></strong><br />
     831                                <?php _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.'); ?></p>
     832                </div>
     833        </div>
     834
     835        <p>
     836                <?php _e('Aspect ratio:'); ?>
     837                <span  class="nowrap">
     838                <input type="text" id="imgedit-crop-width-<?php echo esc_attr( $post_id ); ?>" onkeyup="imageEdit.setRatioSelection(<?php echo esc_js( $post_id ); ?>, 0, this)" style="width:3em;" />
     839                :
     840                <input type="text" id="imgedit-crop-height-<?php echo esc_attr( $post_id ); ?>" onkeyup="imageEdit.setRatioSelection(<?php echo esc_js( $post_id ); ?>, 1, this)" style="width:3em;" />
     841                </span>
     842        </p>
     843
     844        <p id="imgedit-crop-sel-<?php echo $post_id; ?>">
     845                <?php _e('Selection:'); ?>
     846                <span  class="nowrap">
     847                <input type="text" id="imgedit-sel-width-<?php echo esc_attr( $post_id ); ?>" onkeyup="imageEdit.setNumSelection(<?php echo esc_js( $post_id ); ?>)" style="width:4em;" />
     848                        &times;
     849                        <input type="text" id="imgedit-sel-height-<?php echo esc_attr( $post_id ); ?>" onkeyup="imageEdit.setNumSelection(<?php echo esc_js( $post_id ); ?>)" style="width:4em;" />
     850                </span>
     851        </p>
     852<?php
     853}
     854
     855/**
     856 * Print the Apply To edit group.
     857 *
     858 * @param int    $post_id
     859 * @param string $nonce
     860 * @param array  $meta
     861 */
     862function view_image_edit_group_apply_to( $post_id, $nonce, $meta ){
     863        $thumb = image_get_intermediate_size($post_id, 'thumbnail');
     864        $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
     865        if ( $thumb && $sub_sizes ) {
     866                $thumb_img = wp_constrain_dimensions( $thumb['width'], $thumb['height'], 160, 120 );
     867                ?>
     868                <div class="imgedit-group-top">
     869                        <h3><?php _e('Thumbnail Settings'); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
     870                        <p class="imgedit-help"><?php _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.'); ?></p>
     871                </div>
     872
     873                <p>
     874                        <img src="<?php echo esc_url( $thumb['url'] ); ?>" width="<?php echo esc_attr( $thumb_img[0] ); ?>" height="<?php echo esc_attr( $thumb_img[1] ); ?>" class="imgedit-size-preview" alt="" draggable="false" />
     875                        <br /><?php _e('Current thumbnail'); ?>
     876                </p>
     877
     878                <p id="imgedit-save-target-<?php echo esc_attr( $post_id ); ?>">
     879                        <strong><?php _e('Apply changes to:'); ?></strong><br />
     880
     881                        <label class="imgedit-label">
     882                                <input type="radio" name="imgedit-target-<?php echo esc_attr( $post_id ); ?>" value="all" checked="checked" />
     883                                <?php _e('All image sizes'); ?></label>
     884
     885                        <label class="imgedit-label">
     886                                <input type="radio" name="imgedit-target-<?php echo esc_attr( $post_id ); ?>" value="thumbnail" />
     887                                <?php _e('Thumbnail'); ?></label>
     888
     889                        <label class="imgedit-label">
     890                                <input type="radio" name="imgedit-target-<?php echo esc_attr( $post_id ); ?>" value="nothumb" />
     891                                <?php _e('All sizes except thumbnail'); ?></label>
     892                </p>
     893        <?php
     894        }
     895}
     896
     897/**
     898 * Register a new image edit group for inclusion in the WP image editor.
     899 *
     900 * @since 4.1.0
     901 *
     902 * @global array    $_imgedit_groups
     903 *
     904 * @param  string   $name Name of the group to be registered
     905 * @param  callable $callback
     906 *
     907 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     908 */
     909function register_imgedit_group( $name, $callback ) {
     910        global $_imgedit_groups;
     911
     912        // Make sure the array is set up properly first
     913        if ( !isset( $_imgedit_groups['registered'] ) ) {
     914                $_imgedit_groups['registered'] = array();
     915        }
     916
     917        // If the edit group is already loaded, return an error
     918        if ( isset( $_imgedit_groups['registered'][$name] ) ) {
     919                return new WP_Error( 'duplicate_registered_imgedit_group', __( 'Specified imgedit group is already registered.' ) );
     920        }
     921
     922        // Add the edit group to the registered array
     923        if ( !isset ( $_imgedit_groups['registered'][$name] ) ) {
     924                $_imgedit_groups['registered'][$name] = $callback;
     925        }
     926
     927        /**
     928         * Alert listeners that we've added an imgedit group.
     929         *
     930         * @since 4.1.0
     931         *
     932         * @param string $name Image edit group name
     933         */
     934        do_action( 'registered_imgedit_group', $name );
     935
     936        return true;
     937}
     938
     939/**
     940 * Unregister a new image edit group for inclusion in the WP image editor.
     941 *
     942 * @since 4.1.0
     943 *
     944 * @global array  $_imgedit_groups
     945 *
     946 * @param  string $name Name of the group to be registered
     947 *
     948 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     949 */
     950function unregister_imgedit_group( $name ) {
     951        global $_imgedit_groups;
     952
     953        // if the edit group doesn't exist, return an error
     954        if ( !isset ( $_imgedit_groups['registered'][$name] ) ) {
     955                return new WP_Error( 'invalid_imgedit_group', __( 'Invalid imgedit group.' ) );
     956        }
     957
     958        // if the edit group is currently loaded, return an error
     959        if ( isset ( $_imgedit_groups['loaded'][$name] ) ) {
     960                return new WP_Error( 'loaded_imgedit_group', __( 'Cannot unregister a currently loaded imgedit group.' ) );
     961        }
     962
     963        // remove the edit group from the array
     964        if ( isset ( $_imgedit_groups['registered'][$name] ) ) {
     965                unset ( $_imgedit_groups['registered'][$name] );
     966        }
     967
     968        /**
     969         * Alert listeners that we've unregistered an imgedit group.
     970         *
     971         * @since 4.1.0
     972         *
     973         * @param string $name Image edit group name
     974         */
     975        do_action( 'unregistered_imgedit_group', $name );
     976
     977        return true;
     978}
     979
     980/**
     981 * Get a list of loaded image edit groups for the editor modal.
     982 *
     983 * @since 4.1.0
     984 *
     985 * @global array $_imgedit_groups
     986 *
     987 * @return array
     988 */
     989function get_imgedit_groups() {
     990        global $_imgedit_groups;
     991
     992        // Make sure the array is set up properly first
     993        if ( !isset( $_imgedit_groups['loaded'] ) ) {
     994                $_imgedit_groups['loaded'] = array();
     995        }
     996
     997        /**
     998         * Filter the loaded image edit groups to allow for dynamic manipulation of what's loaded and the specific order.
     999         *
     1000         * @since 4.1.0
     1001         *
     1002         * @param array $groups Loaded image edit groups
     1003         */
     1004
     1005        return apply_filters( 'imgedit_groups', $_imgedit_groups['loaded'] );
     1006}
     1007
     1008/**
     1009 * Remove an image edit group from the loading array. The group will still be registered, but will not render to the UI.
     1010 *
     1011 * @since 4.1.0
     1012 *
     1013 * @global array $_imgedit_groups
     1014 *
     1015 * @param string $name Name of the group to remove
     1016 *
     1017 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     1018 */
     1019function remove_imgedit_group( $name ) {
     1020        global $_imgedit_groups;
     1021
     1022        // Make sure the array is set up properly first
     1023        if ( !isset( $_imgedit_groups['loaded'] ) ) {
     1024                $_imgedit_groups['loaded'] = array();
     1025        }
     1026
     1027        // If the group isn't set to load at all, be sure to trigger an error.
     1028        if ( !isset( $_imgedit_groups['loaded'][$name] ) ) {
     1029                return new WP_Error( 'invalid_imgedit_group', __( 'Invalid imgedit group.' ) );
     1030        }
     1031
     1032        // Unset the group
     1033        unset( $_imgedit_groups['loaded'][$name] );
     1034
     1035        /**
     1036         * Inform listeners that the specified image edit group has been removed from the loading array.
     1037         *
     1038         * @since 4.1.0
     1039         *
     1040         * @param string $name Image edit group name.
     1041         */
     1042        do_action( 'removed_imgedit_group', $name );
     1043
     1044        return true;
     1045}
     1046
     1047/**
     1048 * Add an image edit group for inclusion in the WP Editor UI.
     1049 *
     1050 * @since 4.1.0
     1051 *
     1052 * @global array   $_imgedit_groups
     1053 *
     1054 * @param string   $name     Name of the group to add.
     1055 * @param callable $callback Callback function to render the markup for the edit group. Optional only if the group was previously registered.
     1056 *
     1057 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     1058 */
     1059function add_imgedit_group( $name, $callback = null ) {
     1060        global $_imgedit_groups;
     1061
     1062        // Make sure the array is set up properly first
     1063        if ( !isset( $_imgedit_groups['loaded'] ) ) {
     1064                $_imgedit_groups['loaded'] = array();
     1065        }
     1066
     1067        // Make sure the array is set up properly first
     1068        if ( !isset( $_imgedit_groups['registered'] ) ) {
     1069                $_imgedit_groups['registered'] = array();
     1070        }
     1071
     1072        // If the callback is specified, register the group first
     1073        if ( null !== $callback ) {
     1074                $registered = register_imgedit_group( $name, $callback );
     1075
     1076                if ( is_wp_error( $registered ) ) {
     1077                        return $registered;
     1078                }
     1079        }
     1080
     1081        // If the edit group isn't registered, return an error
     1082        if ( !isset( $_imgedit_groups['registered'][$name] ) ) {
     1083                return new WP_Error( 'invalid_imgedit_group', __( 'Invalid imgedit group.' ) );
     1084        }
     1085
     1086        // If the edit group is already loaded, return an error
     1087        if ( isset( $_imgedit_groups['loaded'][$name] ) ) {
     1088                return new WP_Error( 'duplicate_imgedit_group', __( 'Specified imgedit group already exists.' ) );
     1089        }
     1090
     1091        // Load the image edit group into the loaded array
     1092        $_imgedit_groups['loaded'][$name] = $_imgedit_groups['registered'][$name];
     1093
     1094        /**
     1095         * Inform listeners that a specific edit group has been added to the loading array.
     1096         *
     1097         * @since 4.1.0
     1098         *
     1099         * @param string $name Name of the new edit group
     1100         */
     1101        do_action( 'loaded_imgedit_group', $name );
     1102
     1103        return true;
     1104}
  • tests/phpunit/tests/image/functions.php

     
    1313        public function setUp() {
    1414                parent::setUp();
    1515
     16                require_once( ABSPATH . '/wp-admin/includes/image-edit.php' );
    1617                require_once( ABSPATH . WPINC . '/class-wp-image-editor.php' );
    1718                require_once( ABSPATH . WPINC . '/class-wp-image-editor-gd.php' );
    1819                require_once( ABSPATH . WPINC . '/class-wp-image-editor-imagick.php' );
     
    335336                remove_filter( 'wp_image_editors', array( $this, 'mock_image_editor' ) );
    336337                WP_Image_Editor_Mock::$save_return = array();
    337338        }
     339
     340        /**
     341         * @ticket 30062
     342         */
     343        public function test_get_imgedit_groups() {
     344                // Setup
     345                global $_imgedit_groups;
     346                $_imgedit_groups = array(
     347                        'loaded'     => array(
     348                                'first' => true,
     349                        ),
     350                        'registered' => array(
     351                                'first'  => true,
     352                                'second' => true,
     353                        ),
     354                );
     355
     356                // Act
     357                $groups = get_imgedit_groups();
     358
     359                // Verify
     360                $this->assertEquals( 1, count( $groups ) );
     361                $this->assertTrue( $groups['first'] );
     362        }
     363
     364        /**
     365         * @ticket 30062
     366         */
     367        public function test_get_imgedit_groups_invokes_filter() {
     368                // Setup
     369                global $_imgedit_groups;
     370                $_imgedit_groups = array(
     371                        'loaded'     => array(
     372                                'first' => true,
     373                        ),
     374                        'registered' => array(
     375                                'first'  => true,
     376                                'second' => true,
     377                        ),
     378                );
     379
     380                // Act
     381                $groups = get_imgedit_groups();
     382
     383                // Verify
     384                $this->assertEquals( 1, count( $groups ) );
     385                $this->assertTrue( $groups['first'] );
     386
     387                // Manipulate
     388                add_filter( 'imgedit_groups', function ( $imgedit_groups ) {
     389                        $imgedit_groups['third'] = 'added';
     390
     391                        return $imgedit_groups;
     392                } );
     393
     394                // Act
     395                $groups = get_imgedit_groups();
     396
     397                // Verify
     398                $this->assertEquals( 2, count( $groups ) );
     399                $this->assertTrue( $groups['first'] );
     400                $this->assertEquals( 'added', $groups['third'] );
     401        }
     402
     403        /**
     404         * @ticket 30062
     405         */
     406        public function test_add_imgedit_group() {
     407                // Setup
     408                global $_imgedit_groups;
     409                $_imgedit_groups = array();
     410
     411                // Act
     412                $response = add_imgedit_group( 'first', true );
     413
     414                // Verify
     415                $this->assertEquals( true, $response );
     416
     417                $this->assertEquals( 1, count( $_imgedit_groups['loaded'] ) );
     418                $this->assertEquals( 1, count( $_imgedit_groups['registered'] ) );
     419                $this->assertTrue( $_imgedit_groups['loaded']['first'] );
     420                $this->assertTrue( $_imgedit_groups['registered']['first'] );
     421        }
     422
     423        /**
     424         * @ticket 30062
     425         */
     426        public function test_add_imgedit_group_without_callback() {
     427                global $_imgedit_groups;
     428                $_imgedit_groups = array();
     429
     430                $response = add_imgedit_group( 'first' );
     431
     432                $this->assertEquals( true, is_wp_error( $response ) );
     433
     434                $this->assertEquals( 0, count( $_imgedit_groups['loaded'] ) );
     435                $this->assertEquals( 0, count( $_imgedit_groups['registered'] ) );
     436        }
     437
     438        /**
     439         * @ticket 30062
     440         */
     441        public function test_duplicate_loaded_add_imgedit_group() {
     442                // Setup
     443                global $_imgedit_groups;
     444                $_imgedit_groups = array(
     445                        'loaded'     => array(
     446                                'first' => true,
     447                        ),
     448                        'registered' => array(
     449                                'first' => true,
     450                        ),
     451                );
     452
     453                // Act
     454                $response = add_imgedit_group( 'first' );
     455
     456                $this->assertEquals( true, is_wp_error( $response ) );
     457
     458                $this->assertEquals( 1, count( $_imgedit_groups['loaded'] ) );
     459                $this->assertEquals( 1, count( $_imgedit_groups['registered'] ) );
     460        }
     461
     462        /**
     463         * @ticket 30062
     464         */
     465        public function test_add_imgedit_group_with_registered_group() {
     466                // Setup
     467                global $_imgedit_groups;
     468                $_imgedit_groups = array(
     469                        'loaded'     => array(),
     470                        'registered' => array(
     471                                'first' => true,
     472                        ),
     473                );
     474
     475                // Act
     476                $response1 = add_imgedit_group( 'first' );
     477                $response2 = add_imgedit_group( 'second' );
     478
     479                // Verify
     480                $this->assertEquals( true, $response1 );
     481                $this->assertEquals( true, is_wp_error( $response2 ) );
     482
     483                $this->assertEquals( 1, count( $_imgedit_groups['loaded'] ) );
     484                $this->assertEquals( 1, count( $_imgedit_groups['registered'] ) );
     485                $this->assertTrue( $_imgedit_groups['loaded']['first'] );
     486                $this->assertTrue( $_imgedit_groups['registered']['first'] );
     487        }
     488
     489        /**
     490         * @ticket 30062
     491         */
     492        public function test_loaded_imgedit_group_action() {
     493                // Setup
     494                global $_imgedit_groups;
     495                $_imgedit_groups = array();
     496
     497                $action_invoked = false;
     498
     499                add_action( 'loaded_imgedit_group', function ( $name ) use ( &$action_invoked ) {
     500                        $action_invoked = $name;
     501                } );
     502
     503                // Act
     504                $response = add_imgedit_group( 'first', function () {
     505                        } );
     506
     507                // Verify
     508                $this->assertEquals( true, $response );
     509                $this->assertEquals( 'first', $action_invoked );
     510        }
     511
     512        /**
     513         * @ticket 30062
     514         */
     515        public function test_remove_imgedit_group() {
     516                // Setup
     517                global $_imgedit_groups;
     518                $_imgedit_groups = array(
     519                        'loaded'     => array(
     520                                'first'  => true,
     521                                'second' => true,
     522                        ),
     523                        'registered' => array(
     524                                'first'  => true,
     525                                'second' => true,
     526                        ),
     527                );
     528
     529                // Act
     530                $response = remove_imgedit_group( 'first' );
     531
     532                // Verify
     533                $this->assertEquals( true, $response );
     534                $this->assertEquals( 1, count( $_imgedit_groups['loaded'] ) );
     535                $this->assertEquals( 2, count( $_imgedit_groups['registered'] ) );
     536                $this->assertTrue( $_imgedit_groups['loaded']['second'] );
     537                $this->assertTrue( $_imgedit_groups['registered']['second'] );
     538        }
     539
     540        /**
     541         * @ticket 30062
     542         */
     543        public function test_remove_imgedit_group_invalid() {
     544                // Setup
     545                global $_imgedit_groups;
     546                $_imgedit_groups = array(
     547                        'loaded'     => array(
     548                                'first'  => true,
     549                                'second' => true,
     550                        ),
     551                        'registered' => array(
     552                                'first'  => true,
     553                                'second' => true,
     554                        ),
     555                );
     556
     557                // Act
     558                $response = remove_imgedit_group( 'third' );
     559
     560                // Verify
     561                $this->assertEquals( true, is_wp_error( $response ) );
     562                $this->assertEquals( 2, count( $_imgedit_groups['loaded'] ) );
     563                $this->assertEquals( 2, count( $_imgedit_groups['registered'] ) );
     564                $this->assertTrue( $_imgedit_groups['loaded']['first'] );
     565                $this->assertTrue( $_imgedit_groups['registered']['first'] );
     566                $this->assertTrue( $_imgedit_groups['loaded']['second'] );
     567                $this->assertTrue( $_imgedit_groups['registered']['second'] );
     568        }
     569
     570        /**
     571         * @ticket 30062
     572         */
     573        public function test_removed_imgedit_group_action() {
     574                // Setup
     575                global $_imgedit_groups;
     576                $_imgedit_groups = array(
     577                        'loaded'     => array(
     578                                'first' => true,
     579                        ),
     580                        'registered' => array(
     581                                'first' => true,
     582                        ),
     583                );
     584
     585                $action_invoked = false;
     586
     587                add_action( 'removed_imgedit_group', function ( $name ) use ( &$action_invoked ) {
     588                        $action_invoked = $name;
     589                } );
     590
     591                // Act
     592                $response = remove_imgedit_group( 'first' );
     593
     594                // Verify
     595                $this->assertEquals( true, $response );
     596                $this->assertEquals( 'first', $action_invoked );
     597        }
    338598}