Como descontinuar uma função usada em um plugin?

17

Uma das funções que estou usando no meu plug-in está poluindo o escopo global com um nome que pode colidir com outra função (usada em outro plug-in). Então, acho que devo depreciá-lo. Mas como devo fazer isso?

function foo() {
    echo 'bar';
}

Estou ciente, _deprecate_function()mas ficaria grato por um exemplo mostrando todas as etapas que devo seguir para remover a função do núcleo do meu plugin.

Ref: https://developer.wordpress.org/reference/functions/_deprecated_function/

Henry Wright
fonte
Boa pergunta, mas talvez seja hora de colocar um namespace no seu plugin? Você ainda pode chamar o novo namespace de sua função obsoleta ...
brianlmerritt
O namespacing é uma opção que quero explorar, mas ainda não decidi se vou abandonar o suporte ao PHP 5.2 ainda.
henrywright
Carregar a alternativa descontinuada se a versão do php for muito baixa, mas o namespace poderá fornecer um caminho de transição. Sua mensagem obsoleta pode ser "seu provedor de hospedagem não suporta PHP 5.3 ou superior, blá, blá, etc"
brianlmerritt

Respostas:

11

Além da resposta de @Welcher:

Existem alguns bons exemplos de " cemitério " no núcleo, em que " funções morrem ".

Você pode usá-los como diretrizes, por exemplo, com relação à documentação.

Aqui está um exemplo para o permalink_link()sob owp-includes/deprecated.php

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
        _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );
        the_permalink();
}

Aqui está a documentação embutida para a _deprecated_functionfunção que explica os argumentos de entrada:

/**
 * Mark a function as deprecated and inform when it has been used.
 *
 * There is a hook deprecated_function_run that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated
 * function.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @access private
 *
 * @param string $function    The function that was called.
 * @param string $version     The version of WordPress that deprecated the function.
 * @param string $replacement Optional. The function that should have been called. 
 *                            Default null.
 */
Birgire
fonte
1
Obrigado por isso. Não pensei em olhar para a abordagem adotada pelo núcleo! Então, estou assumindo que estas são as etapas que eu precisaria tomar? 1) remova todo o conteúdo original da minha função 2) adicione uma chamada para _deprecated_function()3) adicione uma chamada à minha nova função que substitui a antiga
henrywright
1
Isso soa como um problema de dois lados discutido aqui - reprovação e possível colisão de nomes. Abordei apenas a primeira parte aqui de acordo com o título da pergunta.
22415 birgire #
1
@ MarkKaplun Concordo que existem 2 problemas em andamento. A questão era como descontinuar a função e foi nisso que minha resposta se baseou. O aviso de __doing_it_wrong é para os desenvolvedores que estão chamando esse método em seus temas, etc., para permitir que eles reajam às mudanças na API, em vez de apenas esvaziar a tela do site. O Log Deprecated Notices é um ótimo plug-in de desenvolvimento que permite manter-se atualizado com as principais alterações e também ajudaria nesse caso.
Welcher
1
@ MarkKaplun Entendo o seu ponto. No entanto, eu argumentaria que parte da descontinuação é manter a compatibilidade com versões anteriores até que o item seja removido da API. O objetivo do aviso (não importa qual método é usado para gerá-lo) é informar aos desenvolvedores usando o método que eles serão removidos e dar-lhes tempo para agir de acordo. A maneira de deprecate algo é destacar e excluí-lo, a maneira correta é dar aos usuários um heads-up primeiro :)
Welcher
2
@ MarkKaplun Não tenho certeza do que você está argumentando contra (ou a favor?). A questão era como descontinuar um método e fica claro pelo fato de o OP dizer "meu plugin" sabe o que a descontinuação significa que ele é um desenvolvedor. O usuário imaginário do qual você está falando não tem nada a ver com essa pergunta específica. Se você estiver preocupado em receber um milhão de avisos no log, os métodos em questão serão gerados apenas se o WP_DEBUG estiver ativado e, no seu ponto de vista, isso não seria ativado por não-desenvolvedores e certamente não está em produção. Eu vou respeitosamente apenas concordar em discordar um movimento em :)
Welcher
7

A reprovação nem sempre é igual à remoção, geralmente significa que o item está marcado para remoção EVENTUAL da API. Esse é um método que será chamado externamente - como em outros plugins ou desenvolvedores? Se esse método for usado apenas internamente pelo plug-in, provavelmente você poderá remover com segurança substituí-lo por uma função de nome melhor.

Caso contrário, eu criaria a função com melhor nome e chamaria a pessoa com o nome incorreto com uma __doing_it_wrongchamada - leia sobre isso no codex Isso dará a outros desenvolvedores tempo para atualizar suas referências ao método e você pode remover com segurança o método em uma versão posterior.

function badly_named() {

    __doing_it_wrong( 'badly_named', 'This method has been deprecated in favor of better_named_function' );

    /**
     * Call the better named method
     */
     better_named_function();
}

Espero que isto ajude!

Welcher
fonte
Obrigado por isso, mas eu estou pensando que eu deveria copiar como o núcleo faz. Dê uma olhada na resposta de @birgire por exemplo
henrywright
Soa bem para mim :) #
406 Welcher
1

Você cria um novo plug-in e aconselha seus usuários a migrar para ele, pois o atual é o EOL.

Não há nada mais irritante do que autores de plugins e temas alterando suas APIs públicas e tentando tratá-lo como "apenas mais uma pequena atualização". Não há motivo para interromper sites devido a um problema pelo qual os usuários não estão sendo afetados.

Mark Kaplun
fonte
Meus usuários seriam totalmente afetados por isso se outro plug-in tivesse uma função com exatamente o mesmo nome (e não estiver usando espaços para nome).
henrywright
Não, a ativação do plug-in falhará e eles reclamarão com você ou o autor do outro plug-in. Tempo total de interrupção aproximadamente zero. Se eles precisarem atualizar os dois plug-ins para um novo, não deve demorar mais de 15 minutos, sem interromper o funcionamento do site. O que você deseja é que alguns de seus usuários atualizem e descubram que algumas funcionalidades não estão mais funcionando sem aviso prévio. Hora de consertar? você acha que eles têm um backup e podem corrigi-lo?
precisa
Depois de criar uma API, você deve manter o suporte para sempre ou, pelo menos, até que seja totalmente irrelevante; o wordpress, por exemplo, não removeu nenhuma API obsoleta desde a versão 3.4, e apenas adicionar um aviso não é bom.
Mark Kaplun
1
+1 porque respeito a sua opinião e o que eu aprecio neste site são as diferentes visualizações, abordagens e soluções para os problemas, porque geralmente não existe um tamanho único para todos.
birgire
1

Eu sugeriria algo como:

/**
 * @deprecated Please use good_function_name() instead
 * @since x.y.z Marked deprecated in favor of good_function_name()
 * @see good_function_name()
 */
function bad_function_name() {
    trigger_error(
        'The ' . __FUNCTION__ . ' function is deprecated. ' .
        'Please use good_function_name() instead.',
        defined( 'E_USER_DEPRECATED' ) ? E_USER_DEPRECATED : E_USER_WARNING
    );

    return good_function_name();
}

Isso tem o efeito de mostrar um aviso de descontinuação nos logs, juntamente com um rastreamento de pilha. Naturalmente, isso só funcionará se o log estiver ativado no WordPress.

O operador ternário está lá porque a constante E_USER_DEPRECATED foi introduzida apenas no PHP 5.3.0. Nas versões anteriores, podemos recorrer a um aviso simples do usuário.

No manual do PHP sobre constantes de erro :

E_DEPRECATED Avisos de tempo de execução. Habilite isso para receber avisos sobre código que não funcionará em versões futuras.

O motivo pelo qual não gosto de usar _doing_it_wrong ou __deprecated_function é que essas funções são destinadas apenas ao núcleo do WordPress. A partir da referência de código nessas funções:

O acesso desta função é marcado como privado. Isso significa que ele não deve ser usado por desenvolvedores de plug-ins ou temas, apenas em outras funções principais. Ele está listado aqui para integridade.

alexg
fonte
1
Esse é um ponto +1 totalmente válido - no entanto, podemos ver que plugins como o Woocommerce usam as duas funções . independentemente.
Birgire