it-swarm.asia

Birden fazla Custom_Background, mümkün mü?

Birden fazla "özel arka plan" yönetim sayfası oluşturmak mümkün müdür? Şimdi yaptığım bir site 2 farklı alanda 2 farklı arka plana ihtiyaç duyuyor, müşterime renk/resim/seçim tekrarı gibi her iki arka plan için de aynı deneyimi yaşatmayı çok isterim. Herhangi bir fikir?

3
Amit

Merhaba @ Amit:

Cevap "Evet, mümkün." Takip eden soru "Gerçekten istiyor musun?"

İstediğiniz şeyi yapmak için bir eklenti inşa edip edemeyeceğimi görmenin eğlenceli olacağını düşündüm, bu yüzden mümkün olup olmadığını görmeye karar verdim. Tabii ki çalışmasını sağlayabildim, ancak yazdığım eklenti kodunun WordPress'teki mevcut kodla sıkı bir şekilde birleştirilmesi gerektiğinden korkuyorum.

Bu kod, "Özel Arkaplan." adlı Görünüm bölümünde yeni bir menü öğesi oluşturarak işlerin tüm yönetici konsolu tarafını işler. arka planı gerçekten kullanmak için herhangi bir yol sağlamaktır; bu, eklentinin ikinci aşamasıdır ve /wp-includes/themes.php'daki birçok fonksiyonun takılmasını gerektirir ve açıkçası bu kodu yazma şansım olur mu bilmiyorum.

Bunu yapmadan durmamın nedeni, özel arka planın nerede gösterileceği ve normal olanın nerede gösterileceğinin gerekliliklerini bilmiyordum. Belki seçili sayfalar ve/veya URL yolları için?

Bununla birlikte, burada eklenti için kod (eğer Gist 'ten de indirebilirsiniz):

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

Açıkçası proaktif olarak açıklamak için çok fazla kod ama belirli soruları cevaplamaktan mutlu olurum.

2
MikeSchinkel

Teknik olarak bu mümkündür (böylece wordpress kaynağını genişletmek için), ancak varsayılan olarak değil. Bu yüzden hayır cevabını verirdim. Yerleşik arka plan tema özelliği yalnızca tek bir grafik için varsayılan olacaktır.

Ancak, hakkında yazdığınız "2 farklı alan" hakkında biraz daha fazla bilgi verirseniz, bunun yanında önerebileceğiniz Güzel bir şey olabilir.

Düzenleme: MikeSchinkel için vurgulayın. Eklentiler wordpress kaynağını genişletiyor.

0
hakre