JezK
Edit File: class-foogallery-crop-position.php
<?php if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Class to provide a way to override the default attachment crop position. Handy if you want to override the default of center,center * Date: 19/02/2018 * * @since 1.4.18 */ if ( ! class_exists( 'FooGallery_Crop_Position' ) ) { class FooGallery_Crop_Position { const CROP_POSITION_META_KEY = 'foogallery_crop_pos'; const CROP_POSITION_META_KEY_LEGACY = 'wpthumb_crop_pos'; const CROP_POSITION_DEFAULT = 'center,center'; function __construct() { if ( is_admin() ) { add_filter( 'foogallery_admin_settings_override', array( $this, 'add_default_crop_position_setting' ) ); add_action( 'foogallery_admin_settings_custom_type_render_setting', array( $this, 'render_crop_position_setting' ) ); add_filter( 'attachment_fields_to_edit', array( $this, 'media_form_crop_position' ), 10, 2 ); add_filter( 'attachment_fields_to_save', array( $this, 'media_form_crop_position_save' ), 10, 2 ); } add_filter( 'foogallery_thumbnail_resize_args_final', array( $this, 'add_crop_position_arguments' ), 10, 3 ); } /** * Append crop position arguments if they are saved * * @param $args * @param $original_image_src * @param $thumbnail_object * * @return mixed */ function add_crop_position_arguments( $args, $original_image_src, $thumbnail_object ) { if ( !foogallery_thumb_active_engine()->has_local_cache() ) { return $args; } if ( isset( $thumbnail_object ) && $thumbnail_object->ID > 0 ) { $crop_from_position = get_post_meta( $thumbnail_object->ID, self::CROP_POSITION_META_KEY, true ); if ( !empty( $crop_from_position ) ) { $args['crop_from_position'] = $crop_from_position; } } return $args; } /** * Adds the crop position setting to the settings array * * @param $settings * * @return mixed */ function add_default_crop_position_setting( $settings ) { if ( !foogallery_thumb_active_engine()->has_local_cache() ) { return $settings; } $just_settings = $settings['settings']; $position = 0; //find the position of the 'thumb_jpeg_quality' setting foreach( $just_settings as $setting ) { $position++; if ( 'thumb_jpeg_quality' === $setting['id'] ) { break; } } $new_settings[] = array( 'id' => 'default_crop_position', 'title' => __( 'Default Crop Position', 'foogallery' ), 'desc' => __( 'The default crop position when resizing thumbnails.', 'foogallery' ), 'type' => 'crop', 'default' => self::CROP_POSITION_DEFAULT, 'tab' => 'thumb' ); array_splice( $just_settings, $position, 0, $new_settings ); $settings['settings'] = $just_settings; return $settings; } /** * Render the custom crop position to the settings page * * @param array $args */ function render_crop_position_setting( $args ) { if ( 'crop' === $args['type'] ) { $current_position = foogallery_get_setting( $args['id'], $args['default'] ); ?> <style>.foogallery_crop_pos input { margin: 5px !important; width: auto; }</style> <div class="foogallery_crop_pos"> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="left,top" title="Left, Top" <?php checked( 'left,top', $current_position ) ?>/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="center,top" title="Center, Top" <?php checked( 'center,top', $current_position ) ?>/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="right,top" title="Right, Top" <?php checked( 'right,top', $current_position ) ?>/><br/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="left,center" title="Left, Center" <?php checked( 'left,center', $current_position ) ?>/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="center,center" title="Center, Center" <?php checked( 'center,center', $current_position ) ?>/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="right,center" title="Right, Center" <?php checked( 'right,center', $current_position ) ?>/><br/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="left,bottom" title="Left, Bottom" <?php checked( 'left,bottom', $current_position ) ?>/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="center,bottom" title="Center, Bottom" <?php checked( 'center,bottom', $current_position ) ?>/> <input type="radio" name="foogallery[<?php echo esc_attr( $args['id'] ); ?>]" value="right,bottom" title="Right, Bottom" <?php checked( 'right,bottom', $current_position ) ?>/> </div> <?php } } /** * Return the default crop position * * @param $default * * @return mixed */ function default_crop_position() { $crop_position = foogallery_get_setting( 'default_crop_position', self::CROP_POSITION_DEFAULT ); return $crop_position; } /** * Adds a back end for selecting the crop position of images. * * @access public * * @param array $fields * @param array $post * @return $post */ function media_form_crop_position( $fields, $post ) { if ( !foogallery_thumb_active_engine()->has_local_cache() ) { return $fields; } // Ensure $post is not null before proceeding if ( ! is_a( $post, 'WP_Post' ) || ! wp_attachment_is_image( $post->ID ) ) { return $fields; } $crop_position = $this->get_crop_position_from_attachment( $post->ID ); $html = '<style>#foogallery_crop_pos { padding: 5px; } #foogallery_crop_pos input { margin: 5px; width: auto; }</style>'; $html .= '<div id="foogallery_crop_pos">'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="left,top" title="Left, Top" ' . checked( 'left,top', $crop_position, false ) . '/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="center,top" title="Center, Top" ' . checked( 'center,top', $crop_position, false ) . '/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="right,top" title="Right, Top" ' . checked( 'right,top', $crop_position, false ) . '/><br/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="left,center" title="Left, Center" ' . checked( 'left,center', $crop_position, false ) . '/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="center,center" title="Center, Center"' . checked( 'center,center', $crop_position, false ) . '/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="right,center" title="Right, Center" ' . checked( 'right,center', $crop_position, false ) . '/><br/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="left,bottom" title="Left, Bottom" ' . checked( 'left,bottom', $crop_position, false ) . '/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="center,bottom" title="Center, Bottom" ' . checked( 'center,bottom', $crop_position, false ) . '/>'; $html .= '<input type="radio" name="attachments[' . $post->ID . '][foogallery_crop_pos]" value="right,bottom" title="Right, Bottom" ' . checked( 'right,bottom', $crop_position, false ) . '/>'; $html .= '</div>'; $fields['crop-from-position'] = array( 'label' => __( 'Crop Position', 'foogallery' ), 'input' => 'html', 'html' => $html ); return $fields; } /** * Gets the crop position from the attachment post meta, and defaults to what is set in settings * * @param $attachment_id * * @return mixed|string */ private function get_crop_position_from_attachment( $attachment_id ) { //first try to get the legacy value using the old key $crop_postion = get_post_meta( $attachment_id, self::CROP_POSITION_META_KEY_LEGACY, true ); //check if we have a legacy value saved, so migrate to the new if ( $crop_postion ) { //remove the old post meta delete_post_meta( $attachment_id, self::CROP_POSITION_META_KEY_LEGACY ); //add new post meta with the correct key update_post_meta( $attachment_id, self::CROP_POSITION_META_KEY, $crop_postion ); } else { $current_position = get_post_meta( $attachment_id, self::CROP_POSITION_META_KEY, true ); } if ( !$current_position ) { $current_position = $this->default_crop_position(); } return $current_position; } /** * wpthumb_media_form_crop_position_save function. * * Saves crop position in post meta. * * @access public * * @param array $post * @param array $attachment * @return $post */ function media_form_crop_position_save( $post, $attachment ) { if ( !foogallery_thumb_active_engine()->has_local_cache() ) { return $post; } if ( ! isset( $attachment['foogallery_crop_pos'] ) ) { return $post; } if ( $attachment['foogallery_crop_pos'] == $this->default_crop_position() ) { delete_post_meta( $post['ID'], self::CROP_POSITION_META_KEY ); } else { update_post_meta( $post['ID'], self::CROP_POSITION_META_KEY, $attachment['foogallery_crop_pos'] ); } return $post; } } }