amit
  • 0
Учитель

Несколько Custom_Background, возможно ли это?

  • 0

Можно ли создать несколько страниц администрирования с «настраиваемым фоном»? Сайт, который я сейчас делаю, требует 2 разных фона в 2 разных областях, мне бы очень хотелось дать моему клиенту одинаковый опыт для обоих фонов с точки зрения цвета/изображения/выбора-повторения и т. д. Есть идеи?

Share
  1. Привет @Амит:

    Ответ: «Да, это возможно». Последующий вопрос: «Вы действительно этого хотите?»

    Я подумал, что было бы забавно посмотреть, смогу ли я создать плагин для выполнения того, о чем вы просите, поэтому я решил посмотреть, возможно ли это. Конечно, мне удалось заставить его работать, но я боюсь, что код плагина, который я написал, должен быть настолько тесно связан с существующим кодом в WordPress, что он может легко сломаться при обновлении ядра.

    Этот код обрабатывает все аспекты консоли администратора, создавая новый пункт меню в разделе « Внешний вид » под названием «Особый фон». Чего он не делает, так это не дает никакого способа использовать фон; это вторая фаза плагина и потребует подключения многих функций, /wp-includes/themes.php и, честно говоря, я не знаю, будет ли у меня возможность написать этот код.

    Причина, по которой я остановился, не сделав этого, заключается в том, что я не знал требований к тому, где должен отображаться специальный фон, а где — обычный. Я полагаю, может быть, для выбранных страниц и/или URL-адресов?

    Тем не менее, здесь, если код для плагина (который вы также можете скачать из gist ):

    <?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');
    }
    

    Честно говоря, это слишком много кода, чтобы объяснять его заранее, но я буду рад ответить на конкретные вопросы.

    • 0
  2. Технически это возможно (чтобы расширить исходный код WordPress), но не по умолчанию. Так что я бы дал ответ нет. Встроенная функция фоновой темы предназначена только для одной графики по умолчанию.

    Но если вы немного подробнее расскажете о «двух разных областях», о которых пишете, то рядом с этим может быть что-то хорошее, что можно было бы предложить.

    Редактировать: выделить для MikeSchinkel. Плагины расширяют исходный код WordPress.

    • 0

Оставить ответ

You must login to add an answer.