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.