Come rendere richiesto il plugin in un tema wp senza usare le istruzioni condizionali php quando si chiama una singola funzione da quel plugin?


9

Uno dei miei temi Wordpress richiede alcuni plugin di terze parti per funzionare correttamente.

Il più delle volte chiamavo funzioni da plugin di terze parti usando istruzioni condizionali come

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

supponiamo che dovrei usare ampiamente un plugin attraverso molti file del mio tema ... Vorrei evitare di usare molte condizioni IF ... esiste un modo corretto per richiedere l'installazione di determinati plugin specifici in WP o anche meglio installarli se mancano prima di attivare il tema?

Grazie

Risposte:


7

is_plugin_active()è piuttosto fragile: si romperà quando l'autore del plugin rinomina il file principale o quando l'utente rinomina la directory o il file principale del plugin. È meglio verificare se esiste una determinata funzione pubblica.

Per evitare di dover effettuare quel controllo ogni volta che hai bisogno di alcune delle funzionalità del plugin, puoi mostrare un messaggio nell'area di amministrazione:

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

Un'altra alternativa è usare qualcosa come http://tgmpluginactivation.com/


Se l'autore del plug-in cambia il nome di una funzione con cui ti function_existschiedi, 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.
Kaiser

Se ti interessano i voti, allora dovresti votare la Q stessa, in quanto è buona.
Kaiser

Se l'autore del plug-in cambia il nome della funzione, riceverà i reclami da molti più utenti rispetto a se cambierebbe il nome del file.
Scribu,

E ho annullato il voto della tua risposta perché non ha affrontato la domanda, IMO. O preferiresti sottovalutare segretamente, senza spiegazioni offerte?
Scribu,

Stavo solo parlando del downvote, non del commento. Il commento in sé è ok, poiché questo argomento è qualcosa che necessita di discussione. Aggiungerò un'altra risposta poiché i miei pensieri che supereranno la lunghezza dei commenti. Modifica semplicemente la risposta, in modo da poter mantenere i risultati della discussione nelle revisioni affinché tutti possano seguirli. Grazie.
Kaiser

1

Anche se questo non impedisce che il tema si interrompa quando il plug-in è disabilitato, guarderei questo slick articolo sul plug-in "Come visualizzare un avviso di amministratore per i temi richiesti" . Non mi sono mai trovato a mio agio con l'idea di un tema che costringa ad installare un plugin, e quindi questa sembra la migliore opzione successiva.

Un altro pensiero veloce: non l'ho mai provato, ma mi chiedo se potresti trovare un modo intelligente per alloggiare più ganci in un unico condizionale. Forse potresti separare tutte le funzioni condizionali in un file diverso e richiederlo solo se if( function_exists( 'plugin_function' ) )restituisce true(con la consapevolezza che si tratta di un controllo imperfetto.


0

Se ti serve solo una pagina di plugin, allora c'è is_plugin_active(). Se ne hai bisogno all'esterno, è meglio copiare / incollare la funzione principale sul tema e quindi riutilizzarla:

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

Il condizionale evita qualsiasi errore con la doppia definizione della funzione.


Questo non risponde davvero alla domanda. Sostituisce semplicemente if(function_exist('plugin_function'))conif(is_plugin_active('plugin-file.php'))
scribu il

0

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.

  1. (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
  2. (normale) Un plug-in che ha funzionalità estese quando viene attivato un plug-in figlio. Esempio: jQueryAttachmentCarousel »jQuerySlideDeck
  3. (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 shutdownagganciato ...?


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.


Per la cronaca, questo è un modo piuttosto non ortodosso di utilizzare la funzionalità del sito. Mi ricorda c2.com/cgi/wiki
scribu il

Sì. Ma non avevo idea di come continuare la discussione senza nasconderla ai lettori successivi.
Kaiser

Non mi sarei reso conto che pubblicare la domanda avrebbe generato una discussione abbastanza :) Ma è davvero interessante e ti ringrazio entrambi per il tuo impegno e il tuo tempo nel dare consigli e nel fornire un dibattito ponderato. Penso che il consiglio di Scribu (uno dei tanti) di utilizzare la classe di attivazione TGM potrebbe offrire una soluzione alla mia risposta almeno da un punto di vista solo pratico, che esaminerò. Tuttavia, sto ancora tenendo d'occhio l'intera discussione perché anche altri metodi proposti hanno senso in alcuni scenari ed è molto interessante per me leggere, grazie!
unfulvio,
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.