Multiple Custom_Background, este posibil?

27 aug. 2010, 20:39:09
Vizualizări: 1.07K
Voturi: 3

Este posibil să creezi mai multe pagini de administrare "custom background"? Un site pe care îl realizez acum are nevoie de 2 fundaluri diferite în 2 zone diferite, și mi-ar plăcea să ofer clientului aceeași experiență pentru ambele fundaluri în ceea ce privește culoarea/imaginea/selectare-repetare etc. Ai vreo idee?

0
Toate răspunsurile la întrebare 2
14

Salut @Amit:

Răspunsul este "Da, este posibil." Următoarea întrebare este "Chiar vrei să faci asta?"

M-am gândit că ar fi distractiv să văd dacă pot construi un plugin care să facă ceea ce ceri, așa că am decis să verific dacă este posibil. Bineînțeles că am reușit să-l fac să funcționeze, dar mă tem că codul pluginului pe care l-am scris trebuie să fie atât de strâns legat de codul existent în WordPress încât s-ar putea să se defecteze la o actualizare a nucleului.

Acest cod se ocupă de toată partea administrativă prin crearea unui nou element de meniu în secțiunea "Aspect" numit "Fundal Special." Ceea ce nu face este să ofere vreo modalitate de a folosi efectiv fundalul; aceasta este faza a doua a pluginului și va necesita conectarea multor funcții din /wp-includes/themes.php și, sincer să fiu, nu știu dacă voi avea ocazia să scriu acel cod.

Motivul pentru care m-am oprit fără să o fac este că nu știam cerințele pentru unde ar trebui să apară fundalul special și unde ar trebui să apară cel obișnuit. Presupun că poate pentru anumite pagini și/sau căi URL?

Cu toate acestea, iată codul pentru plugin (pe care îl poți descărca și de pe gist):

<?php
/*
Plugin Name: Fundal Special
Plugin URI: http://wordpress.stackexchange.com/questions/972/
Description: Exemplu pentru a arăta cum să adaugi un fundal special folosind pagina de administrare a fundalului din nucleu.
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(__('Fundal Special'), __('Fundal Special'),'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 = 'Fundal Special';
        require_once(ABSPATH . 'wp-admin/admin-header.php');
        ob_start();
        $custom_background->admin_page();
        $html = ob_get_clean();
        $html = preg_replace('#<h2>([^<]+)</h2>#','<h2>Fundal Special</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');
}

Sincer, este prea mult cod pentru a explica proactiv, dar voi fi bucuros să răspund la întrebări specifice.

28 aug. 2010 08:10:05
Comentarii

Sfat: list($var1, $var2) = array($var2, $var1); // schimbă valorile variabilelor $var1 și $var2

hakre hakre
28 aug. 2010 09:18:20

Ăsta este un plugin pe care l-aș încadra cu siguranță într-o clasă.

hakre hakre
28 aug. 2010 09:20:06

@MikeSchinkel: Poți adăuga o mică descriere despre conceptul tău de swap/save? Acele valori de modificare a temei theme_mod_background_image sunt în mod normal folosite de wp core pentru a oferi antetul standard? Ce faci dacă nu există antet în temă? Mă gândesc să creez un obiect fațadă de hook/option în fork-ul meu... actualizat: http://codex.wordpress.org/Theme_Modification_API .

hakre hakre
28 aug. 2010 12:06:22

Te-am fork-uit. http://gist.github.com/554944

hakre hakre
28 aug. 2010 16:11:34

@hakre; mulțumesc pentru pontul legat de swap. Totuși, sunt deja familiarizat cu el. Trebuie să înțelegi că atunci când am scris funcția inițial, era mult mai complicată și am refactorizat-o până la cea actuală, așa că nu m-am gândit inițial că va fi atât de simplistă. De asemenea, nu prea încapsulez lucrurile într-o clasă pe StackExchange pentru că face mai greu de înțeles când toată infrastructura clasei este prezentă (totuși, nu este optim; dacă folosesc o clasă, mai mulți oameni vor fi speriați de ea; dacă nu folosesc o clasă, îi învăț practici mai puțin bune.)

MikeSchinkel MikeSchinkel
28 aug. 2010 17:27:49

@hakre - WordPress stochează header-ul într-o opțiune numită mods_{$theme}; tema mea se numea wp30 deci este mods_wp30. Conține o imagine de fundal, thumbnail și culoare. Eu doar interceptez actualizarea și adaug elementele mele denumite diferit pentru fundalul special, de aici și swap-ul, apoi fac invers la obținerea opțiunii. WordPress nu oferă context în set_theme_mod() ceea ce a făcut acest lucru mult mai dificil decât ar fi trebuit (am solicitat un filtru, poate ai putea să-l susții? http://core.trac.wordpress.org/ticket/14721)

MikeSchinkel MikeSchinkel
28 aug. 2010 17:58:57

@hakre - A trebuit să folosesc ordinea salvării pentru a înțelege ce se salvează, ceea ce este foarte înfricoșător din cauza cât de fragil este; adaugă un lucru în /wp-includes/custom-background.php și totul se strică! Cât despre git, nu îl cunosc și nu sunt pregătit să îl învăț. Înțeleg că fork-ul este un lucru bun în git, dar eu întotdeauna am văzut fork-ul ca pe un lucru rău. Vrei să colaborăm la acest lucru pentru repository-ul de la WordPress.org? Dacă da, trebuie să gestioneze mai multe fundaluri, nu doar unul.

MikeSchinkel MikeSchinkel
28 aug. 2010 18:01:19

@hakre - Tocmai am analizat fork-ul tău. Este cod "curat", dar este atât de abstractizat încât este greu de urmărit. Obisnuiam să codez în acel fel și obisnuiam (literalmente) să predic acel stil de codare în cursurile mele de formare pentru programatorii corporatiști, guvernamentali și militari. Dar de când lucrez cu WordPress am început să apreciez că codarea mai puțin abstractă poate fi de fapt un beneficiu uneori, pentru că este mult mai ușor de înțeles. FWIW.

MikeSchinkel MikeSchinkel
28 aug. 2010 18:25:26

oh, nu atât de abstract. Îmi place doar să am hook-urile legate de aceleași nume. și să configurez variantele la începutul clasei. Am dat peste o mizerie în timp ce refactorizam baza ta, așa că au apărut aceste trei clase care pot părea puțin prea mari. ultima este cuplată cu prima, rutina poate fi înglobată în clasa plugin-ului dar nu am făcut asta încă. Cealaltă clasă a fost ceva cu care mi-a plăcut să mă joc pentru a depăși add_filter / grămada de funcții globale -> o singură funcție globală. deci asta a fost abstract :D. :P Mulțumesc pentru feedback!

hakre hakre
28 aug. 2010 19:01:20

@MikeSchinkel: Încep și eu cu git. Nu am probleme cu forking-ul, cred că e ca și cum ai avea un nou repository. Din ce am auzit, asta funcționează bine cu git, așa că hai să facem un pic de fork. Acest gist este o pasteboard foarte bună. Poți vedea de unde ai luat lucrurile etc. Asta e mișto. --- Nu știu dacă are sens să adaugi mai mult de o imagine de fundal în WP. Poate? Dar cred că problema este că nu este conceput astfel în nucleu, trebuie să fi fost adăugat vreun număr sau cheie pentru a diferenția între fiecare fundal. Probabil e mai simplu să rescrii acel formular și să oferi pagini de administrare.

hakre hakre
28 aug. 2010 19:05:03

@MikeSchinkel: Încearcă înainte să cumperi :D : http://progit.org/book/

hakre hakre
28 aug. 2010 19:25:49

@hakre: Abstractul este relativ. Vrei să vezi abstract? Citește una din cărțile mele despre programare! http://mikeschinkel.com/books/ Îmi place Gist dar nu plănuiesc să lucrez cu Git, cel puțin nu până când WordPress îl adoptă (ceea ce cred că e puțin probabil.) Da, ar avea mult sens să ai mai multe fundaluri; imaginează-ți o revistă online cu 5 secțiuni; câte un fundal pentru fiecare plus pagina principală. Și ori de câte ori este posibil, încerc să lucrez cu ce are WordPress, cerând hook-uri unde am nevoie, în loc să arunc totul și să încep de la zero. Aceasta este doar filosofia mea pentru extinderea WordPress.

MikeSchinkel MikeSchinkel
28 aug. 2010 20:07:15

wow! funcționează uimitor! Sunt fără cuvinte.

Amit Amit
29 aug. 2010 23:18:34

@Amit: Fără cuvinte, dar tot poți să tastezi, nu? :-) Mă bucur că am putut ajuta. Sunt epuizat după asta, am petrecut mult mai mult timp decât mă așteptam când am început să răspund, dar dacă clientul tău are nevoie ca acele fundaluri să fie afișate create, ofer consultanță pe oră... :)

MikeSchinkel MikeSchinkel
30 aug. 2010 00:13:52
Arată celelalte 9 comentarii
5

Tehnic vorbind este posibil (să extindem sursa WordPress), dar nu în mod implicit. Așadar, aș răspunde cu nu. Funcționalitatea implicită de fundal a temei este destinată unei singure imagini grafică în mod prestabilit.

Dar dacă descrii mai detaliat despre "cele 2 zone diferite" la care te referi, s-ar putea să existe ceva interesant de sugerat pe lângă asta.

Editare: Subliniere pentru MikeSchinkel. Plugin-urile extind sursa WordPress.

27 aug. 2010 21:11:10
Comentarii

Ei bine.. Există site-ul principal (cam 20 de secțiuni) și apoi există un sub-site sub una dintre aceste secțiuni care se schimbă pentru acest eveniment special și are nevoie de propriile culori de stil și imagine de fundal.

Teoretic, aș putea spune clientului să încarce o imagine pe "pagina principală" a fiecărei secțiuni și să o numească "cumva", dar îmi place funcționalitatea personalizată a fundalului și poziția semantică în CMS.

Amit Amit
27 aug. 2010 21:17:01

folosești un șablon pentru fiecare secțiune? asta ar putea fi ceva de conectat. Sau de suprascris cu un sub-temă pentru o anumită zonă (care ar scala la două imagini de fundal în total pentru că ai avea două teme, tema părinte și tema copil).

hakre hakre
27 aug. 2010 21:32:28

Voi, cei cu puțină credință! Ar trebui să știți că nu trebuie să spuneți că ceva nu este posibil cu WordPress! ;-)

MikeSchinkel MikeSchinkel
28 aug. 2010 08:10:49

Nu am făcut-o. Adică este o grămadă de PHP pe care trebuie doar să o rearanjezi puțin ca să rezolvi lucrurile :)

hakre hakre
28 aug. 2010 09:14:49

Adevărat. Dar nu ar trebui să descurajezi oamenii; unde există voință, există și cale!

MikeSchinkel MikeSchinkel
30 aug. 2010 00:30:16