Come deprecare una funzione utilizzata in un plugin?


17

Una delle funzioni che sto usando nel mio plugin è inquinare l'ambito globale con un nome che potrebbe scontrarsi con un'altra funzione (usata in un altro plugin). Quindi, suppongo che dovrei deprecarlo. Ma come dovrei farlo?

function foo() {
    echo 'bar';
}

Sono a conoscenza, _deprecate_function()ma sarei grato per un esempio che mostra tutti i passaggi che dovrei prendere per rimuovere la funzione dal core del mio plugin.

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


Bella domanda, ma è forse il momento di inserire lo spazio dei nomi nel tuo plugin? Puoi ancora chiamare il nuovo spazio dei nomi dalla tua funzione obsoleta ...
brianlmerritt,

Lo spazio dei nomi è un'opzione che voglio esplorare ma non è del tutto deciso se devo ancora eliminare il supporto per PHP 5.2.
henrywright il

Caricare l'alternativa obsoleta se la versione di php è troppo bassa ma lo spazio dei nomi altrimenti potrebbe darti un percorso di transizione. Il tuo messaggio obsoleto può quindi essere "il tuo provider di hosting non supporta PHP 5.3+ blah blah etc"
brianlmerritt il

Risposte:


11

Oltre alla risposta di @Welcher:

Ci sono alcuni buoni esempi di " cimitero " nel nucleo, in cui "le funzioni vengono a morire ".

È possibile utilizzarli come linee guida, ad esempio per quanto riguarda la documentazione.

Ecco un esempio per il permalink_link()sottowp-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();
}

Ecco la documentazione in linea per la _deprecated_functionfunzione che spiega gli argomenti di input:

/**
 * 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.
 */

1
Grazie per questo. Non pensavo di guardare l'approccio adottato dal core! Quindi suppongo che questi siano i passi che dovrei prendere? 1) rimuovi tutto il contenuto originale dalla mia funzione 2) aggiungi una chiamata a _deprecated_function()3) aggiungi una chiamata alla mia nuova funzione che sostituisce quella vecchia
henrywright

1
Sembra un problema a due lati discusso qui: deprecazione e possibile collisione del nome. Ho affrontato solo la prima parte qui in base al titolo della domanda.
birgire,

1
@MarkKaplun Sono d'accordo che ci sono 2 problemi in corso. La domanda era come deprecare la funzione ed è su questo che si basava la mia risposta. L'avviso __doing_it_wrong è per gli sviluppatori che chiamano questo metodo nei loro temi, ecc. Per consentire loro di reagire ai cambiamenti nell'API piuttosto che semplicemente visualizzare il sito. Log deprecate Avvisi è un ottimo plug-in di sviluppo che ti consente di tenerti aggiornato con le modifiche di base e sarebbe utile anche in questo caso.
Welcher,

1
@MarkKaplun Vedo il tuo punto. Direi tuttavia che parte della deprecazione consiste nel mantenere la compatibilità con le versioni precedenti fino a quando l'elemento non viene rimosso dall'API. Il punto dell'avviso (indipendentemente dal metodo utilizzato per generarlo) è informare gli sviluppatori utilizzando il metodo che verrà rimosso e dare loro il tempo di agire di conseguenza. Il modo per deprecare qualcosa è evidenziarlo ed eliminarlo, il modo corretto è di dare agli utenti un
avvertimento

2
@MarkKaplun Non sono sicuro di cosa stia litigando (o per?). La domanda era come deprecare un metodo ed è chiaro dal fatto che l'OP dice "il mio plugin" sa cosa significa deprecazione che è uno sviluppatore. L'utente immaginario di cui stai parlando non ha nulla a che fare con questa domanda specifica. Se sei preoccupato di ricevere un milione di avvisi nel registro, i metodi in questione vengono emessi solo se WP_DEBUG è abilitato e, a tuo avviso, ciò non sarebbe abilitato dai non sviluppatori e certamente non in produzione.
Rispetterò

7

La deprecazione non equivale sempre alla rimozione, di solito significa che l'elemento è contrassegnato per la RIMOZIONE EVENTUALE dall'API. È un metodo che verrà chiamato esternamente, come in altri plugin o sviluppatori? Se questo metodo viene utilizzato solo internamente dal plugin, è possibile rimuoverlo in modo sicuro sostituendolo con una funzione di nome migliore.

In caso contrario, creerei la funzione con il nome migliore e la chiamerei male con quella chiamata con una __doing_it_wrongchiamata - leggi su di essa nel codice Questo darà agli altri sviluppatori il tempo di aggiornare i loro riferimenti al metodo e puoi tranquillamente rimuovere il metodo in una versione successiva.

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();
}

Spero che sia di aiuto!


Grazie per questo, ma sto pensando che dovrei copiare come core fa. Dai un'occhiata alla risposta di @birgire per un esempio
henrywright il

Mi suona bene :)
Welcher,

1

Si crea un nuovo plug-in e si consiglia ai propri utenti di migrare verso di esso poiché quello attuale è EOL.

Non c'è niente di più fastidioso di autori di plugin e temi che cambiano le loro API pubbliche e provano a trattarlo come "solo un altro piccolo aggiornamento". Non vi è alcun motivo per interrompere i siti a causa di un problema a cui gli utenti non sono effettivamente interessati.


I miei utenti ne sarebbero totalmente colpiti se un altro plugin avesse una funzione con lo stesso identico nome (e non sta usando spazi dei nomi).
henrywright il

No, l'attivazione del plug-in fallirà e si lamenteranno con te o con l'autore dell'altro plug-in. Tempo di interruzione totale circa zero. Se hanno bisogno che entrambi i plug-in eseguano l'upgrade a uno nuovo, non dovrebbero richiedere più di 15 minuti senza interrompere il funzionamento del sito. Quello che vuoi è che alcuni dei tuoi utenti aggiorneranno e scopriranno che alcune funzionalità non funzionano più senza preavviso. È tempo di aggiustare? pensi che abbiano un backup e possano risolverlo?
Mark Kaplun,

Una volta creata un'API, è necessario continuare a supportarla per sempre o almeno fino a quando non è totalmente irrilevante, ad esempio WordPress non ha rimosso nessuna delle API obsolete dal 3.4 e solo l'aggiunta di un avviso non ti gioverà.
Mark Kaplun,

1
+1 perché rispetto la tua opinione e ciò che mi piace di questo sito sono le diverse opinioni, approcci e soluzioni ai problemi, perché di solito non esiste una dimensione adatta a tutti.
Birgire,

1

Vorrei suggerire qualcosa di simile:

/**
 * @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();
}

Ciò ha l'effetto di mostrare un avviso di deprecazione nei registri insieme a una traccia dello stack. Naturalmente questo funzionerà solo se la registrazione è abilitata in WordPress.

L'operatore ternario è lì perché la costante E_USER_DEPRECATED è stata introdotta solo in PHP 5.3.0. Nelle versioni precedenti possiamo invece ricorrere a un semplice avviso utente.

Dal manuale di PHP sulle costanti di errore :

E_DEPRECATED Avvisi di runtime. Abilita questo per ricevere avvisi sul codice che non funzionerà nelle versioni future.

Il motivo per cui non mi piace usare _doing_it_wrong o __deprecated_function è che queste funzioni sono destinate solo al core di WordPress. Dal riferimento al codice su tali funzioni:

L'accesso a questa funzione è contrassegnato come privato. Ciò significa che non è destinato all'uso da parte di sviluppatori di plugin o temi, ma solo in altre funzioni principali. È elencato qui per completezza.


1
Questo è un punto totalmente valido +1 - possiamo comunque vedere che plugin come Woocommerce usano entrambe le funzioni . indipendentemente.
birgire,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.