it-swarm-ko.tech

여러 개의 Custom_Background가 가능합니까?

여러 "사용자 정의 배경"관리 페이지를 만들 수 있습니까? 내가 지금하고있는 사이트는 2 개의 다른 영역에서 2 개의 다른 배경을 필요로합니다. 저는 고객에게 컬러/이미지/선택 - 반복 등의 측면에서 두 가지 배경에 대해 동일한 경험을 제공하는 것을 정말 좋아할 것입니다.

3
Amit

안녕 @ 아 미트 :

대답은 "예, 가능합니다."후속 질문은 "정말로하고 싶니?"

나는 당신이 요구하고있는 것을하기 위해 플러그인을 만들 수 있는지를 보는 것이 재미있을 것이라고 생각했기 때문에 그것이 가능한지보기로 결심했다. 물론 작동하도록 만들 수는 있었지만 플러그인 코드가 WordPress의 기존 코드와 너무 밀접하게 연결되어 있어야 핵심 업데이트가 쉽게 중단 될 수 있습니다.

이 코드는 모양섹션의 "특수 배경"에 새 메뉴 항목을 작성하여 모든 관리 콘솔 측면을 처리합니다.무엇입니까? 하지 않는 것은 실제로 배경을 사용하는 방법을 제공합니다. 그것은 단계 2의 플러그인이며 /wp-includes/themes.php에있는 많은 함수를 후킹해야하며 솔직히 그 코드를 작성할 기회가 있을지 모르겠습니다.

나가 그것을하기없이 멈춘 이유는 나가 특별한 배경이 어디에 보여야하고 정규병이 보여줄 것입니다위한 필요 조건을 몰랐다이다. 내가 선택한 페이지 및/또는 URL 경로에 대해 아마 가정합니까?

그럼에도 불구하고 플러그인의 코드 (여기에서 다운로드 할 수있는 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');
}

솔직히 말해서 사전에 설명하기에는 너무 많은 코드이지만 구체적인 질문에 기꺼이 답해 드리겠습니다.

2
MikeSchinkel

기술적으로 가능한 (그래서 WordPress 소스를 확장하기 위해),하지만 기본적으로 아닙니다. 그래서 나는 답을 줄 것이다. 빌드 - 인 배경 테마 기능은 단일 그래픽 만 기본값으로 사용됩니다.

그러나 당신이 쓰고있는 "2 개의 다른 영역"에 대해 조금 더 설명하면, 옆에 제안 할 좋은 부분이있을 수 있습니다.

편집 : MikeSchinkel을 강조 표시합니다. 플러그인은 WordPress 소스를 확장합니다.

0
hakre