it-swarm.dev

Více možností Custom_Background, je to možné?

Je možné vytvořit více administračních stránek "vlastního pozadí"? Místo, které dělám, nyní potřebuje 2 různé pozadí ve 2 různých oblastech, opravdu bych rád dal svému klientovi stejné zkušenosti pro obě prostředí z hlediska barev/image/select-repeat atd. Jakékoliv nápady?

3
Amit

Ahoj @ Amit:

Odpověď zní "Ano, je to možné." Následující otázka je "Opravdu chcete?"

Myslel jsem, že by bylo zábavné zjistit, jestli bych mohl vytvořit plugin, abych dělal to, o co žádáš, a tak jsem se rozhodl zjistit, zda je to možné. Samozřejmě, že jsem byl schopen, aby to fungovalo, ale obávám se, že plugin kód jsem napsal, musí být tak pevně spojený s existujícím kódem v WordPress, že by se mohlo snadno rozbít na základní aktualizaci.

Tento kód zpracovává veškerou administrační stránku věcí vytvořením nové položky menu v sekci Vzhled nazvané "Speciální pozadí." Co to neznamená je poskytnout jakýkoli způsob, jak skutečně použít pozadí; to je druhá fáze pluginu a bude vyžadovat zaháknutí mnoha funkcí v /wp-includes/themes.php a upřímně řečeno, nevím, jestli dostanu šanci napsat tento kód.

Důvod, proč jsem přestal bez toho, abych to udělal, jsem neznal požadavky na to, kde by se mělo zvláštní pozadí ukázat a kde by ten pravidelný ukázal. Předpokládám, že možná pro vybrané stránky a/nebo cesty URL?

Nicméně, pokud kód pro plugin (který si můžete také stáhnout z 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');
}

Upřímně řečeno, je to příliš mnoho kódu, abych to proaktivně vysvětlil, ale rád odpovím na konkrétní otázky.

2
MikeSchinkel

Technicky je to možné (takže zdroj wordpressu lze rozšířit), ale ve výchozím nastavení ne. Tak bych dal odpověď na ne. Funkce vnořeného motivu pozadí je pro jednu grafiku pouze výchozí.

Pokud ale popisujete trochu více o "dvou různých oblastech", o kterých píšete, může být něco, co by se mohlo navrhnout hned vedle tohoto.

Upravit: Zvýrazněte pro MikeSchinkel. Pluginy rozšiřují zdroj wordpress.

0
hakre