Nota: questa risposta è qui solo per facilitare la discussione tra @scribu e @kaiser. Mod: per favore non cancellare. Utenti / lettori: non votare. Se vuoi seguire la discussione, dai un'occhiata al registro di revisione / modifica. Se vuoi partecipare alla discussione, modifica la risposta. Se la discussione ha un risultato, verrà contrassegnata come tale. Grazie.
scenari
Esistono anche diversi scenari di peso diverso, in cui è possibile avere una dipendenza plug-in. (Gli esempi sono solo immaginari). La parola "Plugin (padre)" può essere scambiata con "Tema" dal punto di vista genitore.
- (difficile) Un plug-in figlio che estende solo la funzionalità o altera la visualizzazione (e simili) di un plug-in esistente e quindi non può esistere senza il genitore. Esempio: BuddyPress »BuddyPress-FunkyCommentDisplay
- (normale) Un plug-in che ha funzionalità estese quando viene attivato un plug-in figlio. Esempio: jQueryAttachmentCarousel »jQuerySlideDeck
- (soft) Un plug-in che aggiunge solo una funzione. Esempio: DisneyWonderlandTheme »MickeysSocialLinks
Di seguito provo a disegnare ciò che accade quando aggiorni il plug-in "altro" e il controllo non funziona più.
- Annuncio 1) Il plug-in non potrebbe esistere senza BuddyPress attivato »La roba è completamente rotta.
- Annuncio 2) Il plug-in non può offrire l'opzione per passare da Carousel a SlideDeck »Display cablati (suppongo che gli stili vengano modificati in SlideDeck).
- Ad 3) I tasti di scelta rapida di MickeysSocial scompaiono.
Dai un'occhiata
Esistono tre possibilità per verificare se si desidera sapere se un plugin è attivo:
- A. La cartella esiste?
- B. Il file principale - opzione
'active_plugins'
- esiste?
- C. Esiste una funzione particolare?
Se ora prendo il mio plugin Internal Link Checker come esempio, che non offre alcuna API pubblica e non è destinato a essere esteso, non vedrei alcun motivo (come autore) di non modificare la denominazione delle funzioni interne su richiesta o semplicemente su volontà . Quindi, se qualcuno provasse a fare un piggyback su questo plugin, le cose si romperanno semplicemente (a seconda della funzionalità e della tenuta del raggruppamento) durante l'aggiornamento. Lo stesso vale per i nomi dei file. Non avrei alcuna vera ragione (a parte il fatto che il plugin verrebbe disattivato all'aggiornamento) per non cambiare il nome del file. L'unica cosa che mi impedirebbe di cambiare il nome della cartella è che il controllo degli aggiornamenti e la notifica vengono eseguiti sul nome del file, se è ospitato nel repository ufficiale.
Quindi direi che dalla parte più debole (facile da cambiare) alla più difficile (molto parla contro il cambiamento) di un plugin (genitore) sarebbe:
funzione »nome file principale» cartella
Quando ho detto che un controllo delle funzioni è meno fragile dell'uso, is_plugin_active()
ho supposto che la funzione in questione fosse esplicitamente incoraggiata dall'autore del plugin. L'esempio finale di questo sarebbe il wp_pagenavi()
tag template offerto dal plugin WP-PageNavi.
La difficoltà nella definizione delle dipendenze è che non esiste un modo standard per identificare in modo univoco i plug-in che non comportano nomi di file.
Altre riflessioni sull'argomento:
http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme
Immagino che finora possiamo riassumere in tre punti:
- Abbiamo parlato di argomenti leggermente diversi
- Siamo d'accordo sul fatto che non esiste un modo a prova di proiettile per aggirare ciò che pensavo potesse essere l'argomento
- Dalla tua comprensione della domanda, hai offerto la strada giusta da percorrere
Il modo (finora) più intelligente a cui riesco a pensare, che ho già visto in alcuni plugin (molto meno):
// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );
Senza pensarci troppo nei dettagli, ma immagino che potresti agganciare la tua notifica a un controllo su tutto il filtro e controllare all'interno del filtro corrente se è stato attivato quando sei shutdown
agganciato ...?
L'uso degli hook funzionerebbe bene per dipendenze "normali" e "deboli". L'unico inconveniente è che dovresti comunque utilizzare function_exists()
o is_plugin_active()
se vuoi fermarti se la dipendenza non viene soddisfatta. L'uso del filtro "tutto" per questo sarebbe troppo costoso IMO.
@scibu Questo era mirato al "tuo" argomento. (Ho già lasciato parlare del mio). :)
Quindi, fondamentalmente, se hai bisogno di una dipendenza - e hai un bravo autore - allora potrebbe offrire un hook invece / in sostituzione di un tag template. Perché il plug-in si aggancerebbe solo se l'hook sarà presente, o semplicemente non fare nulla. E dall'altra parte non avresti avuto un errore, quando i plugin non erano presenti.
Ecco la parte difficile (o più di una Q): Per scrivere un avviso di amministratore per informare l'utente sulla dipendenza "Devi installare» DisneyWonderLinks «", puoi controllare array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )
. Non sono sicuro che funzionerebbe, ma dopo tutto l'array dovrebbe essere accessibile su entrambi i lati (pubblico / amministrativo).
Non funzionerebbe. Solo perché un callback è registrato su un hook non significa che l'hook verrà attivato quando previsto. L'unica cosa che farebbe una sorta di tipo di lavoro è usare l'hook 'shutdown', che hai menzionato prima:
add_action( 'shutdown', function() {
if ( !did_action( 'template_tag_like_hook' ) )
echo 'Problem.';
} );
Naturalmente, questo sarebbe stampato in fondo, dopo il </html>
tag, sul front-end (poiché è lì che vengono normalmente utilizzati i tag modello), che non è di grande utilità.
Potresti provare a memorizzare il messaggio in wp_options e quindi visualizzarlo nell'area di amministrazione, ma ciò aprirebbe una nuova lattina di worm: invalidazione, plug-in di cache ecc.
function_exists
chiedi, un normale utente riceverà semplicemente il messaggio, che non ha installato il plug-in su cui fa affidamento un altro plug-in. Il problema è che l'utente avrà effettivamente installato il plug-in e poi si chiederà perché non funziona . Oh, e non ho intenzione di sottovalutarti per questo.