質問: 複数のcustom_background、可能ですか。 複数の「カスタム背景」管理ページを作成することは可能ですか?私が今やっているサイトは、2つの異なる分野で2つの異なる背景を必要としています。
回答: こんにちは@ amit:"はい、可能です。"フォローアップの質問は"本当にしますか?"私はあなたが望んでいることをするために私がプラグインを作ることができるかどうか見るのは楽しいだろうと思ったので私はそれが可能であるかどうか見ることにしました。もちろん、私はそれを動かすことができましたが、私が書いたプラグインコードはwordpressの既存のコードと非常に密接に結びついている必要があるので、コアアップデートで壊れる可能性があります。このコードは、appearanceセクションに"特別な背景"という新しいメニュー項目を作成することによって、管理コンソール側のすべての処理を行います。それがしないことは、実際に背景を使う方法を提供することです。それはプラグインのフェーズ2で、/wp-includes/themes.phpの多くの関数をフックすることを必要とし、率直に言ってそのコードを書く機会があるかどうかはわかりません。私がそれをしないでやめた理由は、特別な背景をどこに表示するか、そして通常の背景を表示するかについての要件を知らなかったからです。私はおそらく選択されたページやurlパスのために仮定しますか?それにもかかわらず、ここでプラグインのコードなら(あなたは 要旨 からもダウンロードできます):<?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; } 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'; 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'); } 率直に言ってそれは先を見越して説明するには多すぎるコードですが、私は具体的な質問に答えたいと思います。