it-swarm.asia

Custom_Background متعددة ، هل من الممكن؟

هل من الممكن إنشاء صفحات إدارة "خلفية مخصصة" متعددة؟ يحتاج الموقع الذي أقوم به الآن إلى خلفيتين مختلفتين في منطقتين مختلفتين ، أحب حقًا أن أعطي لعميلي نفس التجربة لكلتا الخلفية من حيث اللون/الصورة/تحديد تكرار وما إلى ذلك. هل هناك أي أفكار؟

3
Amit

مرحبًا @ Amit:

الجواب هو "نعم ، إنه ممكن." سؤال المتابعة هو "هل ترغب حقًا في ذلك؟"

اعتقدت أنه سيكون من الممتع معرفة ما إذا كان بإمكاني إنشاء مكون إضافي للقيام بما تطلبه ، لذلك قررت معرفة ما إذا كان ذلك ممكنًا. بالطبع كنت قادراً على إنجاحه ، لكن أخشى أن يكون رمز البرنامج المساعد الذي كتبته بحاجة إلى أن يقترن بإحكام بالشفرة الموجودة في WordPress بحيث يمكن كسره بسهولة في أحد التحديثات الأساسية.

يعالج هذا الرمز كل جانب وحدة تحكم المشرف للأشياء من خلال إنشاء عنصر قائمة جديد في قسم المظهر المسمى "الخلفية الخاصة." القيام به هو توفير أي طريقة لاستخدام الخلفية فعليًا ؛ هذه هي المرحلة الثانية من المكوّن الإضافي وستتطلب تثبيت العديد من الوظائف في /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

من الناحية الفنية من الممكن (وذلك لتوسيع مصدر وورد) ، ولكن ليس بشكل افتراضي. لذلك أود أن أجيب على لا. ميزة سمة الخلفية المضمنة هي لرسومات واحدة تكون افتراضية فقط.

ولكن إذا كنت تصف أكثر قليلاً عن "منطقتين مختلفتين" تكتبان عنه ، فقد يكون هناك شيء لطيف توحي به بجوار هذا.

تحرير: تسليط الضوء على MikeSchinkel. الإضافات تمدد مصدر وورد.

0
hakre