Created
August 28, 2010 07:59
-
-
Save mikeschinkel/554874 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: Special Background | |
Plugin URI: http://wordpress.stackexchange.com/questions/972/ | |
Description: Example to show how to add a special background using exiting background admin page in core. | |
Version: 0.1 | |
Author: Mike Schinkel | |
Author URI: http://mikeschinkel.com/custom-wordpress-plugins/ | |
*/ | |
add_filter('admin_menu','add_special_background_menu_item'); | |
function add_special_background_menu_item() { | |
add_theme_page(__('Special Background'), __('Special Background'),'edit_theme_options','special-background','special_background_admin_page'); | |
} | |
add_filter('admin_init','add_js_for_special_background'); | |
function add_js_for_special_background() { | |
global $custom_background; | |
if (is_special_background_page()) { | |
wp_enqueue_script('custom-background'); | |
wp_enqueue_style('farbtastic'); | |
} | |
$hook = 'load-appearance_page_special-background'; | |
add_action($hook, array(&$custom_background, 'admin_load')); | |
add_action($hook, array(&$custom_background, 'take_action'), 49); | |
add_action($hook, array(&$custom_background, 'handle_upload'), 49); | |
} | |
add_filter('theme_mod_background_image', 'theme_mod_special_background_image'); | |
add_filter('theme_mod_background_image_thumb','theme_mod_special_background_image_thumb'); | |
add_filter('theme_mod_background_repeat', 'theme_mod_special_background_repeat'); | |
add_filter('theme_mod_background_position_x', 'theme_mod_special_background_position_x'); | |
add_filter('theme_mod_background_attachment', 'theme_mod_special_background_attachment'); | |
add_filter('theme_mod_background_color', 'theme_mod_special_background_color'); | |
function theme_mod_special_background_image($defaults) { | |
return theme_mod_special_background_image_attrs('image',$defaults); | |
} | |
function theme_mod_special_background_image_thumb($defaults) { | |
return theme_mod_special_background_image_attrs('image_thumb',$defaults); | |
} | |
function theme_mod_special_background_repeat($defaults) { | |
return theme_mod_special_background_image_attrs('repeat',$defaults); | |
} | |
function theme_mod_special_background_position_x($defaults) { | |
return theme_mod_special_background_image_attrs('position_x',$defaults); | |
} | |
function theme_mod_special_background_attachment($defaults) { | |
return theme_mod_special_background_image_attrs('attachment',$defaults); | |
} | |
function theme_mod_special_background_color($defaults) { | |
return theme_mod_special_background_image_attrs('color',$defaults); | |
} | |
function theme_mod_special_background_image_attrs($attr,$defaults) { | |
if (is_special_background_page()) { | |
$mods = get_option( 'mods_' . get_current_theme() ); | |
$defaults = (!empty($mods["special_background_{$attr}"]) ? $mods["special_background_{$attr}"] : ''); | |
} | |
return $defaults; | |
} | |
add_filter('pre_update_option_mods_' . get_current_theme(),'pre_update_option_special_background_image',10,2); | |
function pre_update_option_special_background_image($newvalue, $oldvalue) { | |
static $times_called = 0; | |
if (!empty($_POST) && is_special_background_page()) { | |
if ((isset($_POST['action']) && $_POST['action']=='save') || isset($_POST['reset-background']) || isset($_POST['remove-background'])) { | |
switch ($times_called) { | |
case 0: | |
$newvalue = special_background_image_value_swap('image',$newvalue,$oldvalue); | |
break; | |
case 1: | |
$newvalue = special_background_image_value_swap('image_thumb',$newvalue,$oldvalue); | |
break; | |
} | |
} else { | |
if ($times_called==0 && isset($_POST['background-repeat'])) { | |
$newvalue = special_background_image_value_swap('repeat',$newvalue,$oldvalue); | |
} | |
if ($times_called==1 && isset($_POST['background-position-x'])) { | |
$newvalue = special_background_image_value_swap('position_x',$newvalue,$oldvalue); | |
} | |
if ($times_called==2 && isset($_POST['background-attachment'])) { | |
$newvalue = special_background_image_value_swap('attachment',$newvalue,$oldvalue); | |
} | |
if ($times_called==3 && isset($_POST['background-color'])) { | |
$newvalue = special_background_image_value_swap('color',$newvalue,$oldvalue); | |
} | |
} | |
$times_called++; | |
} | |
return $newvalue; | |
} | |
function special_background_image_value_swap($swap_what,$newvalue,$oldvalue) { | |
$newvalue["special_background_{$swap_what}"] = $newvalue["background_{$swap_what}"]; | |
$newvalue["background_{$swap_what}"] = $oldvalue["background_{$swap_what}"]; | |
return $newvalue; | |
} | |
//add_action('load-appearance_page_custom-background','load_appearance_page_custom_background'); | |
function special_background_admin_page() { | |
global $custom_background; | |
if (is_special_background_page()) { | |
global $parent_file,$submenu_file,$title; | |
$parent_file = 'themes.php'; | |
$submenu_file = 'themes.php?page=special-background'; | |
$title = 'Special Background'; | |
//if (empty($_POST)) { | |
require_once(ABSPATH . 'wp-admin/admin-header.php'); | |
ob_start(); | |
$custom_background->admin_page(); | |
$html = ob_get_clean(); | |
$html = preg_replace('#<h2>([^<]+)</h2>#','<h2>Special Background</h2>',$html); | |
echo $html; | |
include(ABSPATH . 'wp-admin/admin-footer.php'); | |
exit; | |
//} | |
} | |
} | |
function is_special_background_page() { | |
global $pagenow; | |
return ($pagenow=='themes.php' && | |
isset($_GET['page']) && $_GET['page']== 'special-background'); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment