X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/8f374b7233bc2815ccc387e448d208c5434eb961..e0feb3b2e5b436a06bbb04fbc838d1cd6ec95399:/wp-admin/custom-header.php?ds=sidebyside diff --git a/wp-admin/custom-header.php b/wp-admin/custom-header.php index fc9d4f12..e61feb78 100644 --- a/wp-admin/custom-header.php +++ b/wp-admin/custom-header.php @@ -20,18 +20,16 @@ class Custom_Image_Header { * * @var callback * @since 2.1.0 - * @access private */ - var $admin_header_callback; + public $admin_header_callback; /** * Callback for header div. * * @var callback * @since 3.0.0 - * @access private */ - var $admin_image_div_callback; + public $admin_image_div_callback; /** * Holds default headers. @@ -40,25 +38,12 @@ class Custom_Image_Header { * @since 3.0.0 * @access private */ - var $default_headers = array(); - - /** - * Holds custom headers uploaded by the user - * - * @var array - * @since 3.2.0 - * @access private - */ - var $uploaded_headers = array(); + public $default_headers = array(); /** - * Holds the page menu hook. - * - * @var string - * @since 3.0.0 - * @access private + * @var bool */ - var $page = ''; + private $updated; /** * Constructor - Register administration header callback. @@ -66,13 +51,17 @@ class Custom_Image_Header { * @since 2.1.0 * @param callback $admin_header_callback * @param callback $admin_image_div_callback Optional custom image div output callback. - * @return Custom_Image_Header */ - function __construct($admin_header_callback, $admin_image_div_callback = '') { + public function __construct($admin_header_callback, $admin_image_div_callback = '') { $this->admin_header_callback = $admin_header_callback; $this->admin_image_div_callback = $admin_image_div_callback; add_action( 'admin_menu', array( $this, 'init' ) ); + + add_action( 'customize_save_after', array( $this, 'customize_set_last_used' ) ); + add_action( 'wp_ajax_custom-header-crop', array( $this, 'ajax_header_crop' ) ); + add_action( 'wp_ajax_custom-header-add', array( $this, 'ajax_header_add' ) ); + add_action( 'wp_ajax_custom-header-remove', array( $this, 'ajax_header_remove' ) ); } /** @@ -80,24 +69,19 @@ class Custom_Image_Header { * * @since 2.1.0 */ - function init() { - if ( ! current_user_can('edit_theme_options') ) + public function init() { + $page = add_theme_page( __( 'Header' ), __( 'Header' ), 'edit_theme_options', 'custom-header', array( $this, 'admin_page' ) ); + if ( ! $page ) { return; + } - $this->page = $page = add_theme_page(__('Header'), __('Header'), 'edit_theme_options', 'custom-header', array(&$this, 'admin_page')); - - add_action("admin_print_scripts-$page", array(&$this, 'js_includes')); - add_action("admin_print_styles-$page", array(&$this, 'css_includes')); - add_action("admin_head-$page", array(&$this, 'help') ); - add_action("admin_head-$page", array(&$this, 'take_action'), 50); - add_action("admin_head-$page", array(&$this, 'js'), 50); - if ( $this->admin_header_callback ) - add_action("admin_head-$page", $this->admin_header_callback, 51); - - if ( isset( $_REQUEST['context'] ) && $_REQUEST['context'] == 'custom-header' ) { - add_filter( 'attachment_fields_to_edit', array( $this, 'attachment_fields_to_edit' ), 10, 2 ); - add_filter( 'media_upload_tabs', array( $this, 'filter_upload_tabs' ) ); - add_filter( 'media_upload_mime_type_links', '__return_empty_array' ); + add_action( "admin_print_scripts-$page", array( $this, 'js_includes' ) ); + add_action( "admin_print_styles-$page", array( $this, 'css_includes' ) ); + add_action( "admin_head-$page", array( $this, 'help' ) ); + add_action( "admin_head-$page", array( $this, 'take_action' ), 50 ); + add_action( "admin_head-$page", array( $this, 'js' ), 50 ); + if ( $this->admin_header_callback ) { + add_action( "admin_head-$page", $this->admin_header_callback, 51 ); } } @@ -106,7 +90,7 @@ class Custom_Image_Header { * * @since 3.0.0 */ - function help() { + public function help() { get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __('Overview'), @@ -130,14 +114,14 @@ class Custom_Image_Header { 'title' => __('Header Text'), 'content' => '

' . sprintf( __( 'For most themes, the header text is your Site Title and Tagline, as defined in the General Settings section.' ), admin_url( 'options-general.php' ) ) . '

' . - '

' . __( 'In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by typing in a legitimate HTML hex value (eg: “#ff0000” for red) or by clicking “Select a Color” and dialing in a color using the color picker.') . '

' . - '

' . __( 'Don’t forget to Save Changes when you’re done!') . '

' + '

' . __( 'In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. “#ff0000” for red, or by choosing a color using the color picker.' ) . '

' . + '

' . __( 'Don’t forget to click “Save Changes” when you’re done!') . '

' ) ); get_current_screen()->set_help_sidebar( '

' . __( 'For more information:' ) . '

' . - '

' . __( 'Documentation on Custom Header' ) . '

' . - '

' . __( 'Support Forums' ) . '

' + '

' . __( 'Documentation on Custom Header' ) . '

' . + '

' . __( 'Support Forums' ) . '

' ); } @@ -148,7 +132,7 @@ class Custom_Image_Header { * * @return int Current step */ - function step() { + public function step() { if ( ! isset( $_GET['step'] ) ) return 1; @@ -167,15 +151,14 @@ class Custom_Image_Header { * * @since 2.1.0 */ - function js_includes() { + public function js_includes() { $step = $this->step(); if ( ( 1 == $step || 3 == $step ) ) { - add_thickbox(); - wp_enqueue_script( 'media-upload' ); + wp_enqueue_media(); wp_enqueue_script( 'custom-header' ); if ( current_theme_supports( 'custom-header', 'header-text' ) ) - wp_enqueue_script('farbtastic'); + wp_enqueue_script( 'wp-color-picker' ); } elseif ( 2 == $step ) { wp_enqueue_script('imgareaselect'); } @@ -184,13 +167,13 @@ class Custom_Image_Header { /** * Set up the enqueue for the CSS files * - * @since 2.7 + * @since 2.7.0 */ - function css_includes() { + public function css_includes() { $step = $this->step(); if ( ( 1 == $step || 3 == $step ) && current_theme_supports( 'custom-header', 'header-text' ) ) - wp_enqueue_style('farbtastic'); + wp_enqueue_style( 'wp-color-picker' ); elseif ( 2 == $step ) wp_enqueue_style('imgareaselect'); } @@ -200,7 +183,7 @@ class Custom_Image_Header { * * @since 2.6.0 */ - function take_action() { + public function take_action() { if ( ! current_user_can('edit_theme_options') ) return; @@ -215,12 +198,6 @@ class Custom_Image_Header { return; } - if ( isset( $_POST['resettext'] ) ) { - check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); - remove_theme_mod('header_textcolor'); - return; - } - if ( isset( $_POST['removeheader'] ) ) { check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); $this->remove_header_image(); @@ -251,15 +228,18 @@ class Custom_Image_Header { * Process the default headers * * @since 3.0.0 + * + * @global array $_wp_default_headers */ - function process_default_headers() { + public function process_default_headers() { global $_wp_default_headers; - if ( !empty($this->headers) ) + if ( !isset($_wp_default_headers) ) return; - if ( !isset($_wp_default_headers) ) + if ( ! empty( $this->default_headers ) ) { return; + } $this->default_headers = $_wp_default_headers; $template_directory_uri = get_template_directory_uri(); @@ -268,7 +248,6 @@ class Custom_Image_Header { $this->default_headers[$header]['url'] = sprintf( $this->default_headers[$header]['url'], $template_directory_uri, $stylesheet_directory_uri ); $this->default_headers[$header]['thumbnail_url'] = sprintf( $this->default_headers[$header]['thumbnail_url'], $template_directory_uri, $stylesheet_directory_uri ); } - } /** @@ -279,7 +258,7 @@ class Custom_Image_Header { * * @since 3.0.0 */ - function show_header_selector( $type = 'default' ) { + public function show_header_selector( $type = 'default' ) { if ( 'default' == $type ) { $headers = $this->default_headers; } else { @@ -290,7 +269,7 @@ class Custom_Image_Header { if ( 1 < count( $headers ) ) { echo '
'; echo ''; echo '
'; } @@ -300,23 +279,24 @@ class Custom_Image_Header { $header_thumbnail = $header['thumbnail_url']; $header_url = $header['url']; $header_desc = empty( $header['description'] ) ? '' : $header['description']; + $header_alt_text = empty( $header['alt_text'] ) ? $header_desc : $header['alt_text']; echo '
'; echo ''; + echo '' . esc_attr( $header_alt_text ) .''; echo '
'; } echo '
'; } /** - * Execute Javascript depending on step. + * Execute JavaScript depending on step. * * @since 2.1.0 */ - function js() { + public function js() { $step = $this->step(); if ( ( 1 == $step || 3 == $step ) && current_theme_supports( 'custom-header', 'header-text' ) ) $this->js_1(); @@ -325,23 +305,28 @@ class Custom_Image_Header { } /** - * Display Javascript based on Step 1 and 3. + * Display JavaScript based on Step 1 and 3. * * @since 2.6.0 */ - function js_1() { ?> + public function js_1() { + $default_color = ''; + if ( current_theme_supports( 'custom-header', 'default-text-color' ) ) { + $default_color = get_theme_support( 'custom-header', 'default-text-color' ); + if ( $default_color && false === strpos( $default_color, '#' ) ) { + $default_color = '#' . $default_color; + } + } + ?> + public function js_2() { ?> process_default_headers(); ?>
- -

+

+ + +
+

+ Customizer.' ), + admin_url( 'customize.php?autofocus[control]=header_image' ) + ); + ?> +

+
+ updated ) ) { ?>
@@ -504,31 +473,48 @@ var farbtastic; - + + - - + + + + @@ -570,11 +561,12 @@ var farbtastic;
- admin_image_div_callback ) { - call_user_func( $this->admin_image_div_callback ); + admin_image_div_callback ) { + call_user_func( $this->admin_image_div_callback ); } else { + $custom_header = get_custom_header(); + $header_image = get_header_image(); + + if ( $header_image ) { + $header_image_style = 'background-image:url(' . esc_url( $header_image ) . ');'; + } else { + $header_image_style = ''; + } + + if ( $custom_header->width ) + $header_image_style .= 'max-width:' . $custom_header->width . 'px;'; + if ( $custom_header->height ) + $header_image_style .= 'height:' . $custom_header->height . 'px;'; ?> -
-


+


%1$d × %2$d pixels will be used as-is.' ) . '
', get_theme_support( 'custom-header', 'width' ), get_theme_support( 'custom-header', 'height' ) ); @@ -546,7 +532,7 @@ var farbtastic; printf( __( 'Suggested height is %1$d pixels.' ) . ' ', get_theme_support( 'custom-header', 'height' ) ); } ?>

-
+


@@ -555,13 +541,18 @@ var farbtastic;

'custom-header', 'TB_iframe' => 1 ), $image_library_url ); + $modal_update_href = esc_url( add_query_arg( array( + 'page' => 'custom-header', + 'step' => 2, + '_wpnonce-custom-header-upload' => wp_create_nonce('custom-header-upload'), + ), admin_url('themes.php') ) ); ?>


- +

-
+ + - +default_headers ) ) : ?> - + - + +' ); - $form_fields['context'] = array( 'input' => 'hidden', 'value' => 'custom-header' ); - + public function attachment_fields_to_edit( $form_fields ) { return $form_fields; } /** - * Leave only "Media Library" tab in the uploader window. + * Unused since 3.5.0. * * @since 3.4.0 + * + * @param array $tabs + * @return array $tabs */ - function filter_upload_tabs() { - return array( 'library' => __('Media Library') ); + public function filter_upload_tabs( $tabs ) { + return $tabs; } /** @@ -969,6 +956,8 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * Or an array of arguments: attachment_id, url, width, height. All are required. * * @since 3.4.0 + * + * @param array|object|string $choice */ final public function set_header_image( $choice ) { if ( is_array( $choice ) || is_object( $choice ) ) { @@ -1020,7 +1009,7 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * @since 3.4.0 */ final public function remove_header_image() { - return $this->set_header_image( 'remove-header' ); + $this->set_header_image( 'remove-header' ); } /** @@ -1034,11 +1023,13 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> $this->process_default_headers(); $default = get_theme_support( 'custom-header', 'default-image' ); - if ( ! $default ) - return $this->remove_header_image(); - + if ( ! $default ) { + $this->remove_header_image(); + return; + } $default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ); + $default_data = array(); foreach ( $this->default_headers as $header => $details ) { if ( $details['url'] == $default ) { $default_data = $details; @@ -1049,4 +1040,287 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> set_theme_mod( 'header_image', $default ); set_theme_mod( 'header_image_data', (object) $default_data ); } + + /** + * Calculate width and height based on what the currently selected theme supports. + * + * @param array $dimensions + * @return array dst_height and dst_width of header image. + */ + final public function get_header_dimensions( $dimensions ) { + $max_width = 0; + $width = absint( $dimensions['width'] ); + $height = absint( $dimensions['height'] ); + $theme_height = get_theme_support( 'custom-header', 'height' ); + $theme_width = get_theme_support( 'custom-header', 'width' ); + $has_flex_width = current_theme_supports( 'custom-header', 'flex-width' ); + $has_flex_height = current_theme_supports( 'custom-header', 'flex-height' ); + $has_max_width = current_theme_supports( 'custom-header', 'max-width' ) ; + $dst = array( 'dst_height' => null, 'dst_width' => null ); + + // For flex, limit size of image displayed to 1500px unless theme says otherwise + if ( $has_flex_width ) { + $max_width = 1500; + } + + if ( $has_max_width ) { + $max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) ); + } + $max_width = max( $max_width, $theme_width ); + + if ( $has_flex_height && ( ! $has_flex_width || $width > $max_width ) ) { + $dst['dst_height'] = absint( $height * ( $max_width / $width ) ); + } + elseif ( $has_flex_height && $has_flex_width ) { + $dst['dst_height'] = $height; + } + else { + $dst['dst_height'] = $theme_height; + } + + if ( $has_flex_width && ( ! $has_flex_height || $width > $max_width ) ) { + $dst['dst_width'] = absint( $width * ( $max_width / $width ) ); + } + elseif ( $has_flex_width && $has_flex_height ) { + $dst['dst_width'] = $width; + } + else { + $dst['dst_width'] = $theme_width; + } + + return $dst; + } + + /** + * Create an attachment 'object'. + * + * @param string $cropped Cropped image URL. + * @param int $parent_attachment_id Attachment ID of parent image. + * + * @return array Attachment object. + */ + final public function create_attachment_object( $cropped, $parent_attachment_id ) { + $parent = get_post( $parent_attachment_id ); + $parent_url = $parent->guid; + $url = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url ); + + $size = @getimagesize( $cropped ); + $image_type = ( $size ) ? $size['mime'] : 'image/jpeg'; + + $object = array( + 'ID' => $parent_attachment_id, + 'post_title' => basename($cropped), + 'post_content' => $url, + 'post_mime_type' => $image_type, + 'guid' => $url, + 'context' => 'custom-header' + ); + + return $object; + } + + /** + * Insert an attachment and its metadata. + * + * @param array $object Attachment object. + * @param string $cropped Cropped image URL. + * + * @return int Attachment ID. + */ + final public function insert_attachment( $object, $cropped ) { + $attachment_id = wp_insert_attachment( $object, $cropped ); + $metadata = wp_generate_attachment_metadata( $attachment_id, $cropped ); + /** + * Filter the header image attachment metadata. + * + * @since 3.9.0 + * + * @see wp_generate_attachment_metadata() + * + * @param array $metadata Attachment metadata. + */ + $metadata = apply_filters( 'wp_header_image_attachment_metadata', $metadata ); + wp_update_attachment_metadata( $attachment_id, $metadata ); + return $attachment_id; + } + + /** + * Gets attachment uploaded by Media Manager, crops it, then saves it as a + * new object. Returns JSON-encoded object details. + */ + public function ajax_header_crop() { + check_ajax_referer( 'image_editor-' . $_POST['id'], 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) { + wp_send_json_error(); + } + + $crop_details = $_POST['cropDetails']; + + $dimensions = $this->get_header_dimensions( array( + 'height' => $crop_details['height'], + 'width' => $crop_details['width'], + ) ); + + $attachment_id = absint( $_POST['id'] ); + + $cropped = wp_crop_image( + $attachment_id, + (int) $crop_details['x1'], + (int) $crop_details['y1'], + (int) $crop_details['width'], + (int) $crop_details['height'], + (int) $dimensions['dst_width'], + (int) $dimensions['dst_height'] + ); + + if ( ! $cropped || is_wp_error( $cropped ) ) { + wp_send_json_error( array( 'message' => __( 'Image could not be processed. Please go back and try again.' ) ) ); + } + + /** This filter is documented in wp-admin/custom-header.php */ + $cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication + + $object = $this->create_attachment_object( $cropped, $attachment_id ); + + unset( $object['ID'] ); + + $new_attachment_id = $this->insert_attachment( $object, $cropped ); + + $object['attachment_id'] = $new_attachment_id; + $object['width'] = $dimensions['dst_width']; + $object['height'] = $dimensions['dst_height']; + + wp_send_json_success( $object ); + } + + /** + * Given an attachment ID for a header image, updates its "last used" + * timestamp to now. + * + * Triggered when the user tries adds a new header image from the + * Media Manager, even if s/he doesn't save that change. + */ + public function ajax_header_add() { + check_ajax_referer( 'header-add', 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + $attachment_id = absint( $_POST['attachment_id'] ); + if ( $attachment_id < 1 ) { + wp_send_json_error(); + } + + $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + update_post_meta( $attachment_id, $key, time() ); + update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() ); + + wp_send_json_success(); + } + + /** + * Given an attachment ID for a header image, unsets it as a user-uploaded + * header image for the current theme. + * + * Triggered when the user clicks the overlay "X" button next to each image + * choice in the Customizer's Header tool. + */ + public function ajax_header_remove() { + check_ajax_referer( 'header-remove', 'nonce' ); + + if ( ! current_user_can( 'edit_theme_options' ) ) { + wp_send_json_error(); + } + + $attachment_id = absint( $_POST['attachment_id'] ); + if ( $attachment_id < 1 ) { + wp_send_json_error(); + } + + $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + delete_post_meta( $attachment_id, $key ); + delete_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() ); + + wp_send_json_success(); + } + + /** + * + * @param WP_Customize_Manager $wp_customize + */ + public function customize_set_last_used( $wp_customize ) { + $data = $wp_customize->get_setting( 'header_image_data' )->post_value(); + + if ( ! isset( $data['attachment_id'] ) ) { + return; + } + + $attachment_id = $data['attachment_id']; + $key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + update_post_meta( $attachment_id, $key, time() ); + } + + /** + * + * @return array + */ + public function get_default_header_images() { + $this->process_default_headers(); + + // Get the default image if there is one. + $default = get_theme_support( 'custom-header', 'default-image' ); + + if ( ! $default ) { // If not, + return $this->default_headers; // easy peasy. + } + + $default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ); + $already_has_default = false; + + foreach ( $this->default_headers as $k => $h ) { + if ( $h['url'] === $default ) { + $already_has_default = true; + break; + } + } + + if ( $already_has_default ) { + return $this->default_headers; + } + + // If the one true image isn't included in the default set, prepend it. + $header_images = array(); + $header_images['default'] = array( + 'url' => $default, + 'thumbnail_url' => $default, + 'description' => 'Default' + ); + + // The rest of the set comes after. + return array_merge( $header_images, $this->default_headers ); + } + + /** + * + * @return array + */ + public function get_uploaded_header_images() { + $header_images = get_uploaded_header_images(); + $timestamp_key = '_wp_attachment_custom_header_last_used_' . get_stylesheet(); + $alt_text_key = '_wp_attachment_image_alt'; + + foreach ( $header_images as &$header_image ) { + $header_meta = get_post_meta( $header_image['attachment_id'] ); + $header_image['timestamp'] = isset( $header_meta[ $timestamp_key ] ) ? $header_meta[ $timestamp_key ] : ''; + $header_image['alt_text'] = isset( $header_meta[ $alt_text_key ] ) ? $header_meta[ $alt_text_key ] : ''; + } + + return $header_images; + } }

@@ -585,7 +577,7 @@ var farbtastic;
@@ -600,7 +592,7 @@ var farbtastic;

@@ -611,7 +603,7 @@ var farbtastic; $default_image = get_theme_support( 'custom-header', 'default-image' ); if ( $default_image && get_header_image() != $default_image ) : ?> -

@@ -628,7 +620,7 @@ var farbtastic; - + - + - + - - - - -

@@ -637,35 +629,43 @@ var farbtastic;

- - - - - - -

- -
-

- + $default_color_attr = $default_color ? ' data-default-color="' . esc_attr( $default_color ) . '"' : ''; + + $header_textcolor = display_header_text() ? get_header_textcolor() : get_theme_support( 'custom-header', 'default-text-color' ); + if ( $header_textcolor && false === strpos( $header_textcolor, '#' ) ) { + $header_textcolor = '#' . $header_textcolor; + } + + echo ''; + if ( $default_color ) { + echo ' ' . sprintf( _x( 'Default: %s', 'color' ), esc_html( $default_color ) ) . ''; + } + ?> +

@@ -681,26 +681,29 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * * @since 2.1.0 */ - function step_2() { + public function step_2() { check_admin_referer('custom-header-upload', '_wpnonce-custom-header-upload'); if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) - wp_die( __( 'Cheatin’ uh?' ) ); + wp_die( __( 'Cheatin’ uh?' ), 403 ); if ( empty( $_POST ) && isset( $_GET['file'] ) ) { $attachment_id = absint( $_GET['file'] ); $file = get_attached_file( $attachment_id, true ); - $url = wp_get_attachment_image_src( $attachment_id, 'full'); + $url = wp_get_attachment_image_src( $attachment_id, 'full' ); $url = $url[0]; } elseif ( isset( $_POST ) ) { - extract($this->step_2_manage_upload()); + $data = $this->step_2_manage_upload(); + $attachment_id = $data['attachment_id']; + $file = $data['file']; + $url = $data['url']; } if ( file_exists( $file ) ) { list( $width, $height, $type, $attr ) = getimagesize( $file ); } else { $data = wp_get_attachment_metadata( $attachment_id ); - $height = $data[ 'height' ]; - $width = $data[ 'width' ]; + $height = isset( $data[ 'height' ] ) ? $data[ 'height' ] : 0; + $width = isset( $data[ 'width' ] ) ? $data[ 'width' ] : 0; unset( $data ); } @@ -723,7 +726,16 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> $this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) ); - do_action('wp_create_file_in_uploads', $file, $attachment_id); // For replication + /** + * Fires after the header image is set or an error is returned. + * + * @since 2.1.0 + * + * @param string $file Path to the file. + * @param int $attachment_id Attachment ID. + */ + do_action( 'wp_create_file_in_uploads', $file, $attachment_id ); // For replication + return $this->finished(); } elseif ( $width > $max_width ) { $oitar = $width / $max_width; @@ -731,7 +743,8 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> if ( ! $image || is_wp_error( $image ) ) wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); - $image = apply_filters('wp_create_file_in_uploads', $image, $attachment_id); // For replication + /** This filter is documented in wp-admin/custom-header.php */ + $image = apply_filters( 'wp_create_file_in_uploads', $image, $attachment_id ); // For replication $url = str_replace(basename($url), basename($image), $url); $width = $width / $oitar; @@ -742,12 +755,11 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> ?>
- -

+

- +

-

+

@@ -767,7 +779,7 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>

@@ -782,9 +794,15 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * * @since 3.4.0 */ - function step_2_manage_upload() { + public function step_2_manage_upload() { $overrides = array('test_form' => false); - $file = wp_handle_upload($_FILES['import'], $overrides); + + $uploaded_file = $_FILES['import']; + $wp_filetype = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] ); + if ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) + wp_die( __( 'The uploaded file is not a valid image. Please try again.' ) ); + + $file = wp_handle_upload($uploaded_file, $overrides); if ( isset($file['error']) ) wp_die( $file['error'], __( 'Image Upload Error' ) ); @@ -813,11 +831,14 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * * @since 2.1.0 */ - function step_3() { + public function step_3() { check_admin_referer( 'custom-header-crop-image' ); if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) - wp_die( __( 'Cheatin’ uh?' ) ); + wp_die( __( 'Cheatin’ uh?' ), 403 ); + + if ( ! empty( $_POST['skip-cropping'] ) && ! ( current_theme_supports( 'custom-header', 'flex-height' ) || current_theme_supports( 'custom-header', 'flex-width' ) ) ) + wp_die( __( 'Cheatin’ uh?' ), 403 ); if ( $_POST['oitar'] > 1 ) { $_POST['x1'] = $_POST['x1'] * $_POST['oitar']; @@ -829,32 +850,15 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> $attachment_id = absint( $_POST['attachment_id'] ); $original = get_attached_file($attachment_id); - - $max_width = 0; - // For flex, limit size of image displayed to 1500px unless theme says otherwise - if ( current_theme_supports( 'custom-header', 'flex-width' ) ) - $max_width = 1500; - - if ( current_theme_supports( 'custom-header', 'max-width' ) ) - $max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) ); - $max_width = max( $max_width, get_theme_support( 'custom-header', 'width' ) ); - - if ( ( current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) ) || $_POST['width'] > $max_width ) - $dst_height = absint( $_POST['height'] * ( $max_width / $_POST['width'] ) ); - elseif ( current_theme_supports( 'custom-header', 'flex-height' ) && current_theme_supports( 'custom-header', 'flex-width' ) ) - $dst_height = absint( $_POST['height'] ); - else - $dst_height = get_theme_support( 'custom-header', 'height' ); - - if ( ( current_theme_supports( 'custom-header', 'flex-width' ) && ! current_theme_supports( 'custom-header', 'flex-height' ) ) || $_POST['width'] > $max_width ) - $dst_width = absint( $_POST['width'] * ( $max_width / $_POST['width'] ) ); - elseif ( current_theme_supports( 'custom-header', 'flex-width' ) && current_theme_supports( 'custom-header', 'flex-height' ) ) - $dst_width = absint( $_POST['width'] ); - else - $dst_width = get_theme_support( 'custom-header', 'width' ); + $dimensions = $this->get_header_dimensions( array( + 'height' => $_POST['height'], + 'width' => $_POST['width'], + ) ); + $height = $dimensions['dst_height']; + $width = $dimensions['dst_width']; if ( empty( $_POST['skip-cropping'] ) ) - $cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $dst_width, $dst_height ); + $cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $width, $height ); elseif ( ! empty( $_POST['create-new-attachment'] ) ) $cropped = _copy_image_file( $attachment_id ); else @@ -863,41 +867,29 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> if ( ! $cropped || is_wp_error( $cropped ) ) wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); - $cropped = apply_filters('wp_create_file_in_uploads', $cropped, $attachment_id); // For replication + /** This filter is documented in wp-admin/custom-header.php */ + $cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication - $parent = get_post($attachment_id); - $parent_url = $parent->guid; - $url = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url ); + $object = $this->create_attachment_object( $cropped, $attachment_id ); - $size = @getimagesize( $cropped ); - $image_type = ( $size ) ? $size['mime'] : 'image/jpeg'; - - // Construct the object array - $object = array( - 'ID' => $attachment_id, - 'post_title' => basename($cropped), - 'post_content' => $url, - 'post_mime_type' => $image_type, - 'guid' => $url, - 'context' => 'custom-header' - ); if ( ! empty( $_POST['create-new-attachment'] ) ) unset( $object['ID'] ); // Update the attachment - $attachment_id = wp_insert_attachment( $object, $cropped ); - wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $cropped ) ); + $attachment_id = $this->insert_attachment( $object, $cropped ); - $width = $dst_width; - $height = $dst_height; + $url = $object['guid']; $this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) ); - // cleanup + // Cleanup. $medium = str_replace( basename( $original ), 'midsize-' . basename( $original ), $original ); - if ( file_exists( $medium ) ) - @unlink( apply_filters( 'wp_delete_file', $medium ) ); - if ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) ) - @unlink( apply_filters( 'wp_delete_file', $original ) ); + if ( file_exists( $medium ) ) { + wp_delete_file( $medium ); + } + + if ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) ) { + wp_delete_file( $original ); + } return $this->finished(); } @@ -907,7 +899,7 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * * @since 2.1.0 */ - function finished() { + public function finished() { $this->updated = true; $this->step_1(); } @@ -917,7 +909,7 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> * * @since 2.1.0 */ - function admin_page() { + public function admin_page() { if ( ! current_user_can('edit_theme_options') ) wp_die(__('You do not have permission to customize headers.')); $step = $this->step(); @@ -930,32 +922,27 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> } /** - * Replace default attachment actions with "Set as header" link. + * Unused since 3.5.0. * * @since 3.4.0 + * + * @param array $form_fields + * @return array $form_fields */ - function attachment_fields_to_edit( $form_fields, $post ) { - $form_fields = array(); - $href = esc_url(add_query_arg(array( - 'page' => 'custom-header', - 'step' => 2, - '_wpnonce-custom-header-upload' => wp_create_nonce('custom-header-upload'), - 'file' => $post->ID - ), admin_url('themes.php'))); - - $form_fields['buttons'] = array( 'tr' => '
' . __( 'Set as header' ) . '