Como sobrescrever a função pluggable no tema?

10

Toda a documentação que encontrei discute a substituição de funções plugáveis através do seu plug-in.

E se você estiver desenvolvendo o tema?

Meu functions.php requer outro arquivo que substitua a função get_user_by() , definida em pluggable.php .

Se eu omitir a chamada if( function_exists() ) , recebo o erro "Não é possível redeclarar ...".

Se eu incluir a chamada if( function exists() ) , não recebo nenhum erro, mas é claro que minha função é ignorada, pois a versão plugável existe.

Com base na postagem incrível de Dominic no pedido de inicialização do WordPress , fica claro que pluggable.php é carregou antes do seu tema functions.php e assim por diante, o que explica o erro.

Portanto, a questão é: como você pode tirar proveito dessa bela arquitetura conectável de dentro de um tema, sem precisar escrever plugins que devem ser empacotados ou instalados com o tema?

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

Contexto : Estou desenvolvendo uma solução única de CMS para um cliente, com muitos metadados personalizados, personalização do back-end de Admin, o processo de login / autenticação, os trabalhos. E, claro, há o componente de design - é aí que entra a parte do tema. O fato é que esses são simplesmente componentes reutilizáveis - eles nunca serão aplicados a outro cliente, nunca serão colocados sob a GPL e open source, e certamente não devem ser distribuídos / instalados em outras implementações do WordPress. Na melhor das hipóteses, há algumas práticas recomendadas que aproveitarei em projetos futuros, mas isso será estritamente um trabalho de referência / copiar e colar.

Isso não parece um caso de uso para plugins para mim. O tema é instalado, talvez um tema infantil de Twenty Eleven, talvez um standalone, suas chamadas functions.php em um boatload de includes, cada um manipulando um aspecto diferente do CMS em questão. Em seguida, os arquivos de modelo de tema usam 'tags de modelo' customizadas que são definidas nos includes. Eu não quero ter arquivos de tema com dependências em algum plugin ou outro sendo ativado, etc. Simplesmente não faz sentido construir complexidade no sistema. Claro, eu posso colocá-lo na pasta de plugins de uso obrigatório, mas isso ainda parece um hack - agora, tudo que tem a ver com as personalizações feitas para este projeto estão contidos em wp-content/themes/my-theme/ . Eu também não quero ter que considerar a busca por coisas em algumas pastas de plugins também.

Não me entenda mal. Eu amo plugins e eu os uso e escrevo. E eu uso plugins em conjunto com este tipo de desenvolvimento de temas altamente customizado quando o plugin é de terceiros e representa melhores práticas 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, eu ligo para ganchos de ação, ganchos de filtro e gostaria de poder confiar em funções conectáveis para o usuário e o lado da autenticação das coisas também.

    
por Tom Auger 20.06.2012 / 20:27

3 respostas

10

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

Existem muitas coisas no WordPress que você não pode fazer em functions.php . Funções plugáveis são uma delas, mas, mais óbvio, vários ganchos (ações e filtros) são acionados antes de functions.php . Em alguns casos, esses ganchos até disparam antes de plugins regulares, o que requer que você use mu-plugins ou um plugin ativado pela rede. Em outros casos, até mesmo um plugin mu é tarde demais. Talvez você precise de algo em sunrise.php . Ou até mesmo algo (uma constante ou não) em wp-config.php .

Eu preferiria adicionar alguns ganchos a funções conectáveis, do que para facilitar sua substituição. Não é provável que voltemos a ter outra função conectável - eles são mais antigos e quase nunca vi uma situação em que haja vantagem sobre um gancho antiquado (novo?).

Eu ainda concordo, seis anos depois, com Andy Skelton - "Existem muitas diferenças entre o arquivo de funções de um tema e um plugin. Vamos manter assim."

Isso tudo de lado, uma mudança como essa nunca poderia acontecer. Isso quebraria muitas coisas. Inúmeros temas chamam funções no corpo de functions.php , o que resultaria em um erro fatal se pluggable.php já não tivesse sido carregado - como current_user_can() ou wp_create_nonce() . Eles todos falharam. E também quebraria plugins, o que normalmente poderia começar a chamar essas funções em plugins_loaded . (Apenas mova pluggable.php mais baixo em wp-settings.php e aposto que metade do núcleo quebraria - ou, no mínimo, o personalizador faria isso.)

Por fim, há a ideia inevitável de que um tema poderia incluir um arquivo separado, como pluggable.php , que poderíamos carregar assim que carregássemos os plug-ins e, portanto, poderia substituir as funções plugáveis. Além de ser uma má ideia (veja os quatro primeiros parágrafos deste comentário), ainda não seria compatível, porque até o setup_theme hook, um poderia substituir qual tema deve ser carregado filtrando os valores de folha de estilo e modelo.

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

(Originalmente postado aqui: enlace )

    
por Andrew Nacin 20.06.2012 / 22:19
5

No contexto de um projeto único, é absolutamente apropriado descartar o código obrigatório em mu-plugins . Se "colocar tudo de uma só vez" for uma preocupação, basta criar um link simbólico no diretório tema para o mu-plugins , então ele aparecerá ao pesquisar no diretório do tema.

    
por Mark Jaquith 20.06.2012 / 22:12
0

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

O mais próximo da solução sã seria adicionar a inclusão personalizada a wp-config.php (por código ou solicitando ao usuário), mas comparar com esse plug-in de agrupamento provavelmente faria mais sentido.

    
por Rarst 20.06.2012 / 20:52