2007-05-01 19:46:55 +02:00
< ? php
class Custom_Image_Header {
var $admin_header_callback ;
function Custom_Image_Header ( $admin_header_callback ) {
$this -> admin_header_callback = $admin_header_callback ;
}
function init () {
$page = add_theme_page ( __ ( 'Custom Image Header' ), __ ( 'Custom Image Header' ), 'edit_themes' , 'custom-header' , array ( & $this , 'admin_page' ));
add_action ( " admin_print_scripts- $page " , array ( & $this , 'js_includes' ));
2008-04-16 22:58:03 +02:00
add_action ( " admin_head- $page " , array ( & $this , 'take_action' ), 50 );
2007-05-01 19:46:55 +02:00
add_action ( " admin_head- $page " , array ( & $this , 'js' ), 50 );
add_action ( " admin_head- $page " , $this -> admin_header_callback , 51 );
}
2008-04-16 22:58:03 +02:00
function step () {
$step = ( int ) @ $_GET [ 'step' ];
if ( $step < 1 || 3 < $step )
$step = 1 ;
return $step ;
2007-05-01 19:46:55 +02:00
}
2008-04-16 22:58:03 +02:00
function js_includes () {
$step = $this -> step ();
if ( 1 == $step )
wp_enqueue_script ( 'colorpicker' );
elseif ( 2 == $step )
wp_enqueue_script ( 'cropper' );
}
2007-05-01 19:46:55 +02:00
2008-04-16 22:58:03 +02:00
function take_action () {
2007-05-01 19:46:55 +02:00
if ( isset ( $_POST [ 'textcolor' ] ) ) {
2007-05-04 19:52:22 +02:00
check_admin_referer ( 'custom-header' );
2007-05-01 19:46:55 +02:00
if ( 'blank' == $_POST [ 'textcolor' ] ) {
set_theme_mod ( 'header_textcolor' , 'blank' );
} else {
$color = preg_replace ( '/[^0-9a-fA-F]/' , '' , $_POST [ 'textcolor' ]);
if ( strlen ( $color ) == 6 || strlen ( $color ) == 3 )
set_theme_mod ( 'header_textcolor' , $color );
}
}
2007-05-04 19:52:22 +02:00
if ( isset ( $_POST [ 'resetheader' ]) ) {
check_admin_referer ( 'custom-header' );
2007-05-01 19:46:55 +02:00
remove_theme_mods ();
2007-05-04 19:52:22 +02:00
}
2007-05-01 19:46:55 +02:00
}
2008-04-16 22:58:03 +02:00
function js () {
$step = $this -> step ();
if ( 1 == $step )
$this -> js_1 ();
elseif ( 2 == $step )
$this -> js_2 ();
}
2007-05-01 19:46:55 +02:00
2008-04-16 22:58:03 +02:00
function js_1 () { ?>
< script type = " text/javascript " >
2007-05-01 19:46:55 +02:00
var cp = new ColorPicker ();
function pickColor ( color ) {
$ ( 'name' ) . style . color = color ;
$ ( 'desc' ) . style . color = color ;
$ ( 'textcolor' ) . value = color ;
}
function PopupWindow_hidePopup ( magicword ) {
if ( magicword != 'prettyplease' )
return false ;
if ( this . divName != null ) {
if ( this . use_gebi ) {
document . getElementById ( this . divName ) . style . visibility = " hidden " ;
}
else if ( this . use_css ) {
document . all [ this . divName ] . style . visibility = " hidden " ;
}
else if ( this . use_layers ) {
document . layers [ this . divName ] . visibility = " hidden " ;
}
}
else {
if ( this . popupWindow && ! this . popupWindow . closed ) {
this . popupWindow . close ();
this . popupWindow = null ;
}
}
return false ;
}
function colorSelect ( t , p ) {
if ( cp . p == p && document . getElementById ( cp . divName ) . style . visibility != " hidden " ) {
cp . hidePopup ( 'prettyplease' );
} else {
cp . p = p ;
cp . select ( t , p );
}
}
function colorDefault () {
2008-04-16 22:58:03 +02:00
pickColor ( '#<?php echo HEADER_TEXTCOLOR; ?>' );
2007-05-01 19:46:55 +02:00
}
function hide_text () {
$ ( 'name' ) . style . display = 'none' ;
$ ( 'desc' ) . style . display = 'none' ;
$ ( 'pickcolor' ) . style . display = 'none' ;
$ ( 'defaultcolor' ) . style . display = 'none' ;
$ ( 'textcolor' ) . value = 'blank' ;
$ ( 'hidetext' ) . value = '<?php _e(' Show Text '); ?>' ;
// $('hidetext').onclick = 'show_text()';
Event . observe ( $ ( 'hidetext' ), 'click' , show_text );
}
function show_text () {
$ ( 'name' ) . style . display = 'block' ;
$ ( 'desc' ) . style . display = 'block' ;
$ ( 'pickcolor' ) . style . display = 'inline' ;
$ ( 'defaultcolor' ) . style . display = 'inline' ;
$ ( 'textcolor' ) . value = '<?php echo HEADER_TEXTCOLOR; ?>' ;
$ ( 'hidetext' ) . value = '<?php _e(' Hide Text '); ?>' ;
Event . stopObserving ( $ ( 'hidetext' ), 'click' , show_text );
Event . observe ( $ ( 'hidetext' ), 'click' , hide_text );
}
< ? php if ( 'blank' == get_theme_mod ( 'header_textcolor' , HEADER_TEXTCOLOR ) ) { ?>
Event . observe ( window , 'load' , hide_text );
< ? php } ?>
</ script >
< ? php
}
2008-04-16 22:58:03 +02:00
function js_2 () { ?>
< script type = " text/javascript " >
function onEndCrop ( coords , dimensions ) {
$ ( 'x1' ) . value = coords . x1 ;
$ ( 'y1' ) . value = coords . y1 ;
$ ( 'x2' ) . value = coords . x2 ;
$ ( 'y2' ) . value = coords . y2 ;
$ ( 'width' ) . value = dimensions . width ;
$ ( 'height' ) . value = dimensions . height ;
}
// with a supplied ratio
Event . observe (
window ,
'load' ,
function () {
var xinit = < ? php echo HEADER_IMAGE_WIDTH ; ?> ;
var yinit = < ? php echo HEADER_IMAGE_HEIGHT ; ?> ;
var ratio = xinit / yinit ;
var ximg = $ ( 'upload' ) . width ;
var yimg = $ ( 'upload' ) . height ;
if ( yimg < yinit || ximg < xinit ) {
if ( ximg / yimg > ratio ) {
yinit = yimg ;
xinit = yinit * ratio ;
} else {
xinit = ximg ;
yinit = xinit / ratio ;
}
}
new Cropper . Img (
'upload' ,
{
ratioDim : { x : xinit , y : yinit },
displayOnInit : true ,
onEndCrop : onEndCrop
}
)
}
);
</ script >
< ? php
}
2007-05-01 19:46:55 +02:00
function step_1 () {
if ( $_GET [ 'updated' ] ) { ?>
< div id = " message " class = " updated fade " >
< p >< ? php _e ( 'Header updated.' ) ?> </p>
</ div >
< ? php } ?>
< div class = " wrap " >
< h2 >< ? php _e ( 'Your Header Image' ); ?> </h2>
< p >< ? php _e ( 'This is your header image. You can change the text color or upload and crop a new image.' ); ?> </p>
2007-07-10 06:38:27 +02:00
< div id = " headimg " style = " background-image: url(<?php clean_url(header_image()) ?>); " >
2007-05-01 19:46:55 +02:00
< h1 >< a onclick = " return false; " href = " <?php bloginfo('url'); ?> " title = " <?php bloginfo('name'); ?> " id = " name " >< ? php bloginfo ( 'name' ); ?> </a></h1>
< div id = " desc " >< ? php bloginfo ( 'description' ); ?> </div>
</ div >
< ? php if ( ! defined ( 'NO_HEADER_TEXT' ) ) { ?>
2008-05-27 19:46:01 +02:00
< form method = " post " action = " <?php echo admin_url('themes.php?page=custom-header&updated=true') ?> " >
2007-05-01 19:46:55 +02:00
< input type = " button " value = " <?php _e('Hide Text'); ?> " onclick = " hide_text() " id = " hidetext " />
< input type = " button " value = " <?php _e('Select a Text Color'); ?> " onclick = " colorSelect( $ ('textcolor'), 'pickcolor') " id = " pickcolor " />< input type = " button " value = " <?php _e('Use Original Color'); ?> " onclick = " colorDefault() " id = " defaultcolor " />
2007-05-04 19:52:22 +02:00
< ? php wp_nonce_field ( 'custom-header' ) ?>
2008-02-20 20:30:55 +01:00
< input type = " hidden " name = " textcolor " id = " textcolor " value = " #<?php attribute_escape(header_textcolor()) ?> " />< input name = " submit " type = " submit " value = " <?php _e('Save Changes'); ?> " /></ form >
2007-05-01 19:46:55 +02:00
< ? php } ?>
< div id = " colorPickerDiv " style = " z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;visibility:hidden; " > </ div >
</ div >
< div class = " wrap " >
< h2 >< ? php _e ( 'Upload New Header Image' ); ?> </h2><p><?php _e('Here you can upload a custom header image to be shown at the top of your blog instead of the default one. On the next screen you will be able to crop the image.'); ?></p>
< p >< ? php printf ( __ ( 'Images of exactly <strong>%1$d x %2$d pixels</strong> will be used as-is.' ), HEADER_IMAGE_WIDTH , HEADER_IMAGE_HEIGHT ); ?> </p>
< form enctype = " multipart/form-data " id = " uploadForm " method = " POST " action = " <?php echo attribute_escape(add_query_arg('step', 2)) ?> " style = " margin: auto; width: 50%; " >
< label for = " upload " >< ? php _e ( 'Choose an image from your computer:' ); ?> </label><br /><input type="file" id="upload" name="import" />
< input type = " hidden " name = " action " value = " save " />
2007-05-04 19:52:22 +02:00
< ? php wp_nonce_field ( 'custom-header' ) ?>
2007-05-01 19:46:55 +02:00
< p class = " submit " >
2008-02-20 20:30:55 +01:00
< input type = " submit " value = " <?php _e('Upload'); ?> " />
2007-05-01 19:46:55 +02:00
</ p >
</ form >
</ div >
< ? php if ( get_theme_mod ( 'header_image' ) || get_theme_mod ( 'header_textcolor' ) ) : ?>
< div class = " wrap " >
< h2 >< ? php _e ( 'Reset Header Image and Color' ); ?> </h2>
< p >< ? php _e ( 'This will restore the original header image and color. You will not be able to retrieve any customizations.' ) ?> </p>
< form method = " post " action = " <?php echo attribute_escape(add_query_arg('step', 1)) ?> " >
2007-05-15 18:47:15 +02:00
< ? php wp_nonce_field ( 'custom-header' ); ?>
2007-05-01 19:46:55 +02:00
< input type = " submit " name = " resetheader " value = " <?php _e('Restore Original Header'); ?> " />
</ form >
</ div >
< ? php endif ;
}
function step_2 () {
2007-05-04 19:52:22 +02:00
check_admin_referer ( 'custom-header' );
2007-05-01 19:46:55 +02:00
$overrides = array ( 'test_form' => false );
$file = wp_handle_upload ( $_FILES [ 'import' ], $overrides );
if ( isset ( $file [ 'error' ]) )
die ( $file [ 'error' ] );
$url = $file [ 'url' ];
2008-02-26 22:07:15 +01:00
$type = $file [ 'type' ];
2007-05-01 19:46:55 +02:00
$file = $file [ 'file' ];
$filename = basename ( $file );
// Construct the object array
$object = array (
'post_title' => $filename ,
'post_content' => $url ,
2008-02-26 22:07:15 +01:00
'post_mime_type' => $type ,
2007-05-01 19:46:55 +02:00
'guid' => $url );
// Save the data
$id = wp_insert_attachment ( $object , $file );
list ( $width , $height , $type , $attr ) = getimagesize ( $file );
if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) {
2008-02-26 22:07:15 +01:00
// Add the meta-data
wp_update_attachment_metadata ( $id , wp_generate_attachment_metadata ( $id , $file ) );
2007-05-04 19:52:22 +02:00
set_theme_mod ( 'header_image' , clean_url ( $url ));
2008-01-04 20:36:34 +01:00
do_action ( 'wp_create_file_in_uploads' , $file , $id ); // For replication
2007-05-01 19:46:55 +02:00
return $this -> finished ();
} elseif ( $width > HEADER_IMAGE_WIDTH ) {
$oitar = $width / HEADER_IMAGE_WIDTH ;
$image = wp_crop_image ( $file , 0 , 0 , $width , $height , HEADER_IMAGE_WIDTH , $height / $oitar , false , str_replace ( basename ( $file ), 'midsize-' . basename ( $file ), $file ));
$image = apply_filters ( 'wp_create_file_in_uploads' , $image , $id ); // For replication
$url = str_replace ( basename ( $url ), basename ( $image ), $url );
$width = $width / $oitar ;
$height = $height / $oitar ;
} else {
$oitar = 1 ;
}
?>
< div class = " wrap " >
< form method = " POST " action = " <?php echo attribute_escape(add_query_arg('step', 3)) ?> " >
< p >< ? php _e ( 'Choose the part of the image you want to use as your header.' ); ?> </p>
2008-04-16 22:58:03 +02:00
< div id = " testWrap " style = " position: relative " >
2007-05-01 19:46:55 +02:00
< img src = " <?php echo $url ; ?> " id = " upload " width = " <?php echo $width ; ?> " height = " <?php echo $height ; ?> " />
</ div >
< p class = " submit " >
< input type = " hidden " name = " x1 " id = " x1 " />
< input type = " hidden " name = " y1 " id = " y1 " />
< input type = " hidden " name = " x2 " id = " x2 " />
< input type = " hidden " name = " y2 " id = " y2 " />
< input type = " hidden " name = " width " id = " width " />
< input type = " hidden " name = " height " id = " height " />
< input type = " hidden " name = " attachment_id " id = " attachment_id " value = " <?php echo $id ; ?> " />
< input type = " hidden " name = " oitar " id = " oitar " value = " <?php echo $oitar ; ?> " />
2007-05-04 19:52:22 +02:00
< ? php wp_nonce_field ( 'custom-header' ) ?>
2008-02-20 20:30:55 +01:00
< input type = " submit " value = " <?php _e('Crop Header'); ?> " />
2007-05-01 19:46:55 +02:00
</ p >
</ form >
</ div >
< ? php
}
function step_3 () {
2007-05-04 19:52:22 +02:00
check_admin_referer ( 'custom-header' );
2007-05-01 19:46:55 +02:00
if ( $_POST [ 'oitar' ] > 1 ) {
$_POST [ 'x1' ] = $_POST [ 'x1' ] * $_POST [ 'oitar' ];
$_POST [ 'y1' ] = $_POST [ 'y1' ] * $_POST [ 'oitar' ];
$_POST [ 'width' ] = $_POST [ 'width' ] * $_POST [ 'oitar' ];
$_POST [ 'height' ] = $_POST [ 'height' ] * $_POST [ 'oitar' ];
}
2008-02-26 22:07:15 +01:00
$original = get_attached_file ( $_POST [ 'attachment_id' ] );
2007-05-01 19:46:55 +02:00
2008-02-26 22:07:15 +01:00
$cropped = wp_crop_image ( $_POST [ 'attachment_id' ], $_POST [ 'x1' ], $_POST [ 'y1' ], $_POST [ 'width' ], $_POST [ 'height' ], HEADER_IMAGE_WIDTH , HEADER_IMAGE_HEIGHT );
$cropped = apply_filters ( 'wp_create_file_in_uploads' , $cropped , $_POST [ 'attachment_id' ]); // For replication
2007-05-01 19:46:55 +02:00
2008-02-26 22:07:15 +01:00
$parent = get_post ( $_POST [ 'attachment_id' ]);
2007-05-01 19:46:55 +02:00
$parent_url = $parent -> guid ;
2008-02-26 22:07:15 +01:00
$url = str_replace ( basename ( $parent_url ), basename ( $cropped ), $parent_url );
// Construct the object array
$object = array (
'ID' => $_POST [ 'attachment_id' ],
'post_title' => basename ( $cropped ),
'post_content' => $url ,
'post_mime_type' => 'image/jpeg' ,
'guid' => $url
);
2007-05-01 19:46:55 +02:00
2008-02-26 22:07:15 +01:00
// Update the attachment
wp_insert_attachment ( $object , $cropped );
wp_update_attachment_metadata ( $_POST [ 'attachment_id' ], wp_generate_attachment_metadata ( $_POST [ 'attachment_id' ], $cropped ) );
2007-05-01 19:46:55 +02:00
set_theme_mod ( 'header_image' , $url );
// cleanup
2008-02-26 22:07:15 +01:00
$medium = str_replace ( basename ( $original ), 'midsize-' . basename ( $original ), $original );
2007-05-01 19:46:55 +02:00
@ unlink ( apply_filters ( 'wp_delete_file' , $medium ) );
2008-02-26 22:07:15 +01:00
@ unlink ( apply_filters ( 'wp_delete_file' , $original ) );
2007-05-01 19:46:55 +02:00
return $this -> finished ();
}
function finished () {
?>
< div class = " wrap " >
< h2 >< ? php _e ( 'Header complete!' ); ?> </h2>
< p >< ? php _e ( 'Visit your site and you should see the new header now.' ); ?> </p>
</ div >
< ? php
}
function admin_page () {
2008-04-16 22:58:03 +02:00
$step = $this -> step ();
if ( 1 == $step )
2007-05-01 19:46:55 +02:00
$this -> step_1 ();
2008-04-16 22:58:03 +02:00
elseif ( 2 == $step )
2007-05-01 19:46:55 +02:00
$this -> step_2 ();
2008-04-16 22:58:03 +02:00
elseif ( 3 == $step )
2007-05-01 19:46:55 +02:00
$this -> step_3 ();
}
}
?>