Jeśli dochodzisz do punktu, w którym kod w twoim motywie functions.php
zaczyna się przytłaczać, zdecydowanie powiedziałbym, że jesteś gotowy rozważyć podzielenie go na wiele plików. W tym momencie staram się to robić niemal z drugiej natury.
Użyj opcji Dołącz pliki do functions.php
pliku motywu
Tworzę podkatalog o nazwie „obejmuje” w moim katalogu motywów i dzielę mój kod na pliki dołączone uporządkowane według tego, co ma dla mnie sens w danym momencie (co oznacza, że ciągle zmieniam kod i zmieniam kod w miarę ewolucji strony). Również rzadko wstaw dowolny prawdziwy kod functions.php
; wszystko idzie w plikach dołączanych; tylko moje preferencje.
Oto przykład mojej instalacji testowej, której używam do testowania odpowiedzi na pytania tutaj na WordPress Answers. Za każdym razem, gdy odpowiadam na pytanie, trzymam kod na wszelki wypadek, aby go znowu potrzebować. Nie jest to dokładnie to, co zrobisz dla witryny na żywo, ale pokazuje ona mechanizmy dzielenia kodu:
<?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');
Lub utwórz wtyczki
Inną opcją jest grupowanie kodu według funkcji i tworzenie własnych wtyczek. Dla mnie zaczynam kodować w functions.php
pliku motywu i do czasu, gdy otrzymam kod, przeniosłem większość mojego kodu do wtyczek.
Jednak NIE znaczący wzrost wydajności dzięki organizacji kodu PHP
Z drugiej strony struktura twoich plików PHP polega na 99% na tworzeniu porządku i łatwości konserwacji, a 1% na wydajności, jeśli to (organizowanie .js
i .css
pliki wywoływane przez przeglądarkę przez HTTP to zupełnie inny przypadek i ma to ogromny wpływ na wydajność.) Ale jak organizujesz twój kod PHP na serwerze nie ma większego znaczenia z punktu widzenia wydajności.
A organizacja kodów jest osobistą preferencją
I wreszcie organizacja kodu to osobiste preferencje. Niektórzy nienawidzą tego, jak organizuję kod, tak samo jak ja nienawidzę tego, jak to robią. Znajdź coś, co ci się podoba i trzymaj się tego, ale pozwól, aby twoja strategia ewoluowała w czasie, gdy uczysz się więcej i czujesz się bardziej komfortowo.
Spóźniona odpowiedź
Jak dołączyć swoje pliki we właściwy sposób:
To samo działa również we wtyczkach.
Jak uzyskać właściwą ścieżkę lub URi
Zobacz także funkcje interfejsu API systemu plików, takie jak:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
Jak zmniejszyć liczbę
include/require
Jeśli chcesz pobrać wszystkie pliki z katalogu, idź z
Należy pamiętać, że ignoruje to awarie (być może dobre do użytku produkcyjnego) / nieładowalne pliki.
Aby zmienić to zachowanie, możesz chcieć użyć innej konfiguracji podczas programowania:
Edycja: podejście OOP / SPL
Gdy właśnie wróciłem i zobaczyłem, że ta odpowiedź zyskuje coraz więcej głosów, pomyślałem, że mogę pokazać, jak to robię w dzisiejszych czasach - w świecie PHP 5.3+. Poniższy przykład ładuje wszystkie pliki z podfolderu tematów o nazwie
src/
. Tutaj mam swoje biblioteki, które obsługują niektóre zadania, takie jak menu, obrazy itp. Nie musisz nawet przejmować się nazwą, gdy ładuje się każdy plik. Jeśli masz inne podfoldery w tym katalogu, zostaną one zignorowane.\FilesystemIterator
Jest PHP 5.3+ supercedor nad\DirectoryIterator
. Oba są częścią PHP SPL. Podczas gdy PHP 5.2 umożliwiło wyłączenie wbudowanego rozszerzenia SPL (zrobiło to mniej niż 1% wszystkich instalacji), SPL jest teraz częścią rdzenia PHP.Wcześniej, podczas gdy nadal obsługiwałem PHP 5.2.x, użyłem następującego rozwiązania: A
\FilterIterator
wsrc/Filters
katalogu, aby pobrać tylko pliki (a nie kropki wskaźników folderów) oraz a,\DirectoryIterator
aby wykonać zapętlenie i ładowanie.To
\FilterIterator
było tak proste:Poza tym, że PHP 5.2 jest już martwy / EOL (i 5.3 również), istnieje fakt, że jest to więcej kodu i jeszcze jeden plik w grze, więc nie ma powodu, aby iść z późniejszym i wspierać PHP 5.2.x.
Podsumował
Jeszcze bardziej szczegółowy artykuł można znaleźć tutaj na WPKrauts .
EDYCJA Oczywiście poprawnym sposobem jest użycie
namespace
kodu d, przygotowanego do automatycznego ładowania PSR-4, poprzez umieszczenie wszystkiego w odpowiednim katalogu, który jest już zdefiniowany przez przestrzeń nazw. Następnie użyj Composer i acomposer.json
do zarządzania zależnościami i pozwól mu automatycznie zbudować autoloader PHP (który automatycznie importuje plik po prostu wywołującuse \<namespace>\ClassName
). To de facto standard w świecie PHP, najłatwiejsza droga, jeszcze bardziej zautomatyzowana i uproszczona przez WP Starter .źródło
jeśli chodzi o rozbijanie, na płycie kotła używam funkcji niestandardowej, aby wyszukać folder o nazwie funkcje w katalogu motywów, jeśli go nie ma, tworzy go. Następnie tworzy tablicę wszystkich plików .php, które znajdzie w tym folderze (jeśli istnieją) i uruchamia funkcję include (); na każdym z nich.
W ten sposób za każdym razem, gdy muszę napisać nową funkcjonalność, po prostu dodaję plik PHP do folderu funkcji i nie muszę się martwić kodowaniem go na stronie.
źródło
Lubię używać funkcji do plików w folderze. Takie podejście ułatwia dodawanie nowych funkcji podczas dodawania nowych plików. Ale piszę zawsze w klasie lub w przestrzeniach nazw - dajmy większą kontrolę nad przestrzenią nazw funkcji, metody itp.
Poniżej mały przykład; ut wykorzystanie również z umową o klasie * .php
W Motywach często używam innego scenariusza. Funkcję pliku zewnętrznego definiuję w identyfikatorze wsparcia, patrz przykład. Jest to przydatne, jeśli w łatwy sposób dezaktywuję kasowanie pliku zewnętrznego. Używam podstawowej funkcji WP,
require_if_theme_supports()
a on ładuje się tylko, jeśli identyfikator wsparcia był aktywny. W poniższym przykładzie zdefiniowałem ten obsługiwany identyfikator w wierszu przed załadowaniem pliku.Możesz zobaczyć więcej tego w repozytorium tego tematu .
źródło
Zarządzam witryną z około 50 unikalnymi niestandardowymi typami stron w różnych językach serwerowych za pośrednictwem instalacji sieciowej. Wraz z TONĄ wtyczek.
W pewnym momencie byliśmy zmuszeni to wszystko rozdzielić. Plik funkcji zawierający 20-30 000 wierszy kodu wcale nie jest śmieszny.
Postanowiliśmy zakończyć refaktoryzację całego kodu, aby lepiej zarządzać bazą kodów. Domyślna struktura motywów Wordpress jest dobra dla małych witryn, ale nie dla większych witryn.
Nasze nowe funkcje.php zawierają tylko to, co jest konieczne do uruchomienia strony, ale nic, co należy do określonej strony.
Układ motywu, którego teraz używamy, jest podobny do wzorca projektowego MCV, ale w proceduralnym stylu kodowania.
Na przykład nasza strona członkowska:
page-member.php . Odpowiedzialny za inicjowanie strony. Wywoływanie poprawnych funkcji ajax lub podobnych. Może być równoważne części kontrolera w stylu MCV.
functions-member.php . Zawiera wszystkie funkcje związane z tą stroną. Jest to również zawarte na innych serwerowych stronach, które potrzebują funkcji dla naszych członków.
content-member.php . Przygotowuje dane dla HTML Może być równoważne z modelem w MCV.
layout-member.php . Część HTML.
Po wprowadzeniu tych zmian czas programowania łatwo spadł o 50%, a teraz właściciel produktu ma problem z powierzeniem nam nowych zadań. :)
źródło
Z pliku motywów potomnych functions.php:
źródło
W funkcji.php bardziej eleganckim sposobem wywołania wymaganego pliku byłoby:
requ_once locate_template ('/ inc / functions / shortcodes.php');
źródło
locate_template()
ma trzeci parametr…Połączyłem odpowiedzi @kaiser i @mikeschinkel .
Mam wszystkie dostosowania mojego motywu w
/includes
folderze, aw tym folderze mam wszystko podzielone na podfoldery.Chcę tylko, aby
/includes/admin
wraz z jego podtekstem były uwzględniane kiedytrue === is_admin()
Jeśli folder zostanie wykluczony
iterator_check_traversal_callback
poprzez powrót,false
jego podkatalogi nie będą iterowane (ani przekazywane doiterator_check_traversal_callback
)źródło