अपने वर्डप्रेस थीम के फंक्शन्स.php फ़ाइल में कोड का आयोजन?


92

मैं वर्डप्रेस को जितना अधिक कस्टमाइज़ करूँगा उतना ही मैं इस बारे में सोचना शुरू करूँगा कि क्या मुझे इस फाइल को व्यवस्थित करना चाहिए या इसे अलग करना चाहिए।

अधिक विशेष रूप से, अगर मेरे पास कस्टम फ़ंक्शन का एक समूह है जो केवल व्यवस्थापक क्षेत्र पर लागू होता है और अन्य जो सिर्फ मेरी सार्वजनिक वेबसाइट पर लागू होते हैं, तो क्या संभवतः सभी व्यवस्थापक कार्यों को अपनी फ़ाइल में शामिल करने या उन्हें एक साथ समूह में शामिल करने का कोई कारण है?

उन्हें अलग-अलग फ़ाइलों में विभाजित करना या उन्हें एक साथ समूहित करना संभवतः एक वर्डप्रेस वेबसाइट को गति देता है या क्या वर्डप्रेस / पीएचपी स्वचालित रूप से उन कार्यों को छोड़ देता है जिनमें एक is_admin कोड उपसर्ग है?

एक बड़े फ़ंक्शंस फ़ाइल से निपटने का सबसे अच्छा तरीका क्या है (मेरा 1370 लाइन लंबा है)।

जवाबों:


120

यदि आप उस बिंदु पर functions.phpपहुंच रहे हैं, जहां आपके विषय का कोड आपको भारी पड़ने लगा है, तो मैं निश्चित रूप से कहूंगा कि आप इसे कई फाइलों में विभाजित करने पर विचार करने के लिए तैयार हैं। मैं इस बिंदु पर दूसरी प्रकृति से लगभग ऐसा ही करता हूं।

अपने थीम की functions.phpफ़ाइल में शामिल फ़ाइलों का उपयोग करें

मैं अपनी थीम डायरेक्टरी के अंतर्गत "शामिल" नाम से एक उपनिर्देशिका बनाता हूं और उस समय मेरे द्वारा बनाई गई फ़ाइलों को शामिल करने के लिए मेरे कोड को सेगमेंट में शामिल करता है (जिसका अर्थ है कि मैं लगातार विकास कर रहा हूं और साइट के रूप में चारों ओर घूम रहा कोड।) मैं भी शायद ही कभी। किसी भी वास्तविक कोड को डालें functions.php; सब कुछ शामिल फ़ाइलों में जाता है; बस मेरी प्राथमिकता।

बस आपको यहाँ एक उदाहरण देने के लिए मेरी परीक्षा स्थापित है जिसका उपयोग मैं अपने प्रश्नों का उत्तर देने के लिए यहाँ वर्डप्रेस उत्तरों पर करता हूँ। हर बार जब मैं किसी प्रश्न का उत्तर देता हूं तो मुझे उस कोड को अपने पास रखने की जरूरत होती है। यह बिल्कुल वैसा नहीं है जैसा आप लाइव साइट के लिए करेंगे, लेकिन यह कोड को विभाजित करने के यांत्रिकी को दर्शाता है:

<?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 कोड संगठन से कोई महत्वपूर्ण प्रदर्शन नहीं मिला

दूसरी ओर, आपकी PHP फ़ाइलों को संरचित करना ऑर्डर और स्थिरता बनाए रखने के बारे में 99% है और प्रदर्शन के बारे में 1% है, अगर वह ( HTTP के माध्यम से ब्राउज़र द्वारा बुलाए गए आयोजन .jsऔर .cssफाइलें पूरी तरह से अलग मामला है और इसमें बहुत बड़ा प्रदर्शन निहितार्थ हैं।) लेकिन आप कैसे व्यवस्थित करते हैं। सर्वर पर आपका PHP कोड एक प्रदर्शन परिप्रेक्ष्य से बहुत अधिक मायने नहीं रखता है।

और कोड संगठन व्यक्तिगत पसंद है

और अंतिम लेकिन कम से कम कोड संगठन व्यक्तिगत पसंद नहीं है। कुछ लोग नफरत करते हैं कि मैं कैसे कोड को व्यवस्थित करता हूं जैसे मैं नफरत करता हूं कि वे यह कैसे करते हैं। अपनी पसंद की कोई चीज़ ढूंढें और उसके साथ रहें, लेकिन समय के साथ अपनी रणनीति को विकसित करने की अनुमति दें क्योंकि आप अधिक सीखते हैं और इसके साथ अधिक सहज होते हैं।


अच्छा जवाब, मैं अभी इस बिंदु पर आया हूं जहां मुझे फ़ंक्शन फ़ाइल को विभाजित करने की आवश्यकता है। आपको कब लगता है कि यह frunctions.php से एक प्लगइन में स्थानांतरित करना आसान है। आपने अपने उत्तर में कहा: जब तक मुझे कोड फेल हो जाता है तब तक मैंने अपना अधिकांश कोड प्लग इन में ले लिया है । मुझे यह पूरी तरह से समझ में नहीं आता है, कि आपके पास फेलशेड का क्या मतलब है।
सैफ बेंक

5
+1 "प्लगइन्स बनाने या बनाने के लिए"। अधिक विशेष रूप से, " कार्यक्षमता प्लगइन्स "
इयान डन

3
सभी प्रकार की सेटिंग्स में रिश्तेदार पथ का उपयोग करना विश्वसनीय नहीं हो सकता है, इसके बजाय पूर्ण पथ का हमेशा उपयोग किया जाना चाहिए
मार्क कप्लून

2
@MarkKaplun - आप बिल्कुल सही हैं। जब से मैंने यह उत्तर लिखा, मैंने उस पाठ को कठिन तरीके से सीखा। मैं अपना उत्तर अपडेट करने जा रहा हूं। इस पर ध्यान दिलाने के लिए धन्यवाद।
2

मुझे "अनिर्धारित निरंतर DIR का उपयोग - C में ' DIR ' मान लिया गया: \ wamp \ www \ site \ wp-content \ themes \ mytheme \ functions.php" - PHP v5.6.25 और PHP77.0.10 - मैं नहीं कर सकता टिप्पणी में इस डीआईआर को ठीक से प्रारूपित करें (अंडरस्कोरकुंडर्सकोरडंडर्सकोरसंडर्सकोर), लेकिन यह dirname (अंडरस्कोरकुंडस्कोरस्कोरसंडर्सकोरस्कॉन्डर्सकोर) के साथ काम करता है
मार्को

50

देर से जवाब

अपनी फ़ाइलों को सही तरीके से कैसे शामिल करें:

function wpse1403_bootstrap()
{
    // Here we load from our includes directory
    // This considers parent and child themes as well    
    locate_template( array( 'inc/foo.class.php' ), true, true );
}
add_action( 'after_setup_theme', 'wpse1403_bootstrap' );

प्लगइन्स में भी यही काम करता है।

सही रास्ता या यूआरआई कैसे प्राप्त करें

फ़ाइल सिस्टम API फ़ंक्शन पर भी नज़र डालें:

  • home_url()
  • plugin_dir_url()
  • plugin_dir_path()
  • admin_url()
  • get_template_directory()
  • get_template_directory_uri()
  • get_stylesheet_directory()
  • get_stylesheet_directory_uri()
  • आदि।

की संख्या कैसे कम करें include/require

यदि आपको किसी निर्देशिका से जाने वाली सभी फ़ाइलों को लाने की आवश्यकता है

foreach ( glob( 'path/to/folder/*.php' ) as $file )
    include $file;

ध्यान रखें कि यह विफलताओं (उत्पादन के उपयोग के लिए अच्छा है) को अनदेखा करता है / लोड करने योग्य फ़ाइलों को नहीं।

इस व्यवहार को बदलने के लिए आप विकास के दौरान एक अलग विन्यास का उपयोग कर सकते हैं:

$files = ( defined( 'WP_DEBUG' ) AND WP_DEBUG )
    ? glob( 'path/to/folder/*.php', GLOB_ERR )
    : glob( 'path/to/folder/*.php' )

foreach ( $files as $file )
    include $file;

संपादित करें: OOP / SPL दृष्टिकोण

जैसा कि मैंने अभी वापस आकर देखा कि यह उत्तर अधिक से अधिक उठ रहा है, मैंने सोचा कि मैं दिखा सकता हूं कि मैं आजकल कैसे कर रहा हूं - एक PHP 5.3+ दुनिया में। निम्न उदाहरण सभी फाइलों को लोड करता है जिसका नाम सबफ़ोल्डर है src/। यह वह जगह है जहां मेरे पास मेरी लाइब्रेरी है जो कुछ कार्यों जैसे मेनू, चित्र आदि को संभालती है। आपको नाम की परवाह करने की भी जरूरत नहीं है क्योंकि हर एक फाइल लोड की गई है। यदि आपके पास इस निर्देशिका में अन्य सबफ़ोल्डर हैं, तो उन्हें अनदेखा कर दिया जाता है।

\FilesystemIteratorPHP 5.3+ है supercedor से अधिक \DirectoryIterator। दोनों ही PHP SPL का हिस्सा हैं। जबकि PHP 5.2 ने बिल्ट इन एसपीएल एक्सटेंशन को बंद करना संभव बना दिया था (सभी इंस्टाल में 1% से कम), एसपीएल अब PHP कोर का हिस्सा है।

<?php

namespace Theme;

$files = new \FilesystemIterator( __DIR__.'/src', \FilesystemIterator::SKIP_DOTS );
foreach ( $files as $file )
{
    /** @noinspection PhpIncludeInspection */
    ! $files->isDir() and include $files->getRealPath();
}

एक: पहले, जबकि मैं अभी भी पीएचपी 5.2.x का समर्थन किया, मैं निम्नलिखित समाधान का इस्तेमाल किया \FilterIteratorमें src/Filtersनिर्देशिका केवल फ़ाइलें (और फ़ोल्डरों का संकेत डॉट नहीं) को पुनः प्राप्त करने और एक \DirectoryIteratorपाशन और लोड हो रहा है क्या करना है।

namespace Theme;

use Theme\Filters\IncludesFilter;

$files = new IncludesFilter( new \DirectoryIterator( __DIR__.'/src' ) );
foreach ( $files as $file )
{
    include_once $files->current()->getRealPath();
}

यह \FilterIteratorजितना आसान था:

<?php

namespace Theme\Filters;

class IncludesFilter extends \FilterIterator
{
    public function accept()
    {
        return
            ! $this->current()->isDot()
            and $this->current()->isFile()
            and $this->current()->isReadable();
    }
}

PHP 5.2 के अलावा अब तक (और 5.3 के रूप में) मृत / EOL होने के बावजूद, यह तथ्य है कि यह अधिक कोड और गेम में एक और फ़ाइल है, इसलिए बाद में जाने और PHP 5.2.x का समर्थन करने का कोई कारण नहीं है।

सारांश पेश करना

WPKrauts पर और भी अधिक गहराई से लेख यहां पाया जा सकता है ।

संपादित करें स्पष्ट रूप से सही तरीका namespaceडी कोड का उपयोग करना है , जो कि पहले से ही नाम स्थान के माध्यम से परिभाषित उचित निर्देशिका में सब कुछ डालकर PSR-4 ऑटोलॉडिंग के लिए तैयार है । फिर बस संगीतकार का उपयोग करें और composer.jsonअपनी निर्भरता को प्रबंधित करने के लिए और इसे अपने PHP ऑटोलैडर (ऑटो कॉलिंग द्वारा स्वचालित रूप से आयात करता है use \<namespace>\ClassName) को ऑटो-बिल्ड करने दें । यह PHP दुनिया में डी-फैक्टो मानक है, जो कि जाने के लिए सबसे आसान तरीका है और यहां तक ​​कि पहले से स्वचालित और WP स्टार्टर द्वारा सरलीकृत है ।


5

इसे तोड़ने के संदर्भ में, मेरी बॉयलर प्लेट में मैं थीम निर्देशिका में फ़ंक्शन नामक फ़ोल्डर की तलाश के लिए एक कस्टम फ़ंक्शन का उपयोग करता हूं, अगर यह वहां नहीं है तो यह इसे बनाता है। फिर सभी .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
@ मिल्डफज : अच्छी चाल। मैं व्यक्तिगत रूप से इसका उपयोग उत्पादन कोड के लिए नहीं करूंगा क्योंकि यह हर पेज लोड के लिए करता है जो हम साइट लॉन्च करते समय आसानी से कर सकते थे। इसके अलावा, मैं फ़ाइलों को छोड़ने के लिए किसी तरह से जोड़ दूंगा, जैसे कि अंडरस्कोर से शुरू होने वाली कोई भी चीज़ लोड न करना इसलिए मैं अभी भी थीम डायरेक्टरी में प्रगति पर काम कर सकता हूं। अन्यथा, अच्छा!
माइकस्किंकेल

विचार से प्यार है, लेकिन मैं मानता हूं कि संभवतः प्रत्येक अनुरोध के लिए अनावश्यक लोड हो सकता है। कोई भी विचार अगर अंतिम कार्य करने के लिए एक सरल तरीका होगा। एफपी फाइल को स्वचालित रूप से उत्पन्न किया जा रहा है, यदि नई फाइलें जोड़ी जाती हैं या किसी विशेष समय अंतराल पर कुछ प्रकार के अपडेट के साथ कैश किया जाता है?
NetConstructor.com

अच्छा है, लेकिन यह अनमनेपन की ओर जाता है, अगर एक हमलावर वहां अपना कोड छोड़ने का प्रबंधन करता है, तो भी क्या होता है? और क्या होगा अगर इसमें शामिल करना महत्वपूर्ण है?
टॉम जम्मू नॉवेल

1
@MikeSchinkel मैं सिर्फ अपनी कामकाजी फाइलों को foo._php कहता हूं, फिर जब मैं चाहता हूं कि इसे चलाना छोड़ दें।
हल्के फुल

@ नेटकंस्ट्रक्टर: थोड़ी सी भी दिलचस्पी होगी।
केसर

5

मुझे फ़ोल्डर के अंदर फ़ाइलों के लिए एक फ़ंक्शन का उपयोग करना पसंद है। यह दृष्टिकोण नई फ़ाइलों को जोड़ते समय नई सुविधाओं को जोड़ना आसान बनाता है। लेकिन मैं हमेशा कक्षा में या नाम स्थान के साथ लिखता हूं - कार्यों, विधि आदि के नाम स्थान के बारे में अधिक नियंत्रण देता हूं।

एक छोटे से उदाहरण के नीचे; ut भी वर्ग * .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;

}

थीम्स में मैं अक्सर एक अन्य परिदृश्य का उपयोग करता हूं। मैं एक समर्थन आईडी में बाहरी फ़ाइल के फ़ंक्शन को परिभाषित करता हूं, उदाहरण देखें। यह उपयोगी है अगर मैं एक्सटर्नल फ़ाइल के भ्रूण को निष्क्रिय कर दूंगा। मैं WP कोर फ़ंक्शन का उपयोग करता हूं 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'
    );

आप इस विषय के रेपो में इसे अधिक देख सकते हैं ।


4

मैं एक नेटवर्क इंस्टालेशन पर सर्वरल विभिन्न भाषाओं में लगभग 50 अद्वितीय कस्टम पेज प्रकारों के साथ एक साइट का प्रबंधन करता हूं। प्लगइन्स के एक टन के साथ।

हम जहां कुछ बिंदु पर यह सब विभाजित करने के लिए मजबूर किया। कोड के 20-30k लाइनों के साथ एक फ़ंक्शन फ़ाइल मज़ेदार नहीं है।

हमने कोडबेस को बेहतर तरीके से प्रबंधित करने के लिए सभी कोड को रिफ्लेक्टर करने का निर्णय लिया। डिफ़ॉल्ट वर्डप्रेस थीम संरचना छोटी साइटों के लिए अच्छी है, लेकिन बड़ी साइटों के लिए नहीं।

हमारे नए कार्य.php में केवल वही होता है जो साइट को शुरू करने के लिए आवश्यक है, लेकिन कुछ भी नहीं जो एक विशिष्ट पृष्ठ से संबंधित है।

अब हम जिस थीम लेआउट का उपयोग करते हैं, वह एमसीवी डिज़ाइन पैटर्न के समान है, लेकिन एक प्रक्रियात्मक कोडिंग शैली में है।

उदाहरण के लिए हमारा सदस्य पृष्ठ:

पृष्ठ-सदस्य । पृष्ठ को आरम्भ करने के लिए जिम्मेदार। सही अजाक्स फ़ंक्शन या समान कॉलिंग। MCV शैली में नियंत्रक भाग के लिए सामयिक हो सकता है।

कार्य-सदस्य । इस पृष्ठ से संबंधित सभी कार्य शामिल हैं। यह सर्वरल अन्य पृष्ठों में भी शामिल है जिन्हें हमारे सदस्यों के लिए कार्यों की आवश्यकता होती है।

सामग्री-सदस्य । HTML के लिए डेटा तैयार करता है MCV में मॉडल के लिए समान हो सकता है।

लेआउट- member.php । HTML भाग।

जब हमने ये बदलाव किए तब विकास का समय आसानी से 50% तक गिर गया और अब उत्पाद स्वामी को हमें नए कार्य देने में परेशानी हो रही है। :)


7
इसे और अधिक उपयोगी बनाने के लिए आप यह दिखाने पर विचार कर सकते हैं कि यह एमवीसी पैटर्न वास्तव में कैसे काम करता है।
केसर

मैं आपके दृष्टिकोण का एक उदाहरण देखने के लिए उत्सुक होऊंगा, अधिमानतः कुछ विवरणों / विभिन्न स्थितियों के साथ। दृष्टिकोण बहुत अंतरंग लगता है। क्या आपने मानक कार्यप्रणाली के साथ सर्वर लोड / प्रदर्शन की तुलना की है जिसका अन्य उपयोग करते हैं? यदि संभव हो तो एक जीथ्यूब उदाहरण प्रदान करें।
NetConstructor.com


0

Functions.php में, एक आवश्यक फ़ाइल को कॉल करने का एक अधिक सुरुचिपूर्ण तरीका होगा:

requirement_once find_template ('/ inc / functions / shortcodes.php');


4
locate_template()एक तिहाई पैरामीटर है ...
FUXIA

0

मैंने @kaiser के और @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();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.