it-swarm-id.com

Beberapa Custom_Background, mungkinkah?

Apakah mungkin membuat beberapa halaman administrasi "latar belakang khusus"? Sebuah situs yang saya lakukan sekarang membutuhkan 2 latar belakang yang berbeda di 2 bidang yang berbeda, saya akan sangat senang memberikan klien saya pengalaman yang sama untuk kedua latar belakang dalam hal warna/gambar/pilih-ulangi dll. Ada Gagasan?

3
Amit

Hai @ Amit:

Jawabannya adalah "Ya, itu mungkin." Pertanyaan lanjutannya adalah "Apakah Anda benar-benar ingin?"

Saya pikir akan menyenangkan untuk melihat apakah saya dapat membangun plugin untuk melakukan apa yang Anda minta, jadi saya memutuskan untuk melihat apakah itu mungkin. Tentu saja saya bisa membuatnya bekerja tetapi saya khawatir kode plugin yang saya tulis harus begitu erat dengan kode yang ada di WordPress sehingga mungkin dengan mudah merusak pembaruan inti.

Kode ini menangani semua sisi konsol admin dengan membuat item menu baru di bagian Penampilan yang disebut "Latar Belakang Khusus." Apa yang tidak lakukan adalah menyediakan cara apa pun untuk benar-benar menggunakan latar belakang; itulah tahap kedua dari plugin dan akan membutuhkan banyak fungsi hooking di /wp-includes/themes.php dan terus terang saya tidak tahu apakah saya akan mendapatkan kesempatan untuk menulis kode itu.

Alasan saya berhenti tanpa melakukan itu adalah saya tidak tahu persyaratan di mana latar belakang khusus harus menunjukkan dan di mana yang biasa akan ditampilkan. Saya berasumsi mungkin untuk halaman yang dipilih dan/atau jalur URL?

Meskipun demikian, di sini jika kode untuk plugin (yang juga dapat Anda unduh dari 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');
}

Terus terang itu terlalu banyak kode untuk dijelaskan secara proaktif tetapi saya akan dengan senang hati menjawab pertanyaan spesifik.

2
MikeSchinkel

Secara teknis dimungkinkan (jadi untuk memperpanjang sumber wordpress), tetapi tidak secara default. Jadi saya akan memberikan jawaban untuk tidak. Fitur latar belakang tema bawaan adalah untuk satu grafik saja yang menjadi standar.

Tetapi jika Anda menjelaskan sedikit lebih banyak tentang "2 bidang berbeda" yang Anda tulis, mungkin ada sesuatu yang baik untuk disarankan di sebelah ini.

Sunting: Sorot untuk MikeSchinkel. Plugin memperluas sumber wordpress.

0
hakre