Упорядочить код в файле functions.php темы WordPress?

Чем больше настроек я делаю в WordPress, тем больше я начинаю думать о том, должен ли я организовать этот файл или разделить его.

В частности, если у меня есть куча пользовательских функций, которые применяются только к области администрирования, а другие, которые применяются только к моему общедоступному веб-сайту, есть ли какая-либо причина, возможно, включать все функции администратора в свой собственный файл или группировать их вместе?

Разделил бы их на отдельные файлы или объединил бы их вместе, возможно, ускорит создание сайта WordPress, или WordPress /PHP автоматически пропустит функции, которые имеют префикс кода is_admin?

Каков наилучший способ работы с файлом больших функций (мой - 1370 строк).

82 голоса | спросил NetConstructor.com 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 06 Sep 2010 12:38:45 +0400 2010, 12:38:45

7 ответов


110

Если вы дойдете до того момента, когда код в functions.php вашей темы начнет подавлять вас, я бы определенно сказал, что вы готовы рассмотреть возможность разделения на несколько файлов. В этот момент я, как правило, делаю это почти второй природой.

Использовать в файлах темы functions.php файл

.

Я создаю подкаталог под названием "включает в себя" в моем каталоге тем и сегментирую мой код, чтобы включить файлы, организованные тем, что имеет для меня смысл в то время (что означает, что я постоянно рефакторинг и перемещение кода вокруг как сайт развивается.) Я также редко помещаю какой-либо реальный код в functions.php; все идет в файлы include; просто мои предпочтения.

Просто, чтобы дать вам пример, это моя тестовая установка, которую я использую для проверки моих ответов на вопросы здесь, в WordPress Answers. Каждый раз, когда я отвечаю на вопрос, я сохраняю код на случай, если он мне понадобится. Это не совсем то, что вы сделаете для живого сайта, но оно показывает механику разделения кода:

& л;? 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: добавление фильтра таксономии в список администратора для пользовательского типа сообщений?
//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-код на сервере, в значительной степени не имеет значения с точки зрения производительности.

И организация кода - это личное предпочтение

И последнее, но не менее важное - организация кода - это личное предпочтение. Некоторые люди будут ненавидеть, как я упорядочиваю код так же, как я мог бы ненавидеть, как они это делают. Найдите что-то, что вам нравится, и придерживайтесь его, но позволяйте вашей стратегии развиваться с течением времени, когда вы узнаете больше и получите больше удовольствия от нее.

ответил MikeSchinkel 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 06 Sep 2010 14:38:17 +0400 2010, 14:38:17
47

Поздний ответ

Как правильно включить ваши файлы:

функция wpse1403_bootstrap ()
{
    //Здесь мы загружаем из нашего каталога include
    //Здесь рассматриваются также родительские и дочерние темы
    locate_template (array ('inc /foo.class.php'), true, true);
}
add_action ('after_setup_theme', 'wpse1403_bootstrap');

То же самое работает и в плагинах.

Как получить правильный путь или URi

Также рассмотрите функции 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 ('путь /в /папка /*. php') в качестве $ файла)
    include $ file;

Имейте в виду, что это игнорирует сбои (возможно, хорошие для использования в производстве) /не загружаемые файлы.

Чтобы изменить это поведение, вы можете использовать другую конфигурацию во время разработки:

$ files = (определено ('WP_DEBUG') и WP_DEBUG)
    ? glob ('путь /в /папка /*. php', GLOB_ERR)
    : glob ('путь /в /папка /*. php')

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

Изменить: подход OOP /SPL

Как только я вернулся и увидел, что этот ответ становится все более и более, я подумал, что могу показать, как я это делаю сейчас - в мире PHP 5.3+. Следующий пример загружает все файлы из подпапки тем под названием src /. Здесь у меня есть мои библиотеки, которые обрабатывают определенные задачи, такие как меню, изображения и т. Д. Вам даже не нужно заботиться о имени, поскольку каждый отдельный файл загружается. Если у вас есть другие подпапки в этом каталоге, они игнорируются.

\ FilesystemIterator является супергелером PHP 5.3+ по \ DirectoryIterator. Оба являются частью PHP SPL. В то время как PHP 5.2 позволил отключить встроенное расширение SPL (ниже 1% от всех установок сделал это), SPL теперь является частью ядра PHP.

& л;? PHP

Тема пространства имен;

$ files = new \ FilesystemIterator (__DIR __. '/src', \ FilesystemIterator :: SKIP_DOTS);
foreach ($ files as $ file)
{
    /** @noinspection PhpIncludeInspection * /
    ! $ files-> isDir () и включают в себя $ files-> getRealPath ();
}

Ранее, хотя я все еще поддерживал PHP 5.2.x, я использовал следующее решение: A \ FilterIterator в каталоге src /Filters, чтобы получать только файлы (а не точки указатели папок) и \ DirectoryIterator, чтобы выполнить цикл и загрузку.     

namespace Theme;

используйте Theme \ Filters \ IncludesFilter;

$ files = new IncludesFilter (новый \ DirectoryIterator (__DIR __. '/src'));
foreach ($ files as $ file)
{
    include_once $ files-> current () -> getRealPath ();
}

\ FilterIterator был таким же простым:

& л;? PHP

пространство имен Тема \ Фильтры;

класс IncludesFilter extends \ FilterIterator
{
    публичная функция accept ()
    {
        вернуть
            ! $ Этом- > ток () - > isDot ()
            и $ this-> current () -> isFile ()
            и $ this-> current () -> isReadable ();
    }
}

Помимо того, что PHP 5.2 уже мертв /EOL (и 5.3), есть факт, что в игре больше кода и еще одного файла, поэтому нет причин идти с последним и поддерживать PHP 5.2.x .

Подсчитано

Более подробную статью можно найти в здесь, в WPKrauts .

EDIT . Очевидно, правильный способ - использовать код namespace d, подготовленный для PSR-4 автозагрузкой, помещая все в соответствующий каталог, который уже определен через пространство имен. Затем просто используйте Composer и composer.json, чтобы управлять своими зависимостями и позволить автозагрузке вашего автозагрузчика PHP (что автоматически импортирует файл, просто позвонив use \ <namespace> \ ClassName). Это де-факто стандарт в мире PHP, самый простой способ пойти и еще более предварительно автоматизировать и упростить WP Starter .

ответил kaiser 13 +04002012-10-13T17:53:12+04:00312012bEurope/MoscowSat, 13 Oct 2012 17:53:12 +0400 2012, 17:53:12
5

с точки зрения его разбиения, в моей плите котла я использую пользовательскую функцию для поиска папки, называемой функциями в каталоге темы, если она там не создается. Затем создается массив всех .php-файлов, которые он находит в этой папке (если есть), и запускает include (); на каждом из них.

Таким образом, каждый раз, когда мне нужно писать некоторые новые функции, я просто добавляю PHP-файл в папку функций, и не нужно беспокоиться о его кодировании на сайт.

& л;? PHP
/*
ФУНКЦИИ для автоматического включения php-документов из папки функций.
* /
//если работает на php4, выполните функции scandir
if (! function_exists ('scandir')) {
  функция scandir ($ directory, $ sorting_order = 0) {
    $ dh = opendir ($ directory);
    while (false! == ($ filename = readdir ($ dh))) {
      $ files [] = $ filename;
    }
    if ($ sorting_order == 0) {
      сортировки ($ файлов);
    } else {
      rsort ($ файлов);
    }
    return ($ files);
  }
}
/*
* эта функция возвращает путь к папке funtions.
* Если папка не существует, она создает ее.
* /
function get_function_directory_extension ($ template_url = FALSE) {
  //получать шаблон URL, если он не передан
  if (! $ template_url) $ template_url = get_bloginfo ('template_directory');


  //заменяем косые черты для взрыва
  $ template_url_no_slash = str_replace ('/', '.', $ template_url);

  //создаем массив из URL-адреса
  $ template_url_array = explode ('.', $ template_url_no_slash);

  //- массив сращивания

  //Вычислить смещение (нам нужны только три последних уровня)
  //Нам нужно сделать это, чтобы получить правильный каталог, а не тот, который был передан сервером, поскольку scandir не работает при включении псевдонимов.
  $ offset = count ($ template_url_array) - 3;

  //splice array, сохраняя только корневую папку установки WP (там, где wp-config.php живет, откуда начинается фронт)
  $ template_url_array = array_splice ($ template_url_array, $ offset, 3);
  //возвращаем togther как строку
  $ template_url_return_string = implode ('/', $ template_url_array);
  fb :: log ($ template_url_return_string, 'Template'); //FirePHP

  //создает текущий рабочий каталог с расширением шаблона и каталогами функций
  //если admin, измените папку администратора перед сохранением рабочего каталога, а затем снова измените его.
  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

  //альтернативный метод - метод chdir не работает на вашем сервере (некоторым серверам Windows это может не понравиться)
  //if (is_admin ()) $ current_working_directory = str_replace ('/wp-admin', '', $ current_working_directory);

  $ function_folder = $ current_working_directory. '/'. $ template_url_return_string. '/' функции;


  if (! is_dir ($ function_folder)) mkdir ($ function_folder); //создаем папку, если она еще не существует (ленив, но полезен .... ish)
  //Обратный путь
  return $ function_folder;

}

//удалены элементы массива, которые не имеют расширения .php
function only_php_files ($ scan_dir_list = false) {
  if (! $ scan_dir_list ||! is_array ($ scan_dir_list)) return false; //если элемент не задан, или не массив, возвращается из функции.
  foreach ($ scan_dir_list as $ key => $ value) {
    if (! strpos ($ value, '.php')) {

      снята с охраны ($ scan_dir_list [$ ключ]);
    }
  }
  return $ scan_dir_list;
}
//запускает функции для создания папки функций, выбирает ее,
//сканируем его, фильтруем только документы PHP, затем включаем их в функции

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

  //получить каталог функций
  $ functions_dir = get_function_directory_extension ();
  //сканирование каталога и удаление не-php-документов
  $ all_php_docs = only_php_files (scandir ($ functions_dir));

  //включить php docs
  if (is_array ($ all_php_docs)) {
    foreach ($ all_php_docs as $ include) {
      include ($ functions_dir. '/'. $ include);
    }
  }

}
ответил Mild Fuzz 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 06 Sep 2010 17:50:06 +0400 2010, 17:50:06
5

Мне нравится использовать функцию для файлов внутри папки. Такой подход позволяет легко добавлять новые функции при добавлении новых файлов. Но я пишу всегда в классе или с пространствами имен - дайте ему больше контроля над пространством имен функций, метода и т. Д.

Ниже небольшой пример; ut также использование с соглашением о классе * .php

public function __construct () {

    $ Этом- > load_classes ();
}

/**
 * Возвращает массив функций, также
 * Сканирует подпапку плагинов "/classes"
 *
 * @ с 0,1
 * @return void
 * /
защищенная функция load_classes () {

    //загружать все файлы с классом шаблона - *. php из классов каталогов
    foreach (glob (dirname (__FILE__). '/classes/class-*.php') как $ class)
        require_once $ class;

}

В Темы я часто использую другой сценарий. Я определяю функцию файла externel в ID поддержки, см. Пример. Это полезно, если я легко деактивирую фетур файла externel. Я использую основную функцию WP require_if_theme_supports (), и он загружается только, если идентификатор поддержки был активным. В следующем примере я использовал этот поддерживаемый идентификатор в строке перед загрузкой файла.

/**
     * Добавить поддержку для Customizer темы
     *
     * @since 09/06/2012
     * /
    add_theme_support ('documentation_customizer', array ('all'));
    //Включить настройку темы для параметров параметров темы, если поддерживается тема
    require_if_theme_supports (
        'Documentation_customizer',
        get_template_directory (). '/inc/theme-customize.php'
    );

Подробнее об этом можно узнать в репо этой темы .

ответил bueltge 4 +04002012-10-04T13:16:58+04:00312012bEurope/MoscowThu, 04 Oct 2012 13:16:58 +0400 2012, 13:16:58
4

Я управляю сайтом с примерно 50 уникальными настраиваемыми типами страниц на разных языках сервера по сетевой установке. Наряду с TON плагинов.

Мы вынуждены разбить все это в какой-то момент. Файл функций с 20-30k строк кода не является смешным вообще.

Мы решили завершить рефакторинг всего кода, чтобы лучше управлять кодовой базой. Структура темы Wordpress по умолчанию хороша для небольших сайтов, но не для больших сайтов.

Наши новые функции.php содержат только то, что необходимо для запуска сайта, но ничего, что принадлежит определенной странице.

Макет темы, который мы используем сейчас, похож на шаблон проектирования MCV, но в стиле процедурного кодирования.

Например, наша страница :

страница-member.php . Ответственный за инициализацию страницы. Вызов правильных функций ajax или аналогичных. Может быть эквивалентно части контроллера в стиле MCV.

функции-member.php . Содержит все функции, связанные с этой страницей. Это также включено в другие серверные страницы, для которых нужны функции для наших участников.

контент-member.php . Подготовка данных для HTML Может быть эквивалентна модели в MCV.

Макет-member.php . Часть HTML.

Efter мы сделали эти изменения, время разработки легко снизилось на 50%, и теперь у владельца продукта возникли проблемы с предоставлением нам новых задач. :)

ответил Patrik Grinsvall 4 +04002012-10-04T13:37:17+04:00312012bEurope/MoscowThu, 04 Oct 2012 13:37:17 +0400 2012, 13:37:17
3

Из дочерних тем файл functions.php:

require_once (get_stylesheet_directory (). '/inc/custom.php');
ответил Brad Dalton 20 +04002013-10-20T22:34:23+04:00312013bEurope/MoscowSun, 20 Oct 2013 22:34:23 +0400 2013, 22:34:23
0

В функции functions.php более элегантным способом вызова требуемого файла будет:

require_once locate_template ('/inc /functions /shortcodes.php');

ответил Imperative Ideas 4 +04002012-10-04T11:23:45+04:00312012bEurope/MoscowThu, 04 Oct 2012 11:23:45 +0400 2012, 11:23:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132