Como replace a function plugável no tema?

Toda a documentação que encontrei discute a substituição da function conectável através do seu plug-in.

E se você estiver fazendo o desenvolvimento do tema em vez disso?

My functions.php requer outro arquivo que substitua a function get_user_by() , definida em pluggable.php .

Se eu omitir a chamada if( function_exists() ) , recebo o erro “Can not redeclare …”.

Se eu include a chamada if( function exists() ) , não recebo nenhum erro, mas é claro que minha function é ignorada, já que a versão conectável existe.

Com base na incrível postagem de Dominic na ordem de boot do WordPress , é claro que pluggable.php é carregado antes das functions.php do seu tema.php e assim por diante, de modo que explica o erro.

Então, a questão é: como você pode aproveitar essa linda arquitetura conectável dentro de um tema, sem recorrer aos plugins de escrita, que devem ser empacotados ou instalados com o tema?

Mais notas : Então, parece que o argumento é que os temas não devem estar tentando fazer o que os plugins fazem. Mas esse argumento tem mais de quatro anos de idade (de acordo com o número de trac de 4 dígitos). Eu adoraria saber de alguns agressores pesados ​​se essa filosofia ainda se aplica, dada a complexa topologia do cenário de desenvolvimento de temas de hoje. Gostaria de acreditar que evoluímos desde então.

Contexto : Estou desenvolvendo uma solução CMS única para um cliente, com muitos metadados personalizados, personalização do back-end do administrador, o processo de login / autenticação, os trabalhos. E é claro, há o componente de design – é aí que a parte do tema vem. Fato é, eles simplesmente não são componentes reutilizáveis ​​- eles nunca se aplicam a outro cliente, eles nunca serão colocados sob GPL e de código aberto, e eles são mais certamente não deve ser distribuído / instalado em outras implementações do WordPress. Na melhor das hipóteses, existem algumas práticas recomendadas que alavancarei em projetos futuros, mas isso será estritamente um trabalho de referência / cópia-colar.

Isso não soa como um caso de uso para plugins para mim. O tema está instalado, talvez um tema infantil de Twenty Eleven, talvez um autônomo, suas funções.php chama em um barco de itens, cada um manipulando um aspecto diferente do CMS em questão. Em seguida, os arquivos de modelo de tema usam “tags de modelo” personalizadas que estão definidas nos itens incluídos. Eu não quero ter arquivos de tema com dependencies em algum plugin ou outro sendo ativado, etc. Simplesmente não faz sentido construir complexidade no sistema. Claro, posso colocá-lo na pasta de plugins de uso obrigatório, mas isso ainda se sente como um hack – agora, tudo o que tem a ver com as personalizações feitas para este projeto está contido em wp-content/themes/my-theme/ . Eu também não quero ter que considerar procurar coisas em algumas pastas de plugins também.

Não me interprete mal. Adoro os plugins e os uso e escrevo. E eu uso plugins em conjunto com esse tipo de desenvolvimento de tema altamente personalizado quando o plugin é de terceiros e representa práticas recomendadas muito além do que eu poderia implementar em um prazo razoável. Mas quando eu preciso modificar a funcionalidade principal para um cenário único, giro para ganchos de ação, ganchos de filtro e eu gostaria de poder confiar em funções conectáveis ​​para o usuário e o lado de autenticação das coisas também.

Solutions Collecting From Web of "Como replace a function plugável no tema?"

Se você está construindo isso para um único cliente, você deve aproveitar os mu-plugins .

Há muitas coisas no WordPress que você não pode fazer em functions.php . As funções conectáveis ​​são uma delas, mas mais óbvias, uma série de ganchos (tanto ações como filtros) triggersm antes das functions.php . Em alguns casos, esses ganchos até triggersm antes de plugins regulares, o que exige que você use mu-plugins ou um plugin ativado por rede. Em outros casos, mesmo um plugin mu é muito tarde. Talvez você precise de algo no sunrise.php . Ou mesmo algo (uma constante ou não) em wp-config.php .

Preferiria adicionar alguns ganchos às funções conectáveis, do que tornar mais fácil substituí-las. Não é provável que voltemos a ter mais uma function conectável – eles preconizam os ganchos e quase nunca vi uma situação em que a vantagem deles tenha sido superada por um bom antiquado (novinho?).

Ainda acordo, seis anos depois, com Andy Skelton – “Há muitas diferenças entre o arquivo de funções de um tema e um plugin. Vamos manter assim”.

Que tudo de lado, uma mudança como essa nunca poderia acontecer. Isso quebraria muitas coisas. Inúmeras funções de chamadas de temas no corpo de functions.php que resultariam em um erro fatal se pluggable.php ainda não havia carregado – como current_user_can() , ou wp_create_nonce() . Todos falharam. E também poderia quebrar plugins, o que normalmente poderia começar a chamar essas funções em plugins_loaded . (Basta mover pluggable.php mais baixo em wp-settings.php e eu aposto que metade do núcleo seria quebrou – ou pelo menos, o customizador faria.)

Finalmente, há a idéia inevitável de que um tema poderia include um arquivo separado como pluggable.php que poderíamos carregar já que carregamos plugins e, portanto, poderia replace funções conectáveis. Além de ser uma má idéia (veja os primeiros quatro parágrafos deste comentário), ainda não seria compatível, pois até o gancho setup_theme , pode-se replace o tema a ser carregado, filtrando a folha de estilo e os valores do modelo.

Infelizmente, isso simplesmente não é sustentável, dado que o WordPress está arquitetado. O bom é que existem inúmeras (melhores) maneiras de fazê-lo.

(Originalmente publicado aqui: http://core.trac.wordpress.org/ticket/2479#comment:5 )

No contexto de um projeto único, é absolutamente apropriado deixar o código de uso obrigatório em mu-plugins . Se “ter tudo em uma única posição” é uma preocupação, basta criar um link simbólico no diretório do tema para o mu-plugins , então ele aparecerá ao pesquisar o diretório do tema.

Não consigo pensar em uma maneira de conseguir isso, muito cedo na sequência de carregamento.

A solução mais próxima da solução seria adicionar inclusão personalizada ao wp-config.php (por código ou perguntar ao usuário), mas comparar esse complemento de agrupamento provavelmente teria mais sentido.