La tarea
Puede registrarse para agregar directorios de Temas adicionales utilizando register_theme_directory()
para su instalación de WP. Lamentablemente, el núcleo no ofrece la misma funcionalidad para los complementos. Ya tenemos MU-Plugin, Drop-Ins, Plugins y Temas. Pero necesitamos más para una mejor organización de archivos.
Aquí está la lista de tareas para lograr:
- Agregar un directorio de complementos adicional
- Para cada directorio de complementos, se necesita una nueva "pestaña" como se muestra aquí [1]
- El directorio adicional tendría la misma funcionalidad que el directorio del complemento predeterminado.
¿Qué hay para ti?
La mejor y más completa respuesta recibirá una recompensa.
[1] Pestaña adicional para una nueva carpeta / directorio de complementos
plugins
plugin-development
directory
emperador
fuente
fuente
get_themes()
a una clase.Respuestas:
Bien, voy a apuñalar esto. Algunas limitaciones que encontré en el camino:
No hay muchos filtros en las subclases de WP_List_Table, al menos no donde necesitamos que estén.
Debido a la falta de filtros, realmente no podemos mantener una lista precisa de tipos de complementos en la parte superior.
También tenemos que usar algunos hacks de JavaScript impresionantes (léase: sucios) para mostrar los complementos como activos.
Envolví mi código de área de administración dentro de una clase, por lo que los nombres de mis funciones no tienen prefijo. Puedes ver todo este código aquí . Por favor contribuya!
API central
Solo una función simple que configura una variable global que contendrá nuestros directorios de complementos en una matriz asociativa. El
$key
va a ser algo que se usa internamente en busca de plugins, etc$dir
es una ruta o algo lleno en relación con elwp-content
directorio.$label
va a ser para nuestra visualización en el área de administración (por ejemplo, una cadena traducible).Entonces, por supuesto, necesitamos cargar los complementos. Conéctate
plugins_loaded
tarde y ve a través de los complementos activos, cargando cada uno.Área de administración
Configuremos nuestra funcionalidad dentro de una clase.
Nos conectaremos
plugins_loaded
muy pronto y configuraremos las "acciones" permitidas que usaremos. Estos manejarán la activación y desactivación del complemento ya que las funciones integradas no pueden hacerlo con directorios personalizados.Luego está la función enganchada
load-plugins.php
. Esto hace todo tipo de cosas divertidas.Veamos esa cosa a la vez. El
get_plugins
método, es un contenedor alrededor de otra función. Llena el atributoplugins
con datos.cd_apd_get_plugins
es una copia de laget_plugins
función incorporada sin el hardcodedWP_CONTENT_DIR
y elplugins
negocio. Básicamente: obtenga el directorio del$wp_plugin_directories
global, ábralo, encuentre todos los archivos de complemento. Guárdelos en el caché para más tarde.El siguiente es el molesto negocio de activar y desactivar complementos. Para hacer esto, usamos el
handle_actions
método. Esto es, nuevamente, descaradamente arrancado de la parte superior delwp-admin/plugins.php
archivo central .Un par de funciones personalizadas aquí nuevamente.
cd_apd_activate_plugin
(arrancado deactivate_plugin
) ycd_apd_deactivate_plugins
(arrancado dedeactivate_plugins
). Ambos son los mismos que sus respectivas funciones "principales" sin los directorios codificados.Y la función de desactivación
También hay una
cd_apd_validate_plugin
función, que por supuesto, es una estafavalidate_plugin
sin la basura codificada.Muy bien, con eso fuera del camino. Podemos comenzar a hablar sobre la visualización de la tabla de listas
Paso 1: agregue nuestras vistas a la lista en la parte superior de la tabla. Esto se hace filtrando
views_{$screen->id}
dentro de nuestrainit
función.Luego, la función enganchada real solo recorre el
$wp_plugin_directories
. Si uno de los directorios recién registrados tiene complementos, lo incluiremos en la pantalla.Lo primero que debemos hacer si estamos viendo una página de directorio de complementos personalizada es filtrar las vistas nuevamente. Necesitamos deshacernos del
inactive
conteo porque no será preciso. Una consecuencia de que no hay filtros donde los necesitamos. Enganchar de nuevo ...Y un rápido desarmado ...
A continuación, eliminemos los complementos que de otro modo habría visto en la tabla de lista y reemplácelos con nuestros complementos personalizados. Enganchar
all_plugins
.Como ya configuramos nuestros complementos y datos (ver
setup_plugins
arriba), elfilter_plugins
método solo (1) guarda el recuento de todos los complementos para más adelante, y (2) reemplaza los complementos en la tabla de la lista.Y ahora mataremos las acciones masivas. Estos podrían ser fácilmente compatibles, supongo.
Los enlaces de acciones de complementos predeterminados no funcionarán para nosotros. Entonces, en cambio, necesitamos configurar el nuestro (con las acciones personalizadas, etc.). En la
init
funcion.Las únicas cosas que se cambian aquí son (1) estamos cambiando las acciones, (2) manteniendo el estado del complemento y (3) cambiando un poco los nombres nonce.
Y finalmente, solo necesitamos poner en cola JavaScript para completarlo. En la
init
función de nuevo (todos juntos esta vez).Al poner en cola ourJS, también usaremos
wp_localize_script
para obtener el valor del recuento total de "todos los complementos".Y, por supuesto, el JS es solo un buen truco para que la lista de complementos activos / inactivos de la tabla se muestre correctamente. También pegaremos el recuento correcto de todos los complementos en el
All
enlace.Envolver
La carga real de directorios de complementos adicionales es bastante poco emocionante. Lograr que la tabla de la lista se muestre correctamente es la parte más difícil. Todavía no estoy completamente satisfecho con cómo resultó, pero tal vez alguien pueda mejorar el código
fuente
__return_empty_array()
.__return_empty_array
función!Personalmente no tengo ningún interés en modificar la interfaz de usuario, pero me encantaría un diseño de sistema de archivos más organizado, por varias razones.
Para ese fin, otro enfoque sería utilizar enlaces simbólicos.
Puede configurar sus complementos personalizados en
plugins-custom
, que podrían ser parte del repositorio de control de versiones de su proyecto.Luego, puede instalar dependencias de terceros en
plugins-external
(a través de Composer, o submódulos Git, o lo que prefiera).Entonces podría tener un simple script Bash o un comando WP-CLI que escanee los directorios adicionales y cree un enlace simbólico
plugins
para cada subcarpeta que encuentre.plugins
todavía estaría abarrotado, pero no importaría porque solo necesitarías interactuar conplugins-custom
yplugins-external
.Escalar a
n
directorios adicionales seguiría el mismo proceso que los dos primeros.fuente
O también puede usar COMPOSER con una ruta de directorio personalizada configurada para apuntar a la carpeta wp-content. Si no es una respuesta directa a su pregunta, es una nueva forma de pensar wordpress, pase al compositor antes de que se lo coma.
fuente