it-swarm.asia

تنظيم الكود في ملف وورد بريس الخاص بك.

كلما زادت التخصيصات التي أجريتها على WordPress كلما بدأت بالتفكير فيما إذا كان ينبغي علي تنظيم هذا الملف أو تقسيمه.

بشكل أكثر تحديدًا ، إذا كان لدي مجموعة من الوظائف المخصصة التي تنطبق فقط على منطقة المشرف وغيرها التي تنطبق فقط على موقعي العام على الويب ، هل هناك أي سبب لإدراج جميع وظائف المشرف في ملفهم الخاص أو تجميعهم معًا؟

هل يؤدي تقسيمها إلى ملفات منفصلة أو تجميعها معًا إلى تسريع موقع ويب WordPress أو هل يقوم WordPress/PHP بتخطي الوظائف التي لها بادئة رمز is_admin تلقائيًا؟

ما هي أفضل طريقة للتعامل مع ملف الوظائف الكبيرة (يبلغ طول الخط 1370 خطًا).

91
NetConstructor.com

إذا كنت تصل إلى النقطة التي تبدأ فيها الشفرة في functions.php في السمة الخاصة بك ، فستقول بالتأكيد إنك على استعداد للنظر في تقسيمها إلى ملفات متعددة. أنا أميل إلى فعل ذلك تقريبًا بالطبيعة الثانية في هذه المرحلة.

استخدم تضمين الملفات في ملف functions.php الخاص بالنسق

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

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

<?php 
/*
 * functions.php
 * 
 */
require_once( __DIR__ . '/includes/null-meta-compare.php');
require_once( __DIR__ . '/includes/older-examples.php');
require_once( __DIR__ . '/includes/wp-admin-menu-classes.php');
require_once( __DIR__ . '/includes/admin-menu-function-examples.php');

// WA: Adding a Taxonomy Filter to Admin List for a Custom Post Type?
// http://wordpress.stackexchange.com/questions/578/
require_once( __DIR__ . '/includes/cpt-filtering-in-admin.php'); 
require_once( __DIR__ . '/includes/category-fields.php');
require_once( __DIR__ . '/includes/post-list-shortcode.php');
require_once( __DIR__ . '/includes/car-type-urls.php');
require_once( __DIR__ . '/includes/buffer-all.php');
require_once( __DIR__ . '/includes/get-page-selector.php');

// http://wordpress.stackexchange.com/questions/907/
require_once( __DIR__ . '/includes/top-5-posts-per-category.php'); 

// http://wordpress.stackexchange.com/questions/951/
require_once( __DIR__ . '/includes/alternate-category-metabox.php');  

// http://lists.automattic.com/pipermail/wp-hackers/2010-August/034384.html
require_once( __DIR__ . '/includes/remove-status.php');  

// http://wordpress.stackexchange.com/questions/1027/removing-the-your-backup-folder-might-be-visible-to-the-public-message-generate
require_once( __DIR__ . '/includes/301-redirects.php');  

أو إنشاء الإضافات

خيار آخر هو أن تبدأ تجميع التعليمات البرمجية الخاصة بك حسب الوظيفة وإنشاء الإضافات الخاصة بك. بالنسبة لي ، أبدأ الترميز في ملف functions.php الخاص بالموضوع وبحلول الوقت الذي أحصل فيه على التعليمات البرمجية ، قمت بنقل معظم التعليمات البرمجية الخاصة بي إلى الإضافات.

ومع ذلك ، لا يوجد أداء كبير يستفيد من PHP Code Organization

من ناحية أخرى ، فإن هيكلة ملفاتكPHP هي 99 ٪ حول إنشاء النظام وقابلية الصيانة و 1 ٪ عن الأداء ، إذا كان ذلك (تنظيم ملفات .js و .css التي يطلقها المستعرض عبر HTTP هي حالة مختلفة تمامًا وتحتوي على ملفات ضخمة الآثار المترتبة على الأداء.) ولكن كيف تنظم رمز PHP على الخادم إلى حد كبير لا يهم من منظور الأداء.

وتنظيم الكود هو التفضيل الشخصي

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

117
MikeSchinkel

أحب استخدام وظيفة للملفات الموجودة داخل مجلد. هذا النهج يجعل من السهل إضافة ميزات جديدة عند إضافة ملفات جديدة. لكنني أكتب دائمًا في الفصل أو مع مساحات الأسماء - أعطيها مزيدًا من التحكم في مساحة الاسم للوظائف والأسلوب وما إلى ذلك.

أدناه مثال صغير ؛ ut أيضا useage مع الاتفاق حول الفئة * .php

public function __construct() {

    $this->load_classes();
}

/**
 * Returns array of features, also
 * Scans the plugins subfolder "/classes"
 *
 * @since   0.1
 * @return  void
 */
protected function load_classes() {

    // load all files with the pattern class-*.php from the directory classes
    foreach( glob( dirname( __FILE__ ) . '/classes/class-*.php' ) as $class )
        require_once $class;

}

في المظاهر ، أستخدم غالبًا سيناريو آخر. أقوم بتعريف وظيفة ملف externel في معرف الدعم ، انظر المثال. هذا مفيد إذا كنت ستمكن من تعطيل تنشيط ملف externel بسهولة. أستخدم الدالة WP core require_if_theme_supports() ويتم تحميلها فقط ، إذا كان معرف الدعم نشطًا. في المثال التالي ، قمت بتعريف هذا المعرف المدعوم في السطر قبل تحميل الملف.

    /**
     * Add support for Theme Customizer
     * 
     * @since  09/06/2012
     */
    add_theme_support( 'documentation_customizer', array( 'all' ) );
    // Include the theme customizer for options of theme options, if theme supported
    require_if_theme_supports( 
        'documentation_customizer',
        get_template_directory() . '/inc/theme-customize.php'
    );

يمكنك رؤية المزيد من هذا في repo لهذا الموضوع .

5
bueltge

فيما يتعلق بتقسيمها ، في لوحة الغلايات الخاصة بي ، استخدم وظيفة مخصصة للبحث عن مجلد يسمى الوظائف في دليل السمة ، إذا لم يكن هناك ، فإنه ينشئها. ثم يقوم بإنشاء مجموعة من جميع ملفات .php التي يعثر عليها في هذا المجلد (إن وجد) ويقوم بتشغيل () ؛ على كل واحد منهم.

وبهذه الطريقة ، في كل مرة أحتاج فيها إلى كتابة بعض الوظائف الجديدة ، أود فقط إضافة ملف PHPإلى مجلد الوظائف ، ولا داعي للقلق بشأن ترميزه في الموقع.

<?php
/* 
FUNCTIONS for automatically including php documents from the functions folder.
*/
//if running on php4, make a scandir functions
if (!function_exists('scandir')) {
  function scandir($directory, $sorting_order = 0) {
    $dh = opendir($directory);
    while (false !== ($filename = readdir($dh))) {
      $files[] = $filename;
    }
    if ($sorting_order == 0) {
      sort($files);
    } else {
      rsort($files);
    }
    return ($files);
  }
}
/*
* this function returns the path to the funtions folder.
* If the folder does not exist, it creates it.
*/
function get_function_directory_extension($template_url = FALSE) {
  //get template url if not passed
  if (!$template_url)$template_url = get_bloginfo('template_directory');


  //replace slashes with dashes for explode
  $template_url_no_slash = str_replace('/', '.', $template_url);

  //create array from URL
  $template_url_array = explode('.', $template_url_no_slash);

  //--splice array

  //Calculate offset(we only need the last three levels)
  //We need to do this to get the proper directory, not the one passed by the server, as scandir doesn't work when aliases get involved.
  $offset = count($template_url_array) - 3;

  //splice array, only keeping back to the root WP install folder (where wp-config.php lives, where the front end runs from)
  $template_url_array = array_splice($template_url_array, $offset, 3);
  //put back togther as string
  $template_url_return_string = implode('/', $template_url_array);
  fb::log($template_url_return_string, 'Template'); //firephp

  //creates current working directory with template extention and functions directory    
  //if admin, change out of admin folder before storing working dir, then change back again.
  if (is_admin()) {
    $admin_directory = getcwd();
    chdir("..");
    $current_working_directory = getcwd();
    chdir($admin_directory);
  } else {
    $current_working_directory = getcwd();
  }
  fb::log($current_working_directory, 'Directory'); //firephp

  //alternate method is chdir method doesn't work on your server (some windows servers might not like it)
  //if (is_admin()) $current_working_directory = str_replace('/wp-admin','',$current_working_directory);

  $function_folder = $current_working_directory . '/' . $template_url_return_string . '/functions';


  if (!is_dir($function_folder)) mkdir($function_folder); //make folder, if it doesn't already exist (lazy, but useful....ish)
  //return path
  return $function_folder;

}

//removed array elements that do not have extension .php
function only_php_files($scan_dir_list = false) {
  if (!$scan_dir_list || !is_array($scan_dir_list)) return false; //if element not given, or not array, return out of function.
  foreach ($scan_dir_list as $key => $value) {
    if (!strpos($value, '.php')) {

      unset($scan_dir_list[$key]);
    }
  }
  return $scan_dir_list;
}
//runs the functions to create function folder, select it,
//scan it, filter only PHP docs then include them in functions

add_action('wp_head', fetch_php_docs_from_functions_folder(), 1);
function fetch_php_docs_from_functions_folder() {

  //get function directory
  $functions_dir = get_function_directory_extension();
  //scan directory, and strip non-php docs
  $all_php_docs = only_php_files(scandir($functions_dir));

  //include php docs
  if (is_array($all_php_docs)) {
    foreach ($all_php_docs as $include) {
      include($functions_dir . '/' . $include);
    }
  }

}
5
Mild Fuzz

أدير موقعًا يحتوي على حوالي 50 نوعًا فريدًا من الصفحات المخصصة بلغات مختلفة من الخادم عبر تثبيت شبكة. جنبا إلى جنب مع طن من الإضافات.

نحن حيث أجبر على تقسيم كل شيء في وقت ما. ملف وظائف مع 20-30k خطوط من التعليمات البرمجية ليست مضحكة على الإطلاق.

قررنا إكمال refactor جميع التعليمات البرمجية من أجل إدارة codebase أفضل. بنية سمة Wordpress الافتراضية جيدة للمواقع الصغيرة ، ولكن ليس للمواقع الكبيرة.

وظائفنا الجديدة. تحتوي فقط على ما هو ضروري لبدء الموقع ، ولكن لا شيء ينتمي إلى صفحة محددة.

تخطيط النسق الذي نستخدمه الآن يشبه نمط تصميم MCV ، ولكن بأسلوب الترميز الإجرائي.

على سبيل المثال لدينا صفحة الأعضاء:

page-member.php . مسؤولة عن تهيئة الصفحة. استدعاء وظائف اياكس الصحيحة أو ما شابه ذلك. يمكن أن يكون ملائمًا للجزء المتحكم في نمط MCV.

وظائف - member.php . يحتوي على جميع الوظائف المتعلقة بهذه الصفحة. يتم تضمين هذا أيضًا في صفحات serveral الأخرى التي تحتاج إلى وظائف لأعضائنا.

content-member.php . تستعد البيانات من أجل HTML يمكن أن تكون مكافئة للنموذج في MCV.

layout-member.php . جزء HTML.

بعد قيامنا بهذه التغييرات ، انخفض وقت التطوير بسهولة بنسبة 50٪ ، والآن يواجه مالك المنتج مشكلة في إعطائنا مهام جديدة. :)

4
Patrik Grinsvall

من الملف التابع للوظائف features.php:

    require_once( get_stylesheet_directory() . '/inc/custom.php' );
3
Brad Dalton

في jobs.php ، الطريقة الأكثر أناقة لاستدعاء الملف المطلوب هي:

require_once loc_template ('/ inc/jobs/shortcodes.php') ؛

0
Imperative Ideas

قمت بدمج @ kiser / و @ mikeschinkel .

لدي كل تخصيصاتي لموضوعي في مجلد /includes وداخل هذا المجلد ، تم تقسيم كل شيء إلى مجلدات فرعية.

أريد فقط /includes/admin ومحتوياته الفرعية ليتم تضمينها عند true === is_admin()

إذا تم استبعاد مجلد في iterator_check_traversal_callback عن طريق إرجاع false ، فلن يتم تكرار أدلةه الفرعية (أو تمريره إلى iterator_check_traversal_callback)

/**
 *  Require all customizations under /includes
 */
$includes_import_root = 
    new \RecursiveDirectoryIterator( __DIR__ . '/includes', \FilesystemIterator::SKIP_DOTS );

function iterator_check_traversal_callback( $current, $key, $iterator ) {
    $file_name = $current->getFilename();

    // Only include *.php files
    if ( ! $current->isDir() ) {
        return preg_match( '/^.+\.php$/i', $file_name );
    }

    // Don't include the /includes/admin folder when on the public site
    return 'admin' === $file_name
        ? is_admin()
        : true;
}

$iterator_filter = new \RecursiveCallbackFilterIterator(
    $includes_import_root, 'iterator_check_traversal_callback'
);

foreach ( new \RecursiveIteratorIterator( $iterator_filter ) as $file ) {
    include $file->getRealPath();
}
0
seangwright