¿Cómo anular la función conectable en el tema?

10

Toda la documentación que he encontrado trata sobre el reemplazo de la función de conexión a través de su complemento.

¿Qué pasa si estás haciendo desarrollo de temas?

Mis funciones.php requieren otro archivo que anule la función get_user_by() , definida en pluggable.php .

Si omito la llamada if( function_exists() ) , aparece el error "No se puede volver a declarar ...".

Si incluyo la llamada if( function exists() ) , no obtengo ningún error, pero, por supuesto, mi función se ignora, ya que existe la versión conectable.

Basado en la impresionante publicación de Dominic en el orden de inicio de WordPress , está claro que pluggable.php es cargado antes de functions.php de tu tema, etc., de modo que eso explica el error.

Entonces, la pregunta es: ¿cómo puedes aprovechar esa bonita arquitectura conectable desde dentro de un tema, sin recurrir a la escritura de complementos que luego se deben agrupar o instalar con el tema?

Notas adicionales : Parece que el argumento es que los temas no deben tratar de hacer lo que hacen los complementos. Pero ese argumento tiene más de cuatro años (según el número de trac de 4 dígitos). Me encantaría saber de algunos bateadores pesados si esta filosofía todavía se aplica, dada la compleja topología del panorama de desarrollo de temas de hoy. Me gustaría creer que hemos evolucionado desde entonces.

Contexto : estoy desarrollando una solución CMS única para un cliente, con una gran cantidad de metadatos personalizados, personalización del administrador de back-end, el proceso de inicio de sesión / autenticación, el trabajo. Y, por supuesto, está el componente de diseño, que es donde entra en juego la parte del tema. El hecho es que estos son simplemente no componentes reutilizables: nunca se aplicarán a otro cliente, nunca se pondrán bajo la GPL y de código abierto, y seguramente no se distribuirán / instalarán en otras implementaciones de WordPress. En el mejor de los casos, hay algunas prácticas recomendadas que utilizaré en futuros proyectos, pero eso será estrictamente un trabajo de referencia / copiar y pegar.

Esto no suena como un caso de uso para los complementos para mí. El tema está instalado, tal vez un tema secundario de Twenty Eleven, tal vez uno independiente, sus funciones. Php llama en un barco cargado de envíos, cada uno de los cuales trata un aspecto diferente del CMS en cuestión. Luego, los archivos de plantillas de tema usan 'etiquetas de plantilla' personalizadas que se definen en las inclusiones. No quiero tener archivos de temas con dependencias de algún complemento u otro que esté activado, etc. Simplemente no tiene sentido crear complejidad en el sistema. Claro, puedo ponerlo en la carpeta de complementos de uso obligatorio, pero eso todavía se siente como un truco. Ahora mismo, todo que tiene que ver con las personalizaciones hechas para este proyecto está contenido en wp-content/themes/my-theme/ . Tampoco quiero tener que considerar buscar cosas en las carpetas de algunos complementos.

No me malinterpretes. Me encantan los plugins y los uso y los escribo. Y sí uso complementos junto con este tipo de desarrollo de tema altamente personalizado cuando el complemento es de terceros y representa las mejores prácticas más allá de lo que posiblemente podría implementar en un plazo razonable. Pero cuando necesito modificar la funcionalidad central para un escenario único, recurro a los ganchos de acción, a los ganchos de filtro, y me gustaría poder confiar en funciones conectables para el usuario y también en el lado de la autenticación de las cosas.

    
pregunta Tom Auger 20.06.2012 - 20:27

3 respuestas

10

Si está creando esto para un solo cliente, debe aprovechar absolutamente el mu-plugins .

Hay muchas cosas en WordPress que no puedes hacer en functions.php . Las funciones conectables son una de ellas, pero más obvias, una serie de ganchos (tanto acciones como filtros) se disparan antes de functions.php . En algunos casos, estos enlaces incluso se activan antes que los complementos normales, que luego requieren que use mu-plugins o un complemento activado por la red. En otros casos, incluso un complemento de mu es demasiado tarde. Quizás necesites algo en sunrise.php . O incluso algo (una constante o no) en wp-config.php .

Preferiría agregar algunos ganchos a las funciones conectables, en lugar de hacer que sea más fácil anularlos. Es probable que nunca más tengamos otra función conectable: son anteriores a los ganchos y casi nunca he visto una situación en la que haya ventajas para ellos sobre un buen gancho anticuado (¿¿nuevo?).

Todavía estoy de acuerdo, seis años después, con Andy Skelton: "Hay muchas diferencias entre el archivo de funciones de un tema y un complemento. Mantengámoslo así".

Aparte de eso, un cambio como este nunca podría suceder. Se rompería muchas cosas. Innumerables temas llaman a las funciones en el cuerpo de functions.php que daría lugar a un error fatal si pluggable.php no se hubiera cargado, como current_user_can() o wp_create_nonce() . Todos ellos fallarían. Y también rompería los complementos, que normalmente podrían comenzar a llamar estas funciones en plugins_loaded . (Solo mueva pluggable.php más bajo en wp-settings.php y apuesto a que la mitad del núcleo se romperá, o al menos el personalizador lo hará).

Finalmente, existe la inevitable idea de que un tema podría incluir un archivo separado como pluggable.php que podríamos cargar tan pronto como cargamos complementos y, por lo tanto, podrían anular las funciones conectables. Además de ser una mala idea (vea los primeros cuatro párrafos de este comentario), aún no sería compatible, porque hasta el setup_theme hook, uno podría invalidar qué tema se va a cargar filtrando la hoja de estilos y los valores de la plantilla.

Desafortunadamente, esto simplemente no es sostenible dado que WordPress está diseñado. Lo bueno es que hay innumerables (mejores) formas de hacerlo.

(Publicado originalmente aquí: enlace )

    
respondido por el Andrew Nacin 20.06.2012 - 22:19
5

En el contexto de un proyecto de una sola vez, es absolutamente apropiado colocar el código de uso obligatorio en mu-plugins . Si le preocupa "tenerlo todo en un solo lugar", simplemente cree un enlace simbólico en el directorio de tema al mu-plugins drop-in, para que aparezca cuando busque en el directorio del tema.     

respondido por el Mark Jaquith 20.06.2012 - 22:12
0

No puedo pensar en una forma de lograr esto, demasiado temprano en la secuencia de carga.

La solución más cercana a una solución sana sería agregar una inclusión personalizada a wp-config.php (por código o pedirle al usuario), pero compararlo con ese complemento de agrupación probablemente tenga más sentido.

    
respondido por el Rarst 20.06.2012 - 20:52

Lea otras preguntas en las etiquetas