Если вы дошли до того, что код в вашей теме functions.php
начинает перегружать вас, я бы определенно сказал, что вы готовы рассмотреть возможность разбивки его на несколько файлов. Я склонен делать это почти второй натурой на данный момент.
Использование инклюдника в вашей темы functions.php
файла
Я создаю подкаталог под названием « include » в моей директории темы и сегментирую свой код на включаемые файлы, организованные в соответствии с тем, что имеет для меня смысл в то время (что означает, что я постоянно реорганизую и перемещаю код по мере развития сайта). Я также редко положить любой реальный код в 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
С другой стороны, структурирование ваших файлов PHP - это 99% для создания порядка и удобства обслуживания и 1% для производительности, если это так (организация .js
и .css
файлы, вызываемые браузером через HTTP, это совершенно другой случай и имеет огромное влияние на производительность.) Но как вы организовываете Ваш PHP-код на сервере практически не имеет значения с точки зрения производительности.
И организация кода - это личное предпочтение
И последнее, но не менее важное: организация кода - это личное предпочтение. Некоторые люди ненавидят то, как я организую код, так же, как я могу ненавидеть то, как они это делают. Найдите то, что вам нравится, и придерживайтесь его, но позвольте своей стратегии развиваться с течением времени, когда вы будете больше учиться и чувствовать себя более комфортно с этим.
Поздний ответ
Как правильно включить ваши файлы:
То же самое работает и в плагинах.
Как правильно выбрать путь или 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
Если вам нужно получить все файлы из каталога, перейдите с
Имейте в виду, что это игнорирует сбои (возможно, полезные для производственного использования) / не загружаемые файлы.
Чтобы изменить это поведение, вы можете использовать другой конфиг во время разработки:
Изменить: ООП / SPL подход
Когда я только что вернулся и увидел, что этот ответ получает все больше и больше голосов, я подумал, что мог бы показать, как я это делаю в настоящее время - в мире PHP 5.3+. В следующем примере загружаются все файлы из подпапки тем с именем
src/
. Здесь у меня есть мои библиотеки, которые выполняют определенные задачи, такие как меню, изображения и т. Д. Вам даже не нужно заботиться об имени, поскольку каждый отдельный файл загружается. Если у вас есть другие подпапки в этом каталоге, они игнорируются.\FilesystemIterator
Это в PHP 5.3+ supercedor над\DirectoryIterator
. Оба являются частью PHP SPL. В то время как PHP 5.2 позволял отключать встроенное расширение SPL (это сделали менее 1% всех установок), SPL теперь является частью ядра PHP.Ранее, пока я все еще поддерживал PHP 5.2.x, я использовал следующее решение: A
\FilterIterator
вsrc/Filters
каталоге, чтобы получать только файлы (а не точечные указатели на папки), и a\DirectoryIterator
для выполнения циклов и загрузки.Это
\FilterIterator
было так просто:Помимо того, что PHP 5.2 сейчас мертв / EOL (и 5.3 тоже), есть тот факт, что в игре больше кода и еще одного файла, поэтому нет смысла переходить на более позднюю версию и поддерживать PHP 5.2.x.
Подвела
Еще более подробную статью можно найти здесь, на WPKrauts .
РЕДАКТИРОВАТЬ Очевидно, что правильный способ - использовать
namespace
d-код, подготовленный для автозагрузки PSR-4 , поместив все в соответствующий каталог, который уже определен через пространство имен. Затем просто используйте Composer и acomposer.json
для управления вашими зависимостями и позвольте ему автоматически собрать ваш автозагрузчик PHP (который автоматически импортирует файл, просто вызываяuse \<namespace>\ClassName
). Это де-факто стандарт в мире PHP, самый простой способ, и еще более предварительно автоматизированный и упрощенный WP Starter .источник
с точки зрения его разбора, в своей рабочей области я использую пользовательскую функцию для поиска папки с именем functions в каталоге темы, если ее там нет, она создает ее. Затем он создает массив всех файлов .php, которые он находит в этой папке (если есть), и запускает include (); на каждом из них.
Таким образом, каждый раз, когда мне нужно написать какую-то новую функциональность, я просто добавляю файл PHP в папку функций, и мне не нужно беспокоиться о кодировании его на сайте.
источник
Мне нравится использовать функцию для файлов внутри папки. Такой подход позволяет легко добавлять новые функции при добавлении новых файлов. Но я пишу всегда в классе или с пространствами имен - дайте ему больше контроля над пространством имен функций, методов и т. Д.
Ниже небольшой пример; но также использование с соглашением о классе * .php
В Темах я часто использую другой сценарий. Я определяю функцию внешнего файла в идентификаторе поддержки, см. Пример. Это полезно, если я легко деактивирую файл внешнего файла. Я использую функцию ядра WP,
require_if_theme_supports()
и он загружается, только если активен ID поддержки. В следующем примере я определил этот поддерживаемый идентификатор в строке перед загрузкой файла.Вы можете увидеть больше этого в репо этой темы .
источник
Я управляю сайтом с помощью примерно 50 уникальных пользовательских типов страниц на нескольких языках по сетевой установке. Вместе с тонной плагинов.
Мы были вынуждены разделить все это в какой-то момент. Файл функций с 20-30 тыс. Строк кода совсем не смешной.
Мы решили полностью реорганизовать весь код, чтобы лучше управлять базой кода. Структура темы WordPress по умолчанию хороша для небольших сайтов, но не для больших сайтов.
Наш новый functions.php содержит только то, что необходимо для запуска сайта, но ничего, что относится к конкретной странице.
Макет темы, который мы используем сейчас, похож на шаблон проектирования MCV, но в стиле процедурного кодирования.
Например, наша страница участника:
page-member.php . Ответственный за инициализацию страницы. Вызов правильных функций ajax или аналогичных. Может быть эквивалентно части контроллера в стиле MCV.
functions-member.php . Содержит все функции, связанные с этой страницей. Это также включено в несколько других страниц, которые нуждаются в функциях для наших членов.
content-member.php . Подготавливает данные для HTML. Может быть эквивалентно модели в MCV.
layout-member.php . HTML часть.
После того, как мы внесли эти изменения, время разработки легко сократилось на 50%, и теперь у владельца продукта возникают проблемы с постановкой новых задач. :)
источник
Из файла дочерних тем functions.php:
источник
В functions.php более элегантный способ вызова требуемого файла:
require_once locate_template ('/ inc / functions / shortcodes.php');
источник
locate_template()
имеет третий параметр ...Я объединил ответы @kaiser и @mikeschinkel .
У меня есть все мои настройки для моей темы в
/includes
папке, и в этой папке у меня все разбито на подпапки.Я хочу, чтобы
/includes/admin
его содержание включалось только тогда, когдаtrue === is_admin()
Если папка исключена
iterator_check_traversal_callback
путем возврата,false
то ее подкаталоги не будут повторяться (или передаватьсяiterator_check_traversal_callback
)источник