90
91
add_action("admin_head-$page", array(&$this, 'help') );
91
92
add_action("admin_head-$page", array(&$this, 'take_action'), 50);
92
93
add_action("admin_head-$page", array(&$this, 'js'), 50);
93
add_action("admin_head-$page", $this->admin_header_callback, 51);
94
if ( $this->admin_header_callback )
95
add_action("admin_head-$page", $this->admin_header_callback, 51);
97
if ( isset( $_REQUEST['context'] ) && $_REQUEST['context'] == 'custom-header' ) {
98
add_filter( 'attachment_fields_to_edit', array( $this, 'attachment_fields_to_edit' ), 10, 2 );
99
add_filter( 'media_upload_tabs', array( $this, 'filter_upload_tabs' ) );
100
add_filter( 'media_upload_mime_type_links', '__return_empty_array' );
103
111
'id' => 'overview',
104
112
'title' => __('Overview'),
106
'<p>' . __( 'You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately.' ) . '</p>' .
107
'<p>' . __( 'If you want to discard your custom header and go back to the default included in your theme, click on the buttons to remove the custom image and restore the original header image.' ) . '</p>' .
108
'<p>' . __( 'Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the Save Changes button.' ) . '</p>'
114
'<p>' . __( 'This screen is used to customize the header section of your theme.') . '</p>' .
115
'<p>' . __( 'You can choose from the theme’s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed.') . '<p>'
118
get_current_screen()->add_help_tab( array(
119
'id' => 'set-header-image',
120
'title' => __('Header Image'),
122
'<p>' . __( 'You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the “Choose Image” button.' ) . '</p>' .
123
'<p>' . __( 'Some themes come with additional header images bundled. If you see multiple images displayed, select the one you’d like and click the “Save Changes” button.' ) . '</p>' .
124
'<p>' . __( 'If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the “Random” radio button next to the Uploaded Images or Default Images section to enable this feature.') . '</p>' .
125
'<p>' . __( 'If you don’t want a header image to be displayed on your site at all, click the “Remove Header Image” button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click “Save Changes”.') . '</p>'
128
get_current_screen()->add_help_tab( array(
129
'id' => 'set-header-text',
130
'title' => __('Header Text'),
132
'<p>' . sprintf( __( 'For most themes, the header text is your Site Title and Tagline, as defined in the <a href="%1$s">General Settings</a> section.' ), admin_url( 'options-general.php' ) ) . '<p>' .
133
'<p>' . __( '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.') . '</p>' .
134
'<p>' . __( 'Don’t forget to Save Changes when you’re done!') . '</p>'
111
137
get_current_screen()->set_help_sidebar(
202
224
if ( isset( $_POST['removeheader'] ) ) {
203
225
check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
204
set_theme_mod( 'header_image', 'remove-header' );
226
$this->remove_header_image();
208
if ( isset( $_POST['text-color'] ) ) {
230
if ( isset( $_POST['text-color'] ) && ! isset( $_POST['display-header-text'] ) ) {
231
check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
232
set_theme_mod( 'header_textcolor', 'blank' );
233
} elseif ( isset( $_POST['text-color'] ) ) {
209
234
check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
210
235
$_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] );
211
if ( 'blank' == $_POST['text-color'] ) {
236
$color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['text-color']);
237
if ( strlen($color) == 6 || strlen($color) == 3 )
238
set_theme_mod('header_textcolor', $color);
212
240
set_theme_mod( 'header_textcolor', 'blank' );
214
$color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['text-color']);
215
if ( strlen($color) == 6 || strlen($color) == 3 )
216
set_theme_mod('header_textcolor', $color);
220
243
if ( isset( $_POST['default-header'] ) ) {
221
244
check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
222
if ( 'random-default-image' == $_POST['default-header'] ) {
223
set_theme_mod( 'header_image', 'random-default-image' );
224
} elseif ( 'random-uploaded-image' == $_POST['default-header'] ) {
225
set_theme_mod( 'header_image', 'random-uploaded-image' );
227
$this->process_default_headers();
228
$uploaded = get_uploaded_header_images();
229
if ( isset( $uploaded[$_POST['default-header']] ) )
230
set_theme_mod( 'header_image', esc_url( $uploaded[$_POST['default-header']]['url'] ) );
231
elseif ( isset( $this->default_headers[$_POST['default-header']] ) )
232
set_theme_mod( 'header_image', esc_url( $this->default_headers[$_POST['default-header']]['url'] ) );
245
$this->set_header_image( $_POST['default-header'] );
319
332
function js_1() { ?>
320
333
<script type="text/javascript">
322
var text_objects = ['#name', '#desc', '#text-color-row'];
324
var default_color = '#<?php echo HEADER_TEXTCOLOR; ?>';
325
var old_color = null;
337
var default_color = '#<?php echo get_theme_support( 'custom-header', 'default-text-color' ); ?>',
327
340
function pickColor(color) {
328
jQuery('#name').css('color', color);
329
jQuery('#desc').css('color', color);
330
jQuery('#text-color').val(color);
341
$('#name').css('color', color);
342
$('#desc').css('color', color);
343
$('#text-color').val(color);
331
344
farbtastic.setColor(color);
334
function toggle_text(s) {
335
if (jQuery(s).attr('id') == 'showtext' && jQuery('#text-color').val() != 'blank')
338
if (jQuery(s).attr('id') == 'hidetext' && jQuery('#text-color').val() == 'blank')
341
if (jQuery('#text-color').val() == 'blank') {
343
if (old_color == '#blank')
344
old_color = default_color;
346
jQuery( text_objects.toString() ).show();
347
jQuery('#text-color').val(old_color);
348
jQuery('#name').css('color', old_color);
349
jQuery('#desc').css('color', old_color);
350
pickColor(old_color);
347
function toggle_text() {
348
var checked = $('#display-header-text').prop('checked'),
350
header_text_fields.toggle( checked );
353
text_color = $('#text-color');
354
if ( '' == text_color.val().replace('#', '') ) {
355
text_color.val( default_color );
356
pickColor( default_color );
353
jQuery( text_objects.toString() ).hide();
354
old_color = jQuery('#text-color').val();
355
jQuery('#text-color').val('blank');
358
pickColor( text_color.val() );
359
jQuery(document).ready(function() {
360
jQuery('#pickcolor').click(function() {
361
jQuery('#color-picker').show();
364
jQuery('input[name="hidetext"]').click(function() {
368
jQuery('#defaultcolor').click(function() {
362
$(document).ready(function() {
363
header_text_fields = $('.displaying-header-text');
364
$('#pickcolor').click(function(e) {
366
$('#color-picker').show();
369
$('#display-header-text').click( toggle_text );
371
$('#defaultcolor').click(function() {
369
372
pickColor(default_color);
370
jQuery('#text-color').val(default_color)
373
$('#text-color').val(default_color);
373
jQuery('#text-color').keyup(function() {
374
var _hex = jQuery('#text-color').val();
376
$('#text-color').keyup(function() {
377
var _hex = $('#text-color').val();
376
379
if ( hex[0] != '#' )
378
381
hex = hex.replace(/[^#a-fA-F0-9]+/, '');
379
382
if ( hex != _hex )
380
jQuery('#text-color').val(hex);
383
$('#text-color').val(hex);
381
384
if ( hex.length == 4 || hex.length == 7 )
382
385
pickColor( hex );
385
jQuery(document).mousedown(function(){
386
jQuery('#color-picker').each( function() {
387
var display = jQuery(this).css('display');
388
$(document).mousedown(function(){
389
$('#color-picker').each( function() {
390
var display = $(this).css('display');
388
391
if (display == 'block')
389
jQuery(this).fadeOut(2);
393
farbtastic = jQuery.farbtastic('#color-picker', function(color) { pickColor(color); });
394
<?php if ( $color = get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) ) { ?>
395
pickColor('#<?php echo $color; ?>');
398
<?php if ( 'blank' == get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) || '' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || ! $this->header_text() ) { ?>
396
farbtastic = $.farbtastic('#color-picker', function(color) { pickColor(color); });
397
<?php if ( display_header_text() ) { ?>
398
pickColor('#<?php echo get_header_textcolor(); ?>');
439
441
jQuery('img#upload').imgAreaSelect({
442
aspectRatio: xinit + ':' + yinit,
448
maxHeight: <?php echo HEADER_IMAGE_HEIGHT; ?>,
449
maxWidth: <?php echo HEADER_IMAGE_WIDTH; ?>,
450
if ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) ) {
452
aspectRatio: xinit + ':' + yinit,
455
if ( ! current_theme_supports( 'custom-header', 'flex-height' ) ) {
457
maxHeight: <?php echo get_theme_support( 'custom-header', 'height' ); ?>,
460
if ( ! current_theme_supports( 'custom-header', 'flex-width' ) ) {
462
maxWidth: <?php echo get_theme_support( 'custom-header', 'width' ); ?>,
450
466
onInit: function () {
451
467
jQuery('#width').val(xinit);
452
468
jQuery('#height').val(yinit);
502
<h3><?php _e( 'Header Image' ); ?></h3>
486
504
<table class="form-table">
490
507
<tr valign="top">
491
508
<th scope="row"><?php _e( 'Preview' ); ?></th>
493
510
<?php if ( $this->admin_image_div_callback ) {
494
511
call_user_func( $this->admin_image_div_callback );
497
<div id="headimg" style="max-width:<?php echo HEADER_IMAGE_WIDTH; ?>px;height:<?php echo HEADER_IMAGE_HEIGHT; ?>px;background-image:url(<?php esc_url ( header_image() ) ?>);">
514
<div id="headimg" style="background-image:url(<?php esc_url ( header_image() ) ?>);max-width:<?php echo get_custom_header()->width; ?>px;height:<?php echo get_custom_header()->height; ?>px;">
499
if ( 'blank' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || '' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || ! $this->header_text() )
516
if ( display_header_text() )
517
$style = ' style="color:#' . get_header_textcolor() . ';"';
500
519
$style = ' style="display:none;"';
502
$style = ' style="color:#' . get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) . ';"';
504
<h1><a id="name"<?php echo $style; ?> onclick="return false;" href="<?php bloginfo('url'); ?>"><?php bloginfo( 'name' ); ?></a></h1>
505
<div id="desc"<?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>
521
<h1><a id="name" class="displaying-header-text" <?php echo $style; ?> onclick="return false;" href="<?php bloginfo('url'); ?>"><?php bloginfo( 'name' ); ?></a></h1>
522
<div id="desc" class="displaying-header-text" <?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>
510
<?php if ( current_theme_supports( 'custom-header-uploads' ) ) : ?>
527
<?php if ( current_theme_supports( 'custom-header', 'uploads' ) ) : ?>
511
528
<tr valign="top">
512
<th scope="row"><?php _e( 'Upload Image' ); ?></th>
529
<th scope="row"><?php _e( 'Select Image' ); ?></th>
514
531
<p><?php _e( 'You can upload a custom header image to be shown at the top of your site instead of the default one. On the next screen you will be able to crop the image.' ); ?><br />
515
<?php printf( __( 'Images of exactly <strong>%1$d × %2$d pixels</strong> will be used as-is.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?></p>
533
if ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) ) {
534
printf( __( 'Images of exactly <strong>%1$d × %2$d pixels</strong> will be used as-is.' ) . '<br />', get_theme_support( 'custom-header', 'width' ), get_theme_support( 'custom-header', 'height' ) );
535
} elseif ( current_theme_supports( 'custom-header', 'flex-height' ) ) {
536
if ( ! current_theme_supports( 'custom-header', 'flex-width' ) )
537
printf( __( 'Images should be at least <strong>%1$d pixels</strong> wide.' ) . ' ', get_theme_support( 'custom-header', 'width' ) );
538
} elseif ( current_theme_supports( 'custom-header', 'flex-width' ) ) {
539
if ( ! current_theme_supports( 'custom-header', 'flex-height' ) )
540
printf( __( 'Images should be at least <strong>%1$d pixels</strong> tall.' ) . ' ', get_theme_support( 'custom-header', 'height' ) );
542
if ( current_theme_supports( 'custom-header', 'flex-height' ) || current_theme_supports( 'custom-header', 'flex-width' ) ) {
543
if ( current_theme_supports( 'custom-header', 'width' ) )
544
printf( __( 'Suggested width is <strong>%1$d pixels</strong>.' ) . ' ', get_theme_support( 'custom-header', 'width' ) );
545
if ( current_theme_supports( 'custom-header', 'height' ) )
546
printf( __( 'Suggested height is <strong>%1$d pixels</strong>.' ) . ' ', get_theme_support( 'custom-header', 'height' ) );
516
549
<form enctype="multipart/form-data" id="upload-form" method="post" action="<?php echo esc_attr( add_query_arg( 'step', 2 ) ) ?>">
518
551
<label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
519
552
<input type="file" id="upload" name="import" />
520
553
<input type="hidden" name="action" value="save" />
521
<?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ) ?>
554
<?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ); ?>
522
555
<?php submit_button( __( 'Upload' ), 'button', 'submit', false ); ?>
558
$image_library_url = get_upload_iframe_src( 'image', null, 'library' );
559
$image_library_url = remove_query_arg( 'TB_iframe', $image_library_url );
560
$image_library_url = add_query_arg( array( 'context' => 'custom-header', 'TB_iframe' => 1 ), $image_library_url );
563
<label for="choose-from-library-link"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />
564
<a id="choose-from-library-link" class="button thickbox" href="<?php echo esc_url( $image_library_url ); ?>"><?php _e( 'Choose Image' ); ?></a>
582
<?php if ( $this->header_text() ) : ?>
625
<?php if ( current_theme_supports( 'custom-header', 'header-text' ) ) : ?>
627
<h3><?php _e( 'Header Text' ); ?></h3>
583
629
<table class="form-table">
585
<tr valign="top" class="hide-if-no-js">
586
<th scope="row"><?php _e( 'Display Text' ); ?></th>
632
<th scope="row"><?php _e( 'Header Text' ); ?></th>
589
<?php $hidetext = get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ); ?>
590
<label><input type="radio" value="1" name="hidetext" id="hidetext"<?php checked( ( 'blank' == $hidetext || empty( $hidetext ) ) ? true : false ); ?> /> <?php _e( 'No' ); ?></label>
591
<label><input type="radio" value="0" name="hidetext" id="showtext"<?php checked( ( 'blank' == $hidetext || empty( $hidetext ) ) ? false : true ); ?> /> <?php _e( 'Yes' ); ?></label>
635
<label><input type="checkbox" name="display-header-text" id="display-header-text"<?php checked( display_header_text() ); ?> /> <?php _e( 'Show header text with your image.' ); ?></label>
596
<tr valign="top" id="text-color-row">
640
<tr valign="top" class="displaying-header-text">
597
641
<th scope="row"><?php _e( 'Text Color' ); ?></th>
600
<input type="text" name="text-color" id="text-color" value="#<?php echo esc_attr( get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) ); ?>" />
601
<span class="description hide-if-js"><?php _e( 'If you want to hide header text, add <strong>#blank</strong> as text color.' );?></span>
602
<input type="button" class="button hide-if-no-js" value="<?php esc_attr_e( 'Select a Color' ); ?>" id="pickcolor" />
644
<?php if ( display_header_text() ) : ?>
645
<input type="text" name="text-color" id="text-color" value="#<?php echo esc_attr( get_header_textcolor() ); ?>" />
647
<input type="text" name="text-color" id="text-color" value="#<?php echo esc_attr( get_theme_support( 'custom-header', 'default-text-color' ) ); ?>" />
649
<a href="#" class="hide-if-no-js" id="pickcolor"><?php _e( 'Select a Color' ); ?></a>
604
651
<div id="color-picker" style="z-index: 100; background:#eee; border:1px solid #ccc; position:absolute; display:none;"></div>
608
<?php if ( defined('HEADER_TEXTCOLOR') && get_theme_mod('header_textcolor') ) { ?>
655
<?php if ( current_theme_supports( 'custom-header', 'default-text-color' ) && get_theme_mod( 'header_textcolor' ) ) { ?>
609
656
<tr valign="top">
610
657
<th scope="row"><?php _e('Reset Text Color'); ?></th>
637
684
function step_2() {
638
685
check_admin_referer('custom-header-upload', '_wpnonce-custom-header-upload');
639
if ( ! current_theme_supports( 'custom-header-uploads' ) )
686
if ( ! current_theme_supports( 'custom-header', 'uploads' ) )
640
687
wp_die( __( 'Cheatin’ uh?' ) );
642
$overrides = array('test_form' => false);
643
$file = wp_handle_upload($_FILES['import'], $overrides);
645
if ( isset($file['error']) )
646
wp_die( $file['error'], __( 'Image Upload Error' ) );
649
$type = $file['type'];
650
$file = $file['file'];
651
$filename = basename($file);
653
// Construct the object array
655
'post_title' => $filename,
656
'post_content' => $url,
657
'post_mime_type' => $type,
659
'context' => 'custom-header'
663
$id = wp_insert_attachment($object, $file);
665
list($width, $height, $type, $attr) = getimagesize( $file );
667
if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) {
689
if ( empty( $_POST ) && isset( $_GET['file'] ) ) {
690
$attachment_id = absint( $_GET['file'] );
691
$file = get_attached_file( $attachment_id, true );
692
$url = wp_get_attachment_image_src( $attachment_id, 'full');
694
} elseif ( isset( $_POST ) ) {
695
extract($this->step_2_manage_upload());
698
if ( file_exists( $file ) ) {
699
list( $width, $height, $type, $attr ) = getimagesize( $file );
701
$data = wp_get_attachment_metadata( $attachment_id );
702
$height = $data[ 'height' ];
703
$width = $data[ 'width' ];
708
// For flex, limit size of image displayed to 1500px unless theme says otherwise
709
if ( current_theme_supports( 'custom-header', 'flex-width' ) )
712
if ( current_theme_supports( 'custom-header', 'max-width' ) )
713
$max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) );
714
$max_width = max( $max_width, get_theme_support( 'custom-header', 'width' ) );
716
// If flexible height isn't supported and the image is the exact right size
717
if ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' )
718
&& $width == get_theme_support( 'custom-header', 'width' ) && $height == get_theme_support( 'custom-header', 'height' ) )
668
720
// Add the meta-data
669
wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
670
update_post_meta( $id, '_wp_attachment_is_custom_header', get_option('stylesheet' ) );
672
set_theme_mod('header_image', esc_url($url));
673
do_action('wp_create_file_in_uploads', $file, $id); // For replication
721
if ( file_exists( $file ) )
722
wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );
724
$this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) );
726
do_action('wp_create_file_in_uploads', $file, $attachment_id); // For replication
674
727
return $this->finished();
675
} elseif ( $width > HEADER_IMAGE_WIDTH ) {
676
$oitar = $width / HEADER_IMAGE_WIDTH;
677
$image = wp_crop_image($file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file));
678
if ( is_wp_error( $image ) )
679
wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
728
} elseif ( $width > $max_width ) {
729
$oitar = $width / $max_width;
730
$image = wp_crop_image($attachment_id, 0, 0, $width, $height, $max_width, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file));
731
if ( ! $image || is_wp_error( $image ) )
732
wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
681
$image = apply_filters('wp_create_file_in_uploads', $image, $id); // For replication
734
$image = apply_filters('wp_create_file_in_uploads', $image, $attachment_id); // For replication
683
736
$url = str_replace(basename($url), basename($image), $url);
684
737
$width = $width / $oitar;
704
757
<input type="hidden" name="y1" id="y1" value="0"/>
705
758
<input type="hidden" name="width" id="width" value="<?php echo esc_attr( $width ); ?>"/>
706
759
<input type="hidden" name="height" id="height" value="<?php echo esc_attr( $height ); ?>"/>
707
<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $id ); ?>" />
760
<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $attachment_id ); ?>" />
708
761
<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" />
762
<?php if ( empty( $_POST ) && isset( $_GET['file'] ) ) { ?>
763
<input type="hidden" name="create-new-attachment" value="true" />
709
765
<?php wp_nonce_field( 'custom-header-crop-image' ) ?>
711
<?php submit_button( __( 'Crop and Publish' ) ); ?>
768
<?php submit_button( __( 'Crop and Publish' ), 'primary', 'submit', false ); ?>
770
if ( isset( $oitar ) && 1 == $oitar )
771
submit_button( __( 'Skip Cropping, Publish Image as Is' ), 'secondary', 'skip-cropping', false );
781
* Upload the file to be cropped in the second step.
785
function step_2_manage_upload() {
786
$overrides = array('test_form' => false);
787
$file = wp_handle_upload($_FILES['import'], $overrides);
789
if ( isset($file['error']) )
790
wp_die( $file['error'], __( 'Image Upload Error' ) );
793
$type = $file['type'];
794
$file = $file['file'];
795
$filename = basename($file);
797
// Construct the object array
799
'post_title' => $filename,
800
'post_content' => $url,
801
'post_mime_type' => $type,
803
'context' => 'custom-header'
807
$attachment_id = wp_insert_attachment( $object, $file );
808
return compact( 'attachment_id', 'file', 'filename', 'url', 'type' );
719
812
* Display third step of custom header image page.
723
816
function step_3() {
724
check_admin_referer('custom-header-crop-image');
725
if ( ! current_theme_supports( 'custom-header-uploads' ) )
817
check_admin_referer( 'custom-header-crop-image' );
819
if ( ! current_theme_supports( 'custom-header', 'uploads' ) )
726
820
wp_die( __( 'Cheatin’ uh?' ) );
728
822
if ( $_POST['oitar'] > 1 ) {
735
829
$attachment_id = absint( $_POST['attachment_id'] );
736
830
$original = get_attached_file($attachment_id);
738
$cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT );
739
if ( is_wp_error( $cropped ) )
740
wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
834
// For flex, limit size of image displayed to 1500px unless theme says otherwise
835
if ( current_theme_supports( 'custom-header', 'flex-width' ) )
838
if ( current_theme_supports( 'custom-header', 'max-width' ) )
839
$max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) );
840
$max_width = max( $max_width, get_theme_support( 'custom-header', 'width' ) );
842
if ( ( current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) ) || $_POST['width'] > $max_width )
843
$dst_height = absint( $_POST['height'] * ( $max_width / $_POST['width'] ) );
844
elseif ( current_theme_supports( 'custom-header', 'flex-height' ) && current_theme_supports( 'custom-header', 'flex-width' ) )
845
$dst_height = absint( $_POST['height'] );
847
$dst_height = get_theme_support( 'custom-header', 'height' );
849
if ( ( current_theme_supports( 'custom-header', 'flex-width' ) && ! current_theme_supports( 'custom-header', 'flex-height' ) ) || $_POST['width'] > $max_width )
850
$dst_width = absint( $_POST['width'] * ( $max_width / $_POST['width'] ) );
851
elseif ( current_theme_supports( 'custom-header', 'flex-width' ) && current_theme_supports( 'custom-header', 'flex-height' ) )
852
$dst_width = absint( $_POST['width'] );
854
$dst_width = get_theme_support( 'custom-header', 'width' );
856
if ( empty( $_POST['skip-cropping'] ) )
857
$cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $dst_width, $dst_height );
858
elseif ( ! empty( $_POST['create-new-attachment'] ) )
859
$cropped = _copy_image_file( $attachment_id );
861
$cropped = get_attached_file( $attachment_id );
863
if ( ! $cropped || is_wp_error( $cropped ) )
864
wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
742
866
$cropped = apply_filters('wp_create_file_in_uploads', $cropped, $attachment_id); // For replication
744
868
$parent = get_post($attachment_id);
745
869
$parent_url = $parent->guid;
746
$url = str_replace(basename($parent_url), basename($cropped), $parent_url);
870
$url = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );
872
$size = @getimagesize( $cropped );
873
$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';
748
875
// Construct the object array
750
877
'ID' => $attachment_id,
751
878
'post_title' => basename($cropped),
752
879
'post_content' => $url,
753
'post_mime_type' => 'image/jpeg',
880
'post_mime_type' => $image_type,
755
882
'context' => 'custom-header'
884
if ( ! empty( $_POST['create-new-attachment'] ) )
885
unset( $object['ID'] );
758
887
// Update the attachment
759
wp_insert_attachment($object, $cropped);
888
$attachment_id = wp_insert_attachment( $object, $cropped );
760
889
wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $cropped ) );
761
update_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_option('stylesheet' ) );
763
set_theme_mod('header_image', $url);
892
$height = $dst_height;
893
$this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) );
766
$medium = str_replace(basename($original), 'midsize-'.basename($original), $original);
767
@unlink( apply_filters( 'wp_delete_file', $medium ) );
768
@unlink( apply_filters( 'wp_delete_file', $original ) );
896
$medium = str_replace( basename( $original ), 'midsize-' . basename( $original ), $original );
897
if ( file_exists( $medium ) )
898
@unlink( apply_filters( 'wp_delete_file', $medium ) );
899
if ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) )
900
@unlink( apply_filters( 'wp_delete_file', $original ) );
770
902
return $this->finished();
789
921
if ( ! current_user_can('edit_theme_options') )
790
922
wp_die(__('You do not have permission to customize headers.'));
791
923
$step = $this->step();
794
elseif ( 2 == $step )
796
926
elseif ( 3 == $step )
933
* Replace default attachment actions with "Set as header" link.
937
function attachment_fields_to_edit( $form_fields, $post ) {
938
$form_fields = array();
939
$href = esc_url(add_query_arg(array(
940
'page' => 'custom-header',
942
'_wpnonce-custom-header-upload' => wp_create_nonce('custom-header-upload'),
944
), admin_url('themes.php')));
946
$form_fields['buttons'] = array( 'tr' => '<tr class="submit"><td></td><td><a data-location="' . $href . '" class="wp-set-header">' . __( 'Set as header' ) . '</a></td></tr>' );
947
$form_fields['context'] = array( 'input' => 'hidden', 'value' => 'custom-header' );
953
* Leave only "Media Library" tab in the uploader window.
957
function filter_upload_tabs() {
958
return array( 'library' => __('Media Library') );
962
* Choose a header image, selected from existing uploaded and default headers,
963
* or provide an array of uploaded header data (either new, or from media library).
965
* @param mixed $choice Which header image to select. Allows for values of 'random-default-image',
966
* for randomly cycling among the default images; 'random-uploaded-image', for randomly cycling
967
* among the uploaded images; the key of a default image registered for that theme; and
968
* the key of an image uploaded for that theme (the basename of the URL).
969
* Or an array of arguments: attachment_id, url, width, height. All are required.
973
final public function set_header_image( $choice ) {
974
if ( is_array( $choice ) || is_object( $choice ) ) {
975
$choice = (array) $choice;
976
if ( ! isset( $choice['attachment_id'] ) || ! isset( $choice['url'] ) )
979
$choice['url'] = esc_url_raw( $choice['url'] );
981
$header_image_data = (object) array(
982
'attachment_id' => $choice['attachment_id'],
983
'url' => $choice['url'],
984
'thumbnail_url' => $choice['url'],
985
'height' => $choice['height'],
986
'width' => $choice['width'],
989
update_post_meta( $choice['attachment_id'], '_wp_attachment_is_custom_header', get_stylesheet() );
990
set_theme_mod( 'header_image', $choice['url'] );
991
set_theme_mod( 'header_image_data', $header_image_data );
995
if ( in_array( $choice, array( 'remove-header', 'random-default-image', 'random-uploaded-image' ) ) ) {
996
set_theme_mod( 'header_image', $choice );
997
remove_theme_mod( 'header_image_data' );
1001
$uploaded = get_uploaded_header_images();
1002
if ( $uploaded && isset( $uploaded[ $choice ] ) ) {
1003
$header_image_data = $uploaded[ $choice ];
1006
$this->process_default_headers();
1007
if ( isset( $this->default_headers[ $choice ] ) )
1008
$header_image_data = $this->default_headers[ $choice ];
1013
set_theme_mod( 'header_image', esc_url_raw( $header_image_data['url'] ) );
1014
set_theme_mod( 'header_image_data', $header_image_data );
1018
* Remove a header image.
1022
final public function remove_header_image() {
1023
return $this->set_header_image( 'remove-header' );
1027
* Reset a header image to the default image for the theme.
1029
* This method does not do anything if the theme does not have a default header image.
1033
final public function reset_header_image() {
1034
$this->process_default_headers();
1035
$default = get_theme_support( 'custom-header', 'default-image' );
1038
return $this->remove_header_image();
1040
$default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() );
1042
foreach ( $this->default_headers as $header => $details ) {
1043
if ( $details['url'] == $default ) {
1044
$default_data = $details;
1049
set_theme_mod( 'header_image', $default );
1050
set_theme_mod( 'header_image_data', (object) $default_data );