| [ XREF Home ] [ Index ] |
PHP Cross Reference of WordPress TrunkProvided by Yoast |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * The custom header image script. 4 * 5 * @package WordPress 6 * @subpackage Administration 7 */ 8 9 /** 10 * The custom header image class. 11 * 12 * @since 2.1.0 13 * @package WordPress 14 * @subpackage Administration 15 */ 16 class Custom_Image_Header { 17 18 /** 19 * Callback for administration header. 20 * 21 * @var callback 22 * @since 2.1.0 23 * @access private 24 */ 25 var $admin_header_callback; 26 27 /** 28 * Callback for header div. 29 * 30 * @var callback 31 * @since 3.0.0 32 * @access private 33 */ 34 var $admin_image_div_callback; 35 36 /** 37 * Holds default headers. 38 * 39 * @var array 40 * @since 3.0.0 41 * @access private 42 */ 43 var $default_headers = array(); 44 45 46 /** 47 * Holds custom headers uploaded by the user 48 * 49 * @var array 50 * @since 3.2.0 51 * @access private 52 */ 53 var $uploaded_headers = array(); 54 55 /** 56 * Holds the page menu hook. 57 * 58 * @var string 59 * @since 3.0.0 60 * @access private 61 */ 62 var $page = ''; 63 64 /** 65 * Constructor - Register administration header callback. 66 * 67 * @since 2.1.0 68 * @param callback $admin_header_callback 69 * @param callback $admin_image_div_callback Optional custom image div output callback. 70 * @return Custom_Image_Header 71 */ 72 function __construct($admin_header_callback, $admin_image_div_callback = '') { 73 $this->admin_header_callback = $admin_header_callback; 74 $this->admin_image_div_callback = $admin_image_div_callback; 75 } 76 77 /** 78 * Set up the hooks for the Custom Header admin page. 79 * 80 * @since 2.1.0 81 */ 82 function init() { 83 if ( ! current_user_can('edit_theme_options') ) 84 return; 85 86 $this->page = $page = add_theme_page(__('Header'), __('Header'), 'edit_theme_options', 'custom-header', array(&$this, 'admin_page')); 87 88 add_action("admin_print_scripts-$page", array(&$this, 'js_includes')); 89 add_action("admin_print_styles-$page", array(&$this, 'css_includes')); 90 add_action("admin_head-$page", array(&$this, 'help') ); 91 add_action("admin_head-$page", array(&$this, 'take_action'), 50); 92 add_action("admin_head-$page", array(&$this, 'js'), 50); 93 add_action("admin_head-$page", $this->admin_header_callback, 51); 94 } 95 96 /** 97 * Adds contextual help. 98 * 99 * @since 3.0.0 100 */ 101 function help() { 102 add_contextual_help( $this->page, '<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>' . 103 '<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>' . 104 '<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>' . 105 '<p><strong>' . __( 'For more information:' ) . '</strong></p>' . 106 '<p>' . __( '<a href="http://codex.wordpress.org/Appearance_Header_Screen" target="_blank">Documentation on Custom Header</a>' ) . '</p>' . 107 '<p>' . __( '<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>' ) . '</p>' ); 108 } 109 110 /** 111 * Get the current step. 112 * 113 * @since 2.6.0 114 * 115 * @return int Current step 116 */ 117 function step() { 118 if ( ! isset( $_GET['step'] ) ) 119 return 1; 120 121 $step = (int) $_GET['step']; 122 if ( $step < 1 || 3 < $step ) 123 $step = 1; 124 125 return $step; 126 } 127 128 /** 129 * Set up the enqueue for the JavaScript files. 130 * 131 * @since 2.1.0 132 */ 133 function js_includes() { 134 $step = $this->step(); 135 136 if ( ( 1 == $step || 3 == $step ) && $this->header_text() ) 137 wp_enqueue_script('farbtastic'); 138 elseif ( 2 == $step ) 139 wp_enqueue_script('imgareaselect'); 140 } 141 142 /** 143 * Set up the enqueue for the CSS files 144 * 145 * @since 2.7 146 */ 147 function css_includes() { 148 $step = $this->step(); 149 150 if ( ( 1 == $step || 3 == $step ) && $this->header_text() ) 151 wp_enqueue_style('farbtastic'); 152 elseif ( 2 == $step ) 153 wp_enqueue_style('imgareaselect'); 154 } 155 156 /** 157 * Check if header text is allowed 158 * 159 * @since 3.0.0 160 */ 161 function header_text() { 162 if ( defined( 'NO_HEADER_TEXT' ) && NO_HEADER_TEXT ) 163 return false; 164 165 return true; 166 } 167 168 /** 169 * Execute custom header modification. 170 * 171 * @since 2.6.0 172 */ 173 function take_action() { 174 if ( ! current_user_can('edit_theme_options') ) 175 return; 176 177 if ( empty( $_POST ) ) 178 return; 179 180 $this->updated = true; 181 182 if ( isset( $_POST['resetheader'] ) ) { 183 check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); 184 remove_theme_mod( 'header_image' ); 185 return; 186 } 187 188 if ( isset( $_POST['resettext'] ) ) { 189 check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); 190 remove_theme_mod('header_textcolor'); 191 return; 192 } 193 194 if ( isset( $_POST['removeheader'] ) ) { 195 check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); 196 set_theme_mod( 'header_image', 'remove-header' ); 197 return; 198 } 199 200 if ( isset( $_POST['text-color'] ) ) { 201 check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); 202 $_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] ); 203 if ( 'blank' == $_POST['text-color'] ) { 204 set_theme_mod( 'header_textcolor', 'blank' ); 205 } else { 206 $color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['text-color']); 207 if ( strlen($color) == 6 || strlen($color) == 3 ) 208 set_theme_mod('header_textcolor', $color); 209 } 210 } 211 212 if ( isset( $_POST['default-header'] ) ) { 213 check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' ); 214 if ( 'random-default-image' == $_POST['default-header'] ) { 215 set_theme_mod( 'header_image', 'random-default-image' ); 216 } elseif ( 'random-uploaded-image' == $_POST['default-header'] ) { 217 set_theme_mod( 'header_image', 'random-uploaded-image' ); 218 } else { 219 $this->process_default_headers(); 220 $uploaded = get_uploaded_header_images(); 221 if ( isset( $uploaded[$_POST['default-header']] ) ) 222 set_theme_mod( 'header_image', esc_url( $uploaded[$_POST['default-header']]['url'] ) ); 223 elseif ( isset( $this->default_headers[$_POST['default-header']] ) ) 224 set_theme_mod( 'header_image', esc_url( $this->default_headers[$_POST['default-header']]['url'] ) ); 225 } 226 } 227 } 228 229 /** 230 * Process the default headers 231 * 232 * @since 3.0.0 233 */ 234 function process_default_headers() { 235 global $_wp_default_headers; 236 237 if ( !empty($this->headers) ) 238 return; 239 240 if ( !isset($_wp_default_headers) ) 241 return; 242 243 $this->default_headers = $_wp_default_headers; 244 foreach ( array_keys($this->default_headers) as $header ) { 245 $this->default_headers[$header]['url'] = sprintf( $this->default_headers[$header]['url'], get_template_directory_uri(), get_stylesheet_directory_uri() ); 246 $this->default_headers[$header]['thumbnail_url'] = sprintf( $this->default_headers[$header]['thumbnail_url'], get_template_directory_uri(), get_stylesheet_directory_uri() ); 247 } 248 249 } 250 251 /** 252 * Display UI for selecting one of several default headers. 253 * 254 * Show the random image option if this theme has multiple header images. 255 * Random image option is on by default if no header has been set. 256 * 257 * @since 3.0.0 258 */ 259 function show_header_selector( $type = 'default' ) { 260 if ( 'default' == $type ) { 261 $headers = $this->default_headers; 262 } else { 263 $headers = get_uploaded_header_images(); 264 $type = 'uploaded'; 265 } 266 267 if ( 1 < count( $headers ) ) { 268 echo '<div class="random-header">'; 269 echo '<label><input name="default-header" type="radio" value="random-' . $type . '-image"' . checked( is_random_header_image( $type ), true, false ) . ' />'; 270 echo __( '<strong>Random:</strong> Show a different image on each page.' ); 271 echo '</label>'; 272 echo '</div>'; 273 } 274 275 echo '<div class="available-headers">'; 276 foreach ( $headers as $header_key => $header ) { 277 $header_thumbnail = $header['thumbnail_url']; 278 $header_url = $header['url']; 279 $header_desc = empty( $header['description'] ) ? '' : $header['description']; 280 echo '<div class="default-header">'; 281 echo '<label><input name="default-header" type="radio" value="' . esc_attr( $header_key ) . '" ' . checked( $header_url, get_theme_mod( 'header_image' ), false ) . ' />'; 282 $width = ''; 283 if ( !empty( $header['uploaded'] ) ) 284 $width = ' width="230"'; 285 echo '<img src="' . $header_thumbnail . '" alt="' . esc_attr( $header_desc ) .'" title="' . esc_attr( $header_desc ) . '"' . $width . ' /></label>'; 286 echo '</div>'; 287 } 288 echo '<div class="clear"></div></div>'; 289 } 290 291 /** 292 * Execute Javascript depending on step. 293 * 294 * @since 2.1.0 295 */ 296 function js() { 297 $step = $this->step(); 298 if ( ( 1 == $step || 3 == $step ) && $this->header_text() ) 299 $this->js_1(); 300 elseif ( 2 == $step ) 301 $this->js_2(); 302 } 303 304 /** 305 * Display Javascript based on Step 1 and 3. 306 * 307 * @since 2.6.0 308 */ 309 function js_1() { ?> 310 <script type="text/javascript"> 311 /* <![CDATA[ */ 312 var text_objects = ['#name', '#desc', '#text-color-row']; 313 var farbtastic; 314 var default_color = '#<?php echo HEADER_TEXTCOLOR; ?>'; 315 var old_color = null; 316 317 function pickColor(color) { 318 jQuery('#name').css('color', color); 319 jQuery('#desc').css('color', color); 320 jQuery('#text-color').val(color); 321 farbtastic.setColor(color); 322 } 323 324 function toggle_text(s) { 325 if (jQuery(s).attr('id') == 'showtext' && jQuery('#text-color').val() != 'blank') 326 return; 327 328 if (jQuery(s).attr('id') == 'hidetext' && jQuery('#text-color').val() == 'blank') 329 return; 330 331 if (jQuery('#text-color').val() == 'blank') { 332 //Show text 333 if (old_color == '#blank') 334 old_color = default_color; 335 336 jQuery( text_objects.toString() ).show(); 337 jQuery('#text-color').val(old_color); 338 jQuery('#name').css('color', old_color); 339 jQuery('#desc').css('color', old_color); 340 pickColor(old_color); 341 } else { 342 //Hide text 343 jQuery( text_objects.toString() ).hide(); 344 old_color = jQuery('#text-color').val(); 345 jQuery('#text-color').val('blank'); 346 } 347 } 348 349 jQuery(document).ready(function() { 350 jQuery('#pickcolor').click(function() { 351 jQuery('#color-picker').show(); 352 }); 353 354 jQuery('input[name="hidetext"]').click(function() { 355 toggle_text(this); 356 }); 357 358 jQuery('#defaultcolor').click(function() { 359 pickColor(default_color); 360 jQuery('#text-color').val(default_color) 361 }); 362 363 jQuery('#text-color').keyup(function() { 364 var _hex = jQuery('#text-color').val(); 365 var hex = _hex; 366 if ( hex[0] != '#' ) 367 hex = '#' + hex; 368 hex = hex.replace(/[^#a-fA-F0-9]+/, ''); 369 if ( hex != _hex ) 370 jQuery('#text-color').val(hex); 371 if ( hex.length == 4 || hex.length == 7 ) 372 pickColor( hex ); 373 }); 374 375 jQuery(document).mousedown(function(){ 376 jQuery('#color-picker').each( function() { 377 var display = jQuery(this).css('display'); 378 if (display == 'block') 379 jQuery(this).fadeOut(2); 380 }); 381 }); 382 383 farbtastic = jQuery.farbtastic('#color-picker', function(color) { pickColor(color); }); 384 <?php if ( $color = get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) ) { ?> 385 pickColor('#<?php echo $color; ?>'); 386 <?php } ?> 387 388 <?php if ( 'blank' == get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) || '' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || ! $this->header_text() ) { ?> 389 toggle_text(); 390 <?php } ?> 391 }); 392 /* ]]> */ 393 </script> 394 <?php 395 } 396 397 /** 398 * Display Javascript based on Step 2. 399 * 400 * @since 2.6.0 401 */ 402 function js_2() { ?> 403 <script type="text/javascript"> 404 /* <![CDATA[ */ 405 function onEndCrop( coords ) { 406 jQuery( '#x1' ).val(coords.x); 407 jQuery( '#y1' ).val(coords.y); 408 jQuery( '#width' ).val(coords.w); 409 jQuery( '#height' ).val(coords.h); 410 } 411 412 jQuery(document).ready(function() { 413 var xinit = <?php echo HEADER_IMAGE_WIDTH; ?>; 414 var yinit = <?php echo HEADER_IMAGE_HEIGHT; ?>; 415 var ratio = xinit / yinit; 416 var ximg = jQuery('img#upload').width(); 417 var yimg = jQuery('img#upload').height(); 418 419 if ( yimg < yinit || ximg < xinit ) { 420 if ( ximg / yimg > ratio ) { 421 yinit = yimg; 422 xinit = yinit * ratio; 423 } else { 424 xinit = ximg; 425 yinit = xinit / ratio; 426 } 427 } 428 429 jQuery('img#upload').imgAreaSelect({ 430 handles: true, 431 keys: true, 432 aspectRatio: xinit + ':' + yinit, 433 show: true, 434 x1: 0, 435 y1: 0, 436 x2: xinit, 437 y2: yinit, 438 maxHeight: <?php echo HEADER_IMAGE_HEIGHT; ?>, 439 maxWidth: <?php echo HEADER_IMAGE_WIDTH; ?>, 440 onInit: function () { 441 jQuery('#width').val(xinit); 442 jQuery('#height').val(yinit); 443 }, 444 onSelectChange: function(img, c) { 445 jQuery('#x1').val(c.x1); 446 jQuery('#y1').val(c.y1); 447 jQuery('#width').val(c.width); 448 jQuery('#height').val(c.height); 449 } 450 }); 451 }); 452 /* ]]> */ 453 </script> 454 <?php 455 } 456 457 /** 458 * Display first step of custom header image page. 459 * 460 * @since 2.1.0 461 */ 462 function step_1() { 463 $this->process_default_headers(); 464 ?> 465 466 <div class="wrap"> 467 <?php screen_icon(); ?> 468 <h2><?php _e('Custom Header'); ?></h2> 469 470 <?php if ( ! empty( $this->updated ) ) { ?> 471 <div id="message" class="updated"> 472 <p><?php printf( __( 'Header updated. <a href="%s">Visit your site</a> to see how it looks.' ), home_url( '/' ) ); ?></p> 473 </div> 474 <?php } ?> 475 476 <table class="form-table"> 477 <tbody> 478 479 480 <tr valign="top"> 481 <th scope="row"><?php _e( 'Preview' ); ?></th> 482 <td > 483 <?php if ( $this->admin_image_div_callback ) { 484 call_user_func( $this->admin_image_div_callback ); 485 } else { 486 ?> 487 <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() ) ?>);"> 488 <?php 489 if ( 'blank' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || '' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || ! $this->header_text() ) 490 $style = ' style="display:none;"'; 491 else 492 $style = ' style="color:#' . get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) . ';"'; 493 ?> 494 <h1><a id="name"<?php echo $style; ?> onclick="return false;" href="<?php bloginfo('url'); ?>"><?php bloginfo( 'name' ); ?></a></h1> 495 <div id="desc"<?php echo $style; ?>><?php bloginfo( 'description' ); ?></div> 496 </div> 497 <?php } ?> 498 </td> 499 </tr> 500 <?php if ( current_theme_supports( 'custom-header-uploads' ) ) : ?> 501 <tr valign="top"> 502 <th scope="row"><?php _e( 'Upload Image' ); ?></th> 503 <td> 504 <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 /> 505 <?php printf( __( 'Images of exactly <strong>%1$d × %2$d pixels</strong> will be used as-is.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?></p> 506 <form enctype="multipart/form-data" id="upload-form" method="post" action="<?php echo esc_attr( add_query_arg( 'step', 2 ) ) ?>"> 507 <p> 508 <label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br /> 509 <input type="file" id="upload" name="import" /> 510 <input type="hidden" name="action" value="save" /> 511 <?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ) ?> 512 <?php submit_button( __( 'Upload' ), 'button', 'submit', false ); ?> 513 </p> 514 </form> 515 </td> 516 </tr> 517 <?php endif; ?> 518 </tbody> 519 </table> 520 521 <form method="post" action="<?php echo esc_attr( add_query_arg( 'step', 1 ) ) ?>"> 522 <table class="form-table"> 523 <tbody> 524 <?php if ( get_uploaded_header_images() ) : ?> 525 <tr valign="top"> 526 <th scope="row"><?php _e( 'Uploaded Images' ); ?></th> 527 <td> 528 <p><?php _e( 'You can choose one of your previously uploaded headers, or show a random one.' ) ?></p> 529 <?php 530 $this->show_header_selector( 'uploaded' ); 531 ?> 532 </td> 533 </tr> 534 <?php endif; 535 if ( ! empty( $this->default_headers ) ) : ?> 536 <tr valign="top"> 537 <th scope="row"><?php _e( 'Default Images' ); ?></th> 538 <td> 539 <?php if ( current_theme_supports( 'custom-header-uploads' ) ) : ?> 540 <p><?php _e( 'If you don‘t want to upload your own image, you can use one of these cool headers, or show a random one.' ) ?></p> 541 <?php else: ?> 542 <p><?php _e( 'You can use one of these cool headers or show a random one on each page.' ) ?></p> 543 <?php endif; ?> 544 <?php 545 $this->show_header_selector( 'default' ); 546 ?> 547 </td> 548 </tr> 549 <?php endif; 550 if ( get_header_image() ) : ?> 551 <tr valign="top"> 552 <th scope="row"><?php _e( 'Remove Image' ); ?></th> 553 <td> 554 <p><?php _e( 'This will remove the header image. You will not be able to restore any customizations.' ) ?></p> 555 <?php submit_button( __( 'Remove Header Image' ), 'button', 'removeheader', false ); ?> 556 </td> 557 </tr> 558 <?php endif; 559 560 if ( defined( 'HEADER_IMAGE' ) && '' != HEADER_IMAGE ) : ?> 561 <tr valign="top"> 562 <th scope="row"><?php _e( 'Reset Image' ); ?></th> 563 <td> 564 <p><?php _e( 'This will restore the original header image. You will not be able to restore any customizations.' ) ?></p> 565 <?php submit_button( __( 'Restore Original Header Image' ), 'button', 'resetheader', false ); ?> 566 </td> 567 </tr> 568 <?php endif; ?> 569 </tbody> 570 </table> 571 572 <?php if ( $this->header_text() ) : ?> 573 <table class="form-table"> 574 <tbody> 575 <tr valign="top" class="hide-if-no-js"> 576 <th scope="row"><?php _e( 'Display Text' ); ?></th> 577 <td> 578 <p> 579 <?php $hidetext = get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ); ?> 580 <label><input type="radio" value="1" name="hidetext" id="hidetext"<?php checked( ( 'blank' == $hidetext || empty( $hidetext ) ) ? true : false ); ?> /> <?php _e( 'No' ); ?></label> 581 <label><input type="radio" value="0" name="hidetext" id="showtext"<?php checked( ( 'blank' == $hidetext || empty( $hidetext ) ) ? false : true ); ?> /> <?php _e( 'Yes' ); ?></label> 582 </p> 583 </td> 584 </tr> 585 586 <tr valign="top" id="text-color-row"> 587 <th scope="row"><?php _e( 'Text Color' ); ?></th> 588 <td> 589 <p> 590 <input type="text" name="text-color" id="text-color" value="#<?php echo esc_attr( get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) ); ?>" /> 591 <span class="description hide-if-js"><?php _e( 'If you want to hide header text, add <strong>#blank</strong> as text color.' );?></span> 592 <input type="button" class="button hide-if-no-js" value="<?php esc_attr_e( 'Select a Color' ); ?>" id="pickcolor" /> 593 </p> 594 <div id="color-picker" style="z-index: 100; background:#eee; border:1px solid #ccc; position:absolute; display:none;"></div> 595 </td> 596 </tr> 597 598 <?php if ( defined('HEADER_TEXTCOLOR') && get_theme_mod('header_textcolor') ) { ?> 599 <tr valign="top"> 600 <th scope="row"><?php _e('Reset Text Color'); ?></th> 601 <td> 602 <p><?php _e( 'This will restore the original header text. You will not be able to restore any customizations.' ) ?></p> 603 <?php submit_button( __( 'Restore Original Header Text' ), 'button', 'resettext', false ); ?> 604 </td> 605 </tr> 606 <?php } ?> 607 608 </tbody> 609 </table> 610 <?php endif; 611 612 do_action( 'custom_header_options' ); 613 614 wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?> 615 616 <?php submit_button( null, 'primary', 'save-header-options' ); ?> 617 </form> 618 </div> 619 620 <?php } 621 622 /** 623 * Display second step of custom header image page. 624 * 625 * @since 2.1.0 626 */ 627 function step_2() { 628 check_admin_referer('custom-header-upload', '_wpnonce-custom-header-upload'); 629 if ( ! current_theme_supports( 'custom-header-uploads' ) ) 630 wp_die( 'Cheatin’ uh?' ); 631 632 $overrides = array('test_form' => false); 633 $file = wp_handle_upload($_FILES['import'], $overrides); 634 635 if ( isset($file['error']) ) 636 wp_die( $file['error'], __( 'Image Upload Error' ) ); 637 638 $url = $file['url']; 639 $type = $file['type']; 640 $file = $file['file']; 641 $filename = basename($file); 642 643 // Construct the object array 644 $object = array( 645 'post_title' => $filename, 646 'post_content' => $url, 647 'post_mime_type' => $type, 648 'guid' => $url, 649 'context' => 'custom-header'); 650 651 // Save the data 652 $id = wp_insert_attachment($object, $file); 653 654 list($width, $height, $type, $attr) = getimagesize( $file ); 655 656 if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) { 657 // Add the meta-data 658 wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); 659 update_post_meta( $id, '_wp_attachment_is_custom_header', get_option('stylesheet' ) ); 660 661 set_theme_mod('header_image', esc_url($url)); 662 do_action('wp_create_file_in_uploads', $file, $id); // For replication 663 return $this->finished(); 664 } elseif ( $width > HEADER_IMAGE_WIDTH ) { 665 $oitar = $width / HEADER_IMAGE_WIDTH; 666 $image = wp_crop_image($file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file)); 667 if ( is_wp_error( $image ) ) 668 wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); 669 670 $image = apply_filters('wp_create_file_in_uploads', $image, $id); // For replication 671 672 $url = str_replace(basename($url), basename($image), $url); 673 $width = $width / $oitar; 674 $height = $height / $oitar; 675 } else { 676 $oitar = 1; 677 } 678 ?> 679 680 <div class="wrap"> 681 <?php screen_icon(); ?> 682 <h2><?php _e( 'Crop Header Image' ); ?></h2> 683 684 <form method="post" action="<?php echo esc_attr(add_query_arg('step', 3)); ?>"> 685 <p class="hide-if-no-js"><?php _e('Choose the part of the image you want to use as your header.'); ?></p> 686 <p class="hide-if-js"><strong><?php _e( 'You need Javascript to choose a part of the image.'); ?></strong></p> 687 688 <div id="crop_image" style="position: relative"> 689 <img src="<?php echo esc_url( $url ); ?>" id="upload" width="<?php echo $width; ?>" height="<?php echo $height; ?>" /> 690 </div> 691 692 <input type="hidden" name="x1" id="x1" value="0"/> 693 <input type="hidden" name="y1" id="y1" value="0"/> 694 <input type="hidden" name="width" id="width" value="<?php echo esc_attr( $width ); ?>"/> 695 <input type="hidden" name="height" id="height" value="<?php echo esc_attr( $height ); ?>"/> 696 <input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $id ); ?>" /> 697 <input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" /> 698 <?php wp_nonce_field( 'custom-header-crop-image' ) ?> 699 700 <?php submit_button( __( 'Crop and Publish' ) ); ?> 701 </p> 702 </form> 703 </div> 704 <?php 705 } 706 707 /** 708 * Display third step of custom header image page. 709 * 710 * @since 2.1.0 711 */ 712 function step_3() { 713 check_admin_referer('custom-header-crop-image'); 714 if ( ! current_theme_supports( 'custom-header-uploads' ) ) 715 wp_die( 'Cheatin’ uh?' ); 716 717 if ( $_POST['oitar'] > 1 ) { 718 $_POST['x1'] = $_POST['x1'] * $_POST['oitar']; 719 $_POST['y1'] = $_POST['y1'] * $_POST['oitar']; 720 $_POST['width'] = $_POST['width'] * $_POST['oitar']; 721 $_POST['height'] = $_POST['height'] * $_POST['oitar']; 722 } 723 724 $original = get_attached_file( $_POST['attachment_id'] ); 725 726 $cropped = wp_crop_image($_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT); 727 if ( is_wp_error( $cropped ) ) 728 wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); 729 730 $cropped = apply_filters('wp_create_file_in_uploads', $cropped, $_POST['attachment_id']); // For replication 731 732 $parent = get_post($_POST['attachment_id']); 733 $parent_url = $parent->guid; 734 $url = str_replace(basename($parent_url), basename($cropped), $parent_url); 735 736 // Construct the object array 737 $object = array( 738 'ID' => $_POST['attachment_id'], 739 'post_title' => basename($cropped), 740 'post_content' => $url, 741 'post_mime_type' => 'image/jpeg', 742 'guid' => $url, 743 'context' => 'custom-header' 744 ); 745 746 // Update the attachment 747 wp_insert_attachment($object, $cropped); 748 wp_update_attachment_metadata( $_POST['attachment_id'], wp_generate_attachment_metadata( $_POST['attachment_id'], $cropped ) ); 749 update_post_meta( $_POST['attachment_id'], '_wp_attachment_is_custom_header', get_option('stylesheet' ) ); 750 751 set_theme_mod('header_image', $url); 752 753 // cleanup 754 $medium = str_replace(basename($original), 'midsize-'.basename($original), $original); 755 @unlink( apply_filters( 'wp_delete_file', $medium ) ); 756 @unlink( apply_filters( 'wp_delete_file', $original ) ); 757 758 return $this->finished(); 759 } 760 761 /** 762 * Display last step of custom header image page. 763 * 764 * @since 2.1.0 765 */ 766 function finished() { 767 $this->updated = true; 768 $this->step_1(); 769 } 770 771 /** 772 * Display the page based on the current step. 773 * 774 * @since 2.1.0 775 */ 776 function admin_page() { 777 if ( ! current_user_can('edit_theme_options') ) 778 wp_die(__('You do not have permission to customize headers.')); 779 $step = $this->step(); 780 if ( 1 == $step ) 781 $this->step_1(); 782 elseif ( 2 == $step ) 783 $this->step_2(); 784 elseif ( 3 == $step ) 785 $this->step_3(); 786 } 787 788 } 789 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Wed Jun 1 08:30:02 2011 |
Cross-referenced by PHPXref 0.7 Provided by Yoast and awesome WordPress Hosting |