web-dev-qa-db-fra.com

Multiple Custom_Background, est-ce possible?

Est-il possible de créer plusieurs pages d'administration "d'arrière-plan personnalisé"? Un site que je suis en train de créer a maintenant besoin de deux arrière-plans différents dans deux domaines différents. J'aimerais vraiment offrir à mon client la même expérience pour les deux arrière-plans en termes de couleur/image/sélection-répétition, etc. Des idées?

3
Amit

Bonjour @ Amit:

La réponse est "Oui, c'est possible." La question suivante est "Voulez-vous vraiment?"

Je pensais que ce serait amusant de voir si je pouvais construire un plugin pour faire ce que vous demandez, alors j'ai décidé de voir si c'était possible. Bien sûr, j’ai réussi à le faire fonctionner, mais je crains que le code de plug-in que j’ai écrit doive être si étroitement associé au code existant dans WordPress qu’il puisse facilement tomber en panne sur une mise à jour principale.

Ce code gère tout le côté console d'administration en créant un nouvel élément de menu dans la section Apparence appelée "Arrière-plan spécial." Ce qu'il ne contient pas ne fournit aucun moyen d’utiliser réellement l’arrière-plan; c'est la phase deux du plugin et il faudra ajouter beaucoup de fonctions dans /wp-includes/themes.php et franchement, je ne sais pas si j'aurai l'occasion d'écrire ce code.

La raison pour laquelle j’ai arrêté sans le faire est que je ne connaissais pas les conditions requises pour indiquer l’arrière-plan spécial et le répertoire normal. Je suppose que peut-être pour les pages sélectionnées et/ou les chemins d’URL?

Néanmoins, voici si le code du plugin (que vous pouvez également télécharger à partir de 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');
}

Franchement, c’est trop de code pour expliquer de manière proactive, mais je me ferai un plaisir de répondre à des questions précises.

2
MikeSchinkel

Techniquement c'est possible (donc étendre la source wordpress), mais pas par défaut. Donc, je donnerais la réponse à non. La fonctionnalité de thème d'arrière-plan intégrée ne s'applique qu'à un seul graphique par défaut.

Mais si vous en décrivez un peu plus sur les "2 domaines différents" sur lesquels vous écrivez, il y aura peut-être quelque chose de sympa à suggérer à côté de cela.

Edit: Mettez en surbrillance pour MikeSchinkel. Les plugins étendent la source wordpress.

0
hakre