¿Existe alguna documentación en algún lugar que explique cuál es el ciclo de vida de los complementos?
Estoy comenzando un nuevo complemento con estilo OOP, y acabo de descubrir que mi clase principal está siendo instanciada mucho (gracias a Xdebug y Netbeans).
Me pregunto por qué, y me molesta porque estoy instanciando un objeto de Dropbox-API, y realmente no pensé que WordPress simplemente instanciaría tanto a mi clase principal.
No he encontrado nada relacionado con el ciclo de vida de los complementos en el Codex ni en Google.
plugin-development
codex
RitonLaJoie
fuente
fuente
Respuestas:
¿Qué significa 'estilo OOP' para ti? ¿Envolviendo todas sus funciones con una declaración de clase? Entonces lo estás haciendo mal. Usas mal la clase como espacio de nombres.
¿Eh?
Pruébelo y cuente la cantidad de archivos creados. Si lo pruebo, hay un archivo creado para cada solicitud de página. Esto significa que solo una instancia de la clase Foo para cada solicitud de página.
Probemos una llamada a la acción
Si busco en mi directorio wp-content, encontré dos archivos. No más. Se crea un archivo cuando se crea la instancia de clase. Y se crea uno cuando finaliza la llamada a la acción.
Bien, hagamos algunas estupideces con nuestra instancia. Elimine
add_action( 'plugins_loaded', .. )
y agregue este código en su lugar:¿Cuántos archivos esperas? Espero dos. Uno del constructor, uno del método.
Se crea una nueva instancia solo cuando
new
se utiliza el operador.Ahora cuento cuatro archivos. Dos del constructor y dos del método. Esto se debe a que WordPress primero incluye el complemento y luego realiza el gancho de acción
plugins_loaded
.La mejor práctica es usar el gancho de acción en
plugins_loaded
lugar de crear una instancia a partir de una función porque, si el archivo de complemento se incluye en algún lugar (por ejemplo, en otro archivo de su complemento), se crea una nueva instancia de la clase cada vez que se incluye el archivo. El enlace de acciónplugins_loaded
se realiza solo una vez por cada solicitud de página.fuente
Lo que podría suceder es que pase una copia de su clase a un filtro o acción. Por ejemplo, si desea modificar directamente las variables de clase dentro de un enlace o filtro, también debe pasar el enlace por referencia
en lugar de
Como se menciona en bainternet, también puede usar un patrón singleton para asegurarse de que un objeto específico se instancia solo una vez (las llamadas adicionales devuelven la referencia a ese objeto).
También podría considerar hacer que algunas funciones sean estáticas (dándoles la palabra clave estática. Esto generalmente se hace con funciones de tipo "auxiliar" que no interactúan con el resto de la clase. Se pueden llamar métodos estáticos sin instanciar una clase.
También puede pasar funciones estáticas a una acción / filtro:
También revisé http://codex.wordpress.org/Plugin_API/Action_Reference y descubrí que los complementos solo se pueden cargar en dos etapas en la solicitud (muplugins_loaded y plugins_loaded).
fuente