WordPress.org

Make WordPress Core

Ticket #30062: 30062.1.2.diff

File 30062.1.2.diff, 29.7 KB (added by ericmann, 5 years ago)

Updated diff with erroneous reference to a global variable.

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

     
    66 * @subpackage Administration
    77 */
    88
     9/**
     10 * Print the WordPress Image Editor
     11 *
     12 * @param int  $post_id ID of image being edited
     13 * @param bool $msg     Admin message
     14 */
    915function wp_image_editor($post_id, $msg = false) {
    1016        $nonce = wp_create_nonce("image_editor-$post_id");
    1117        $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']);
    1418        $note = '';
    1519
    1620        if ( isset( $meta['width'], $meta['height'] ) )
     
    2024
    2125        $sizer = $big > 400 ? 400 / $big : 1;
    2226
    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'] );
     27        // Add the default image groups
     28        add_imgedit_group( 'scale-image' );
     29        add_imgedit_group( 'restore-image' );
     30        add_imgedit_group( 'crop-image' );
     31        add_imgedit_group( 'applyto' );
    2732
    2833        if ( $msg ) {
    2934                if ( isset($msg->error) )
     
    3742        <div id="imgedit-panel-<?php echo $post_id; ?>">
    3843
    3944        <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>
     45                <?php $imgedit_groups = get_imgedit_groups(); ?>
     46                <?php foreach ( $imgedit_groups as $imgedit_group_name => $imgedit_group_view ) : ?>
     47                <div class="imgedit-group imgedit-<?php echo esc_attr( sanitize_title( $imgedit_group_name ) ); ?>">
     48                        <?php if ( function_exists( $imgedit_group_view ) ) : ?>
     49                                <?php $imgedit_group_view( $post_id, $nonce, $meta ); ?>
     50                        <?php endif; ?>
    4551                </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>
     52                <?php endforeach; ?>
    5453        </div>
    55         </div>
    5654
    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 
    14855        <div class="imgedit-panel-content">
    14956                <?php echo $note; ?>
    15057                <div class="imgedit-menu">
     
    826733        $return->msg = esc_js( __('Image saved') );
    827734        return $return;
    828735}
     736
     737/**
     738 * Register default image groups so they're available for `wp_image_editor()`
     739 */
     740function add_default_imgedit_groups(){
     741        register_imgedit_group( 'scale-image',   'view_image_edit_group_scale_image'   );
     742        register_imgedit_group( 'restore-image', 'view_image_edit_group_restore_image' );
     743        register_imgedit_group( 'crop-image',    'view_image_edit_group_crop_image'    );
     744        register_imgedit_group( 'applyto',       'view_image_edit_group_apply_to'      );
     745}
     746add_action( 'init', 'add_default_imgedit_groups' );
     747
     748/**
     749 * Print out the Scale Image edit group.
     750 *
     751 * @param int    $post_id
     752 * @param string $nonce
     753 * @param array  $meta
     754 */
     755function view_image_edit_group_scale_image( $post_id, $nonce, $meta ){
     756        ?>
     757        <div class="imgedit-group-top">
     758                <h3><?php _e( 'Scale Image' ); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
     759                <div class="imgedit-help">
     760                        <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>
     761                </div>
     762                <?php if ( isset( $meta['width'], $meta['height'] ) ): ?>
     763                        <p><?php printf( __('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height'] ); ?></p>
     764                <?php endif ?>
     765                <div class="imgedit-submit">
     766                        <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; ?>" />
     767                        <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo esc_attr( $post_id ); ?>">!</span></span>
     768                        <input type="button" onclick="imageEdit.action(<?php echo esc_js( "$post_id, '$nonce'" ); ?>, 'scale')" class="button button-primary" value="<?php esc_attr_e( 'Scale' ); ?>" />
     769                </div>
     770        </div>
     771<?php
     772}
     773
     774/**
     775 * Print the Restore Image edit group
     776 *
     777 * @param int    $post_id
     778 * @param string $nonce
     779 * @param array  $meta
     780 */
     781function view_image_edit_group_restore_image( $post_id, $nonce, $meta ){
     782        $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
     783        $can_restore = false;
     784
     785        if ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) ) {
     786                $can_restore = $backup_sizes['full-orig']['file'] != basename( $meta['file'] );
     787        }
     788
     789        if ( $can_restore ) { ?>
     790                <div class="imgedit-group-top">
     791                        <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>
     792                        <div class="imgedit-help">
     793                                <p><?php _e('Discard any changes and restore the original image.');
     794
     795                                        if ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) {
     796                                                echo ' '.__('Previously edited copies of the image will not be deleted.');
     797                                        }
     798
     799                                        ?></p>
     800                                <div class="imgedit-submit">
     801                                        <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; ?> />
     802                                </div>
     803                        </div>
     804                </div>
     805        <?php } ?>
     806<?php
     807}
     808
     809/**
     810 * Print the Crop Image edit group
     811 *
     812 * @param int    $post_id
     813 * @param string $nonce
     814 * @param array  $meta
     815 */
     816function view_image_edit_group_crop_image( $post_id, $nonce, $meta ){
     817        ?>
     818        <div class="imgedit-group-top">
     819                <h3><?php _e('Image Crop'); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
     820
     821                <div class="imgedit-help">
     822                        <p><?php _e('To crop the image, click on it and drag to make your selection.'); ?></p>
     823
     824                        <p><strong><?php _e('Crop Aspect Ratio'); ?></strong><br />
     825                                <?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>
     826
     827                        <p><strong><?php _e('Crop Selection'); ?></strong><br />
     828                                <?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>
     829                </div>
     830        </div>
     831
     832        <p>
     833                <?php _e('Aspect ratio:'); ?>
     834                <span  class="nowrap">
     835                <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;" />
     836                :
     837                <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;" />
     838                </span>
     839        </p>
     840
     841        <p id="imgedit-crop-sel-<?php echo $post_id; ?>">
     842                <?php _e('Selection:'); ?>
     843                <span  class="nowrap">
     844                <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;" />
     845                        &times;
     846                        <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;" />
     847                </span>
     848        </p>
     849<?php
     850}
     851
     852/**
     853 * Print the Apply To edit group.
     854 *
     855 * @param int    $post_id
     856 * @param string $nonce
     857 * @param array  $meta
     858 */
     859function view_image_edit_group_apply_to( $post_id, $nonce, $meta ){
     860        $thumb = image_get_intermediate_size($post_id, 'thumbnail');
     861        $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
     862        if ( $thumb && $sub_sizes ) {
     863                $thumb_img = wp_constrain_dimensions( $thumb['width'], $thumb['height'], 160, 120 );
     864                ?>
     865                <div class="imgedit-group-top">
     866                        <h3><?php _e('Thumbnail Settings'); ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
     867                        <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>
     868                </div>
     869
     870                <p>
     871                        <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" />
     872                        <br /><?php _e('Current thumbnail'); ?>
     873                </p>
     874
     875                <p id="imgedit-save-target-<?php echo esc_attr( $post_id ); ?>">
     876                        <strong><?php _e('Apply changes to:'); ?></strong><br />
     877
     878                        <label class="imgedit-label">
     879                                <input type="radio" name="imgedit-target-<?php echo esc_attr( $post_id ); ?>" value="all" checked="checked" />
     880                                <?php _e('All image sizes'); ?></label>
     881
     882                        <label class="imgedit-label">
     883                                <input type="radio" name="imgedit-target-<?php echo esc_attr( $post_id ); ?>" value="thumbnail" />
     884                                <?php _e('Thumbnail'); ?></label>
     885
     886                        <label class="imgedit-label">
     887                                <input type="radio" name="imgedit-target-<?php echo esc_attr( $post_id ); ?>" value="nothumb" />
     888                                <?php _e('All sizes except thumbnail'); ?></label>
     889                </p>
     890        <?php
     891        }
     892}
     893
     894/**
     895 * Register a new image edit group for inclusion in the WP image editor.
     896 *
     897 * @since 4.1.0
     898 *
     899 * @global array    $_imgedit_groups
     900 *
     901 * @param  string   $name Name of the group to be registered
     902 * @param  callable $callback
     903 *
     904 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     905 */
     906function register_imgedit_group( $name, $callback ) {
     907        global $_imgedit_groups;
     908
     909        // Make sure the array is set up properly first
     910        if ( !isset( $_imgedit_groups['registered'] ) ) {
     911                $_imgedit_groups['registered'] = array();
     912        }
     913
     914        // If the edit group is already loaded, return an error
     915        if ( isset( $_imgedit_groups['registered'][$name] ) ) {
     916                return new WP_Error( 'duplicate_registered_imgedit_group', __( 'Specified imgedit group is already registered.' ) );
     917        }
     918
     919        // Add the edit group to the registered array
     920        if ( !isset ( $_imgedit_groups['registered'][$name] ) ) {
     921                $_imgedit_groups['registered'][$name] = $callback;
     922        }
     923
     924        /**
     925         * Alert listeners that we've added an imgedit group.
     926         *
     927         * @since 4.1.0
     928         *
     929         * @param string $name Image edit group name
     930         */
     931        do_action( 'registered_imgedit_group', $name );
     932
     933        return true;
     934}
     935
     936/**
     937 * Unregister a new image edit group for inclusion in the WP image editor.
     938 *
     939 * @since 4.1.0
     940 *
     941 * @global array  $_imgedit_groups
     942 *
     943 * @param  string $name Name of the group to be registered
     944 *
     945 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     946 */
     947function unregister_imgedit_group( $name ) {
     948        global $_imgedit_groups;
     949
     950        // if the edit group doesn't exist, return an error
     951        if ( !isset ( $_imgedit_groups['registered'][$name] ) ) {
     952                return new WP_Error( 'invalid_imgedit_group', __( 'Invalid imgedit group.' ) );
     953        }
     954
     955        // if the edit group is currently loaded, return an error
     956        if ( isset ( $_imgedit_groups['loaded'][$name] ) ) {
     957                return new WP_Error( 'loaded_imgedit_group', __( 'Cannot unregister a currently loaded imgedit group.' ) );
     958        }
     959
     960        // remove the edit group from the array
     961        if ( isset ( $_imgedit_groups['registered'][$name] ) ) {
     962                unset ( $_imgedit_groups['registered'][$name] );
     963        }
     964
     965        /**
     966         * Alert listeners that we've unregistered an imgedit group.
     967         *
     968         * @since 4.1.0
     969         *
     970         * @param string $name Image edit group name
     971         */
     972        do_action( 'unregistered_imgedit_group', $name );
     973
     974        return true;
     975}
     976
     977/**
     978 * Get a list of loaded image edit groups for the editor modal.
     979 *
     980 * @since 4.1.0
     981 *
     982 * @global array $_imgedit_groups
     983 *
     984 * @return array
     985 */
     986function get_imgedit_groups() {
     987        global $_imgedit_groups;
     988
     989        // Make sure the array is set up properly first
     990        if ( !isset( $_imgedit_groups['loaded'] ) ) {
     991                $_imgedit_groups['loaded'] = array();
     992        }
     993
     994        /**
     995         * Filter the loaded image edit groups to allow for dynamic manipulation of what's loaded and the specific order.
     996         *
     997         * @since 4.1.0
     998         *
     999         * @param array $groups Loaded image edit groups
     1000         */
     1001
     1002        return apply_filters( 'imgedit_groups', $_imgedit_groups['loaded'] );
     1003}
     1004
     1005/**
     1006 * Remove an image edit group from the loading array. The group will still be registered, but will not render to the UI.
     1007 *
     1008 * @since 4.1.0
     1009 *
     1010 * @global array $_imgedit_groups
     1011 *
     1012 * @param string $name Name of the group to remove
     1013 *
     1014 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     1015 */
     1016function remove_imgedit_group( $name ) {
     1017        global $_imgedit_groups;
     1018
     1019        // Make sure the array is set up properly first
     1020        if ( !isset( $_imgedit_groups['loaded'] ) ) {
     1021                $_imgedit_groups['loaded'] = array();
     1022        }
     1023
     1024        // If the group isn't set to load at all, be sure to trigger an error.
     1025        if ( !isset( $_imgedit_groups['loaded'][$name] ) ) {
     1026                return new WP_Error( 'invalid_imgedit_group', __( 'Invalid imgedit group.' ) );
     1027        }
     1028
     1029        // Unset the group
     1030        unset( $_imgedit_groups['loaded'][$name] );
     1031
     1032        /**
     1033         * Inform listeners that the specified image edit group has been removed from the loading array.
     1034         *
     1035         * @since 4.1.0
     1036         *
     1037         * @param string $name Image edit group name.
     1038         */
     1039        do_action( 'removed_imgedit_group', $name );
     1040
     1041        return true;
     1042}
     1043
     1044/**
     1045 * Add an image edit group for inclusion in the WP Editor UI.
     1046 *
     1047 * @since 4.1.0
     1048 *
     1049 * @global array   $_imgedit_groups
     1050 *
     1051 * @param string   $name     Name of the group to add.
     1052 * @param callable $callback Callback function to render the markup for the edit group. Optional only if the group was previously registered.
     1053 *
     1054 * @return bool|WP_Error Returns true on success, a detailed error if there's some kind of failure.
     1055 */
     1056function add_imgedit_group( $name, $callback = null ) {
     1057        global $_imgedit_groups;
     1058
     1059        // Make sure the array is set up properly first
     1060        if ( !isset( $_imgedit_groups['loaded'] ) ) {
     1061                $_imgedit_groups['loaded'] = array();
     1062        }
     1063
     1064        // Make sure the array is set up properly first
     1065        if ( !isset( $_imgedit_groups['registered'] ) ) {
     1066                $_imgedit_groups['registered'] = array();
     1067        }
     1068
     1069        // If the callback is specified, register the group first
     1070        if ( null !== $callback ) {
     1071                $registered = register_imgedit_group( $name, $callback );
     1072
     1073                if ( is_wp_error( $registered ) ) {
     1074                        return $registered;
     1075                }
     1076        }
     1077
     1078        // If the edit group isn't registered, return an error
     1079        if ( !isset( $_imgedit_groups['registered'][$name] ) ) {
     1080                return new WP_Error( 'invalid_imgedit_group', __( 'Invalid imgedit group.' ) );
     1081        }
     1082
     1083        // If the edit group is already loaded, return an error
     1084        if ( isset( $_imgedit_groups['loaded'][$name] ) ) {
     1085                return new WP_Error( 'duplicate_imgedit_group', __( 'Specified imgedit group already exists.' ) );
     1086        }
     1087
     1088        // Load the image edit group into the loaded array
     1089        $_imgedit_groups['loaded'][$name] = $_imgedit_groups['registered'][$name];
     1090
     1091        /**
     1092         * Inform listeners that a specific edit group has been added to the loading array.
     1093         *
     1094         * @since 4.1.0
     1095         *
     1096         * @param string $name Name of the new edit group
     1097         */
     1098        do_action( 'loaded_imgedit_group', $name );
     1099
     1100        return true;
     1101}
  • 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        }
     598
     599        /**
     600         * @ticket 30062
     601         */
     602        public function test_register_imgedit_group() {
     603                // Setup
     604                global $_imgedit_groups;
     605                $_imgedit_groups = array();
     606
     607                // Act
     608                $response = register_imgedit_group( 'first', function() {} );
     609
     610                // Verify
     611                $this->assertEquals( true, $response );
     612
     613                $groups = $_imgedit_groups['registered'];
     614                $this->assertNotEmpty( $groups );
     615                $this->assertArrayHasKey( 'first', $groups );
     616        }
     617
     618        /**
     619         * @ticket 30062
     620         */
     621        public function test_duplicate_loaded_register_imgedit_group() {
     622                // Setup
     623                global $_imgedit_groups;
     624                $_imgedit_groups = array(
     625                        'registered' => array(
     626                                'first'  => true,
     627                        ),
     628                );
     629
     630                // Act
     631                $response = register_imgedit_group( 'first', false );
     632
     633                // Verify
     634                $this->assertEquals( true, is_wp_error( $response ) );
     635
     636                $groups = $_imgedit_groups['registered'];
     637                $this->assertNotEmpty( $groups );
     638                $this->assertArrayHasKey( 'first', $groups );
     639                $this->assertEquals( 1, count( $groups ) );
     640
     641                // Previously registered as true, attempted to re-register as false, make sure first value sticks.
     642                $this->assertTrue( $groups['first'] );
     643        }
     644
     645        /**
     646         * @ticket 30062
     647         */
     648        public function test_unregister_imgedit_group() {
     649                // Setup
     650                global $_imgedit_groups;
     651                $_imgedit_groups = array(
     652                        'registered' => array(
     653                                'first'  => true,
     654                        ),
     655                );
     656
     657                // Act
     658                $response = unregister_imgedit_group( 'first' );
     659
     660                // Verify
     661                $this->assertEquals( true, $response );
     662
     663                $groups = $_imgedit_groups['registered'];
     664                $this->assertArrayNotHasKey( 'first', $groups );
     665        }
     666
     667        /**
     668         * @ticket 30062
     669         */
     670        public function test_duplicate_unegister_imgedit_group() {
     671                // Setup
     672                global $_imgedit_groups;
     673                $_imgedit_groups = array(
     674                        'registered' => array(
     675                                'first'  => true,
     676                        ),
     677                );
     678
     679                // Act
     680                $response = unregister_imgedit_group( 'first' );
     681
     682                // Verify
     683                $this->assertEquals( true, $response );
     684
     685                $groups = $_imgedit_groups['registered'];
     686                $this->assertArrayNotHasKey( 'first', $groups );
     687        }
    338688}