Si está llegando al punto en que el código de su tema functions.php
está comenzando a abrumarlo, definitivamente diría que está listo para considerar dividirlo en varios archivos. Tiendo a hacer eso casi por segunda naturaleza en este punto.
Utilice Incluir archivos en el functions.php
archivo de su tema
Creo un subdirectorio llamado "incluye" en mi directorio de temas y segmento mi código en archivos de inclusión organizados por lo que tiene sentido para mí en ese momento (lo que significa que constantemente refactorizo y muevo el código a medida que el sitio evoluciona). También rara vez poner cualquier código real en functions.php
; todo va en los archivos de inclusión; solo mi preferencia
Solo para darle un ejemplo, aquí está mi instalación de prueba que uso para probar mis respuestas a las preguntas aquí en WordPress Answers. Cada vez que respondo una pregunta, mantengo el código en caso de que lo necesite nuevamente. Esto no es exactamente lo que harás para un sitio en vivo, pero muestra la mecánica de dividir el código:
<?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');
O crear complementos
Otra opción es comenzar a agrupar su código por función y crear sus propios complementos. Para mí, empiezo a codificar en el functions.php
archivo del tema y cuando llego al código, he movido la mayor parte de mi código a complementos.
Sin embargo, NO hay ganancia de rendimiento significativa de la organización del código PHP
Por otro lado, estructurar sus archivos PHP es el 99% sobre la creación de orden y mantenimiento y el 1% sobre el rendimiento, si eso (la organización .js
y los .css
archivos llamados por el navegador a través de HTTP es un caso completamente diferente y tiene enormes implicaciones de rendimiento). Pero cómo se organiza su código PHP en el servidor prácticamente no importa desde una perspectiva de rendimiento.
Y la organización del código es preferencia personal
Y por último, pero no menos importante, la organización del código es la preferencia personal. Algunas personas odiarían cómo organizo el código así como yo también odiaría cómo lo hacen. Encuentre algo que le guste y manténgalo, pero permita que su estrategia evolucione con el tiempo a medida que aprenda más y se sienta más cómodo con ella.
Respuesta tardía
Cómo incluir sus archivos de la manera correcta:
Lo mismo funciona en complementos también.
Cómo obtener el camino correcto o URi
También eche un vistazo a las funciones API del sistema de archivos como:
home_url()
plugin_dir_url()
plugin_dir_path()
admin_url()
get_template_directory()
get_template_directory_uri()
get_stylesheet_directory()
get_stylesheet_directory_uri()
Cómo reducir el número de
include/require
Si necesita recuperar todos los archivos de un directorio, vaya con
Tenga en cuenta que esto ignora las fallas (quizás buenas para uso de producción) / archivos no cargables.
Para alterar este comportamiento, es posible que desee utilizar una configuración diferente durante el desarrollo:
Editar: enfoque OOP / SPL
Cuando acabo de regresar y vi que esta respuesta está recibiendo cada vez más votos positivos, pensé que podría mostrar cómo lo estoy haciendo hoy en día, en un mundo PHP 5.3+. El siguiente ejemplo carga todos los archivos de una subcarpeta de temas llamada
src/
. Aquí es donde tengo mis bibliotecas que manejan ciertas tareas como menús, imágenes, etc. Ni siquiera tiene que preocuparse por el nombre ya que cada archivo se carga. Si tiene otras subcarpetas en este directorio, se ignorarán.El
\FilesystemIterator
es el PHP 5.3+ supercedor sobre el\DirectoryIterator
. Ambos son parte del PHP SPL. Si bien PHP 5.2 hizo posible desactivar la extensión SPL integrada (menos del 1% de todas las instalaciones lo hicieron), el SPL ahora es parte del núcleo de PHP.Anteriormente, aunque todavía soportaba PHP 5.2.x, usaba la siguiente solución: A
\FilterIterator
en elsrc/Filters
directorio para recuperar solo archivos (y no punteros de punto de carpetas) y a\DirectoryIterator
para hacer el bucle y la carga.El
\FilterIterator
fue tan fácil como eso:Además de que PHP 5.2 está muerto / EOL por ahora (y 5.3 también), existe el hecho de que es más código y un archivo más en el juego, por lo que no hay razón para seguir con el último y admitir PHP 5.2.x.
Resumió
Un artículo aún más detallado se puede encontrar aquí en WPKrauts .
EDITAR La forma obviamente correcta es usar el
namespace
código d, preparado para la carga automática de PSR-4 poniendo todo en el directorio apropiado que ya está definido a través del espacio de nombres. Luego, use Composer y acomposer.json
para administrar sus dependencias y deje que cree automáticamente su autocargador PHP (que importa automáticamente un archivo simplemente llamandouse \<namespace>\ClassName
). Ese es el estándar de facto en el mundo PHP, el camino más fácil y aún más pre-automatizado y simplificado por WP Starter .fuente
en términos de dividirlo, en mi placa de caldera uso una función personalizada para buscar una carpeta llamada funciones en el directorio de temas, si no está allí, la crea. Luego, crea una matriz de todos los archivos .php que encuentra en esa carpeta (si existe) y ejecuta un include (); en cada uno de ellos
De esa manera, cada vez que necesito escribir alguna funcionalidad nueva, solo agrego un archivo PHP a la carpeta de funciones y no tengo que preocuparme de codificarlo en el sitio.
fuente
Me gusta usar una función para los archivos dentro de una carpeta. Este enfoque facilita la adición de nuevas funciones al agregar nuevos archivos. Pero siempre escribo en clase o con espacios de nombres: le doy más control sobre el espacio de nombres de funciones, métodos, etc.
Debajo de un pequeño ejemplo; ut también uso con el acuerdo sobre la clase * .php
En Temas uso a menudo otro escenario. Defino la función del archivo externel en una ID de soporte, vea el ejemplo. Eso es útil si desactivé fácilmente el feture del archivo externel. Uso la función principal de WP
require_if_theme_supports()
y solo carga, si la ID de soporte estaba activa. En el siguiente ejemplo, definí esta ID compatible en la línea antes de cargar el archivo.Puedes ver más de esto en el repositorio de este tema .
fuente
Administro un sitio con aproximadamente 50 tipos de páginas personalizadas únicas en varios idiomas diferentes a través de una instalación de red. Junto con una TONELADA de complementos.
Nos obligaron a dividirlo todo en algún momento. Un archivo de funciones con 20-30k líneas de código no es divertido en absoluto.
Decidimos refactorizar completamente todo el código para administrar mejor la base de código. La estructura predeterminada del tema de WordPress es buena para sitios pequeños, pero no para sitios más grandes.
Nuestras nuevas funciones.php solo contienen lo necesario para iniciar el sitio, pero nada que pertenezca a una página específica.
El diseño del tema que usamos ahora es similar al patrón de diseño MCV, pero en un estilo de codificación de procedimiento.
Por ejemplo nuestra página de miembro:
page-member.php . Responsable de inicializar la página. Llamando a las funciones correctas de ajax o similar. Podría ser equivalente a la parte del controlador en el estilo MCV.
funciones-member.php . Contiene todas las funciones relacionadas con esta página. Esto también se incluye en varias otras páginas que necesitan funciones para nuestros miembros.
content-member.php . Prepara los datos para HTML. Puede ser equivalente al Modelo en MCV.
layout-member.php . La parte HTML.
Después de que hicimos estos cambios, el tiempo de desarrollo se ha reducido fácilmente en un 50% y ahora el propietario del producto tiene problemas para darnos nuevas tareas. :)
fuente
Desde el archivo de temas infantiles functions.php:
fuente
En functions.php, una forma más elegante de llamar a un archivo requerido sería:
require_once Locate_template ('/ inc / functions / shortcodes.php');
fuente
locate_template()
tiene un tercer parámetro ...Combiné @kaiser 's y @mikeschinkel respuestas' s.
Tengo todas mis personalizaciones para mi tema en una
/includes
carpeta y dentro de esa carpeta tengo todo dividido en subcarpetas.Solo quiero
/includes/admin
que se incluyan sus sub-contenidos cuandotrue === is_admin()
Si se excluye una carpeta
iterator_check_traversal_callback
al regresar,false
entonces sus subdirectorios no se iterarán (o pasarán aiterator_check_traversal_callback
)fuente