2007-05-01 19:46:55 +02:00
< ? php
2008-08-16 09:27:34 +02:00
/**
* The custom header image script .
*
* @ package WordPress
* @ subpackage Administration
*/
/**
* The custom header image class .
*
* @ since unknown
* @ package WordPress
* @ subpackage Administration
*/
2007-05-01 19:46:55 +02:00
class Custom_Image_Header {
2008-08-16 09:27:34 +02:00
/**
* Callback for administration header .
*
* @ var callback
* @ since unknown
* @ access private
*/
2007-05-01 19:46:55 +02:00
var $admin_header_callback ;
2008-08-16 09:27:34 +02:00
/**
* PHP4 Constructor - Register administration header callback .
*
* @ since unknown
* @ param callback $admin_header_callback
* @ return Custom_Image_Header
*/
2007-05-01 19:46:55 +02:00
function Custom_Image_Header ( $admin_header_callback ) {
$this -> admin_header_callback = $admin_header_callback ;
}
2008-08-16 09:27:34 +02:00
/**
* Setup the hooks for the Custom Header admin page .
*
* @ since unknown
*/
2007-05-01 19:46:55 +02:00
function init () {
2009-02-22 08:43:15 +01:00
$page = add_theme_page ( __ ( 'Custom Header' ), __ ( 'Custom Header' ), 'edit_themes' , 'custom-header' , array ( & $this , 'admin_page' ));
2007-05-01 19:46:55 +02:00
add_action ( " admin_print_scripts- $page " , array ( & $this , 'js_includes' ));
2008-08-28 19:42:21 +02:00
add_action ( " admin_print_styles- $page " , array ( & $this , 'css_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-08-16 09:27:34 +02:00
/**
* Get the current step .
*
* @ since unknown
*
* @ return int Current step
*/
2008-04-16 22:58:03 +02:00
function step () {
2008-08-16 09:27:34 +02:00
if ( ! isset ( $_GET [ 'step' ] ) )
return 1 ;
$step = ( int ) $_GET [ 'step' ];
2008-04-16 22:58:03 +02:00
if ( $step < 1 || 3 < $step )
$step = 1 ;
2008-08-16 09:27:34 +02:00
2008-04-16 22:58:03 +02:00
return $step ;
2007-05-01 19:46:55 +02:00
}
2008-08-16 09:27:34 +02:00
/**
* Setup the enqueue for the JavaScript files .
*
* @ since unknown
*/
2008-04-16 22:58:03 +02:00
function js_includes () {
$step = $this -> step ();
2008-08-16 09:27:34 +02:00
2008-04-16 22:58:03 +02:00
if ( 1 == $step )
2008-08-28 19:42:21 +02:00
wp_enqueue_script ( 'farbtastic' );
2008-08-09 07:36:14 +02:00
elseif ( 2 == $step )
2009-03-27 17:45:55 +01:00
wp_enqueue_script ( 'jcrop' );
2008-04-16 22:58:03 +02:00
}
2007-05-01 19:46:55 +02:00
2008-08-28 19:42:21 +02:00
/**
* Setup the enqueue for the CSS files
*
* @ since 2.7
*/
function css_includes () {
$step = $this -> step ();
2009-03-27 17:45:55 +01:00
if ( 1 == $step )
2008-08-28 19:42:21 +02:00
wp_enqueue_style ( 'farbtastic' );
2009-03-27 17:45:55 +01:00
elseif ( 2 == $step )
wp_enqueue_style ( 'jcrop' );
2008-08-28 19:42:21 +02:00
}
2008-08-16 09:27:34 +02:00
/**
* Execute custom header modification .
*
* @ since unknown
*/
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-08-16 09:27:34 +02:00
/**
* Execute Javascript depending on step .
*
* @ since unknown
*/
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-08-16 09:27:34 +02:00
/**
* Display Javascript based on Step 1.
*
* @ since unknown
*/
2008-04-16 22:58:03 +02:00
function js_1 () { ?>
< script type = " text/javascript " >
2008-08-28 19:42:21 +02:00
var buttons = [ '#name' , '#desc' , '#pickcolor' , '#defaultcolor' ];
var farbtastic ;
2007-05-01 19:46:55 +02:00
function pickColor ( color ) {
2008-08-28 19:42:21 +02:00
jQuery ( '#name' ) . css ( 'color' , color );
jQuery ( '#desc' ) . css ( 'color' , color );
jQuery ( '#textcolor' ) . val ( color );
farbtastic . setColor ( color );
2007-05-01 19:46:55 +02:00
}
2008-12-09 19:03:31 +01:00
2008-08-28 19:42:21 +02:00
jQuery ( document ) . ready ( function () {
jQuery ( '#pickcolor' ) . click ( function () {
jQuery ( '#colorPickerDiv' ) . show ();
});
2008-12-09 19:03:31 +01:00
2008-08-28 19:42:21 +02:00
jQuery ( '#hidetext' ) . click ( function () {
toggle_text ();
});
2008-12-09 19:03:31 +01:00
2008-08-28 19:42:21 +02:00
farbtastic = jQuery . farbtastic ( '#colorPickerDiv' , function ( color ) { pickColor ( color ); });
pickColor ( '#<?php echo get_theme_mod(' header_textcolor ', HEADER_TEXTCOLOR); ?>' );
2008-12-09 19:03:31 +01:00
2008-08-28 19:42:21 +02:00
< ? php if ( 'blank' == get_theme_mod ( 'header_textcolor' , HEADER_TEXTCOLOR ) ) { ?>
toggle_text ();
< ? php } ?>
});
2008-12-09 19:03:31 +01:00
2008-08-28 19:42:21 +02:00
jQuery ( document ) . mousedown ( function (){
// Make the picker disappear, since we're using it in an independant div
hide_picker ();
});
2007-05-01 19:46:55 +02:00
function colorDefault () {
2008-04-16 22:58:03 +02:00
pickColor ( '#<?php echo HEADER_TEXTCOLOR; ?>' );
2007-05-01 19:46:55 +02:00
}
2008-08-28 19:42:21 +02:00
function hide_picker ( what ) {
var update = false ;
jQuery ( '#colorPickerDiv' ) . each ( function (){
var id = jQuery ( this ) . attr ( 'id' );
if ( id == what ) {
return ;
}
var display = jQuery ( this ) . css ( 'display' );
if ( display == 'block' ) {
jQuery ( this ) . fadeOut ( 2 );
}
});
2007-05-01 19:46:55 +02:00
}
2008-08-28 19:42:21 +02:00
function toggle_text ( force ) {
if ( jQuery ( '#textcolor' ) . val () == 'blank' ) {
//Show text
jQuery ( buttons . toString () ) . show ();
jQuery ( '#textcolor' ) . val ( '<?php echo HEADER_TEXTCOLOR; ?>' );
jQuery ( '#hidetext' ) . val ( '<?php _e(' Hide Text '); ?>' );
}
else {
//Hide text
jQuery ( buttons . toString () ) . hide ();
jQuery ( '#textcolor' ) . val ( 'blank' );
jQuery ( '#hidetext' ) . val ( '<?php _e(' Show Text '); ?>' );
}
2007-05-01 19:46:55 +02:00
}
2008-08-28 19:42:21 +02:00
2007-05-01 19:46:55 +02:00
</ script >
< ? php
}
2008-08-16 09:27:34 +02:00
/**
* Display Javascript based on Step 2.
*
* @ since unknown
*/
2008-04-16 22:58:03 +02:00
function js_2 () { ?>
< script type = " text/javascript " >
2009-03-27 17:45:55 +01:00
function onEndCrop ( coords ) {
jQuery ( '#x1' ) . val ( coords . x );
jQuery ( '#y1' ) . val ( coords . y );
2008-08-28 19:42:21 +02:00
jQuery ( '#x2' ) . val ( coords . x2 );
jQuery ( '#y2' ) . val ( coords . y2 );
2009-03-27 17:45:55 +01:00
jQuery ( '#width' ) . val ( coords . w );
jQuery ( '#height' ) . val ( coords . h );
2008-04-16 22:58:03 +02:00
}
// with a supplied ratio
2008-08-28 19:42:21 +02:00
jQuery ( document ) . ready ( function () {
var xinit = < ? php echo HEADER_IMAGE_WIDTH ; ?> ;
var yinit = < ? php echo HEADER_IMAGE_HEIGHT ; ?> ;
var ratio = xinit / yinit ;
var ximg = jQuery ( '#upload' ) . width ();
var yimg = jQuery ( '#upload' ) . height ();
if ( yimg < yinit || ximg < xinit ) {
if ( ximg / yimg > ratio ) {
yinit = yimg ;
xinit = yinit * ratio ;
} else {
xinit = ximg ;
yinit = xinit / ratio ;
2008-04-16 22:58:03 +02:00
}
}
2009-03-27 17:45:55 +01:00
2009-04-03 20:18:47 +02:00
jQuery ( '#upload' ) . Jcrop ({
2009-03-27 17:45:55 +01:00
aspectRatio : ratio ,
setSelect : [ 0 , 0 , xinit , yinit ],
onSelect : onEndCrop
});
2008-08-28 19:42:21 +02:00
});
2008-04-16 22:58:03 +02:00
</ script >
< ? php
}
2008-08-16 09:27:34 +02:00
/**
* Display first step of custom header image page .
*
* @ since unknown
*/
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 " >
2008-11-27 20:24:46 +01:00
< ? php screen_icon (); ?>
2007-05-01 19:46:55 +02:00
< 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') ?> " >
2009-04-03 02:52:50 +02:00
< input type = " button " class = " button " value = " <?php _e('Hide Text'); ?> " onclick = " hide_text() " id = " hidetext " />
< input type = " button " class = " button " value = " <?php _e('Select a Text Color'); ?> " id = " pickcolor " />< input type = " button " class = " 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' ) ?>
2009-04-03 02:52:50 +02:00
< input type = " hidden " name = " textcolor " id = " textcolor " value = " #<?php attribute_escape(header_textcolor()) ?> " />< input name = " submit " type = " submit " class = " button " value = " <?php _e('Save Changes'); ?> " /></ form >
2007-05-01 19:46:55 +02:00
< ? php } ?>
2008-08-28 19:42:21 +02:00
< div id = " colorPickerDiv " style = " z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none; " > </ div >
2007-05-01 19:46:55 +02:00
</ 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' ); ?>
2009-04-03 02:52:50 +02:00
< input type = " submit " class = " button " name = " resetheader " value = " <?php _e('Restore Original Header'); ?> " />
2007-05-01 19:46:55 +02:00
</ form >
</ div >
< ? php endif ;
}
2008-08-16 09:27:34 +02:00
/**
* Display second step of custom header image page .
*
* @ since unknown
*/
2007-05-01 19:46:55 +02:00
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
}
2008-08-16 09:27:34 +02:00
/**
* Display third step of custom header image page .
*
* @ since unknown
*/
2007-05-01 19:46:55 +02:00
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 ();
}
2008-08-16 09:27:34 +02:00
/**
* Display last step of custom header image page .
*
* @ since unknown
*/
2007-05-01 19:46:55 +02:00
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
}
2008-08-16 09:27:34 +02:00
/**
* Display the page based on the current step .
*
* @ since unknown
*/
2007-05-01 19:46:55 +02:00
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 ();
}
}
2008-11-27 20:24:46 +01:00
?>