Perché usare function_exists in WordPress? Differenze tra if e add_action

23 ago 2013, 07:30:20
Visualizzazioni: 61.6K
Voti: 35

Ho notato che molti sviluppatori di temi WordPress usano questo codice in functions.php

if (function_exists('register_nav_menus')) {
    register_nav_menus (array('primary' => 'Navigazione Header'));
}

Personalmente, io uso sempre add_action per ogni funzione che inserisco in functions.php

Quindi, il codice sopra sarebbe scritto così:

add_action('init', 'my_register_nav_menus');

function my_register_nav_menus() {
    register_nav_menus (array('primary' => 'Navigazione Header'));
}

Ho due domande:

  1. Perché usare l'istruzione if nel primo metodo?

  2. Quale dei due è il modo corretto?

0
Tutte le risposte alla domanda 5
0
43

Controllare se le funzioni integrate di WordPress esistono prima di chiamarle è per la compatibilità con le versioni precedenti che, a mio parere, non è necessaria.

Quindi, se vedi if ( function_exists( 'register_nav_menus' ) ), l'autore del tema sta supportando versioni precedenti alla 3.0.

A volte vedi ancora if ( function_exists( 'dynamic_sidebar' ) ) Perché? Non potrei dirtelo perché dynamic_sidebar è stata introdotta nella versione 2.2.

Un altro motivo per utilizzarlo è rendere il tuo tema o plugin "pluggable". Una funzione pluggable è una che può essere sovrascritta in un child theme o in un altro plugin.

Questo viene fatto nella definizione, non nella chiamata, e si utilizza l'operatore ! per assicurarsi che non esista già prima di definirla.

if ( ! function_exists( 'my_awesome_function' ) ) {
/**
 * La mia funzione fantastica è fantastica
 *
 * @param array $args
 * @return array
 */
function my_awesome_function( $args ) {
  // codice della funzione
  return array();
  }
}

Quando viene fatto così, un child theme o un altro plugin può sovrascrivere quella funzione con la propria.

23 ago 2013 10:31:38
0

La funzione function_exists non è un altro modo per caricare una funzione come add_action, serve a verificare nel tuo codice che non ci siano altre funzioni con lo stesso nome in modo da non causare errori. Dal sito php.net:

Controlla l'elenco delle funzioni definite, sia quelle integrate (interne) che quelle definite dall'utente, per verificare la presenza di function_name.

Se hai la stessa funzione due volte nel tuo codice, causerà un errore, ecco perché è consigliabile prefissare le tue funzioni con qualcosa di diverso da wp_.

Per saperne di più: http://php.net/manual/en/function.function-exists.php

23 ago 2013 07:43:07
0

puoi usare http://php.net/function_exists

if(function_exists('mia_funzione')){
   // mia_funzione è definita
}

OPPURE se vuoi vedere tutte le funzioni disponibili, puoi anche stamparle tutte,

echo "<pre>"; print_r(get_defined_functions());

stampa nella pagina e puoi cercare quella funzione se non è presente nella lista significa che non è disponibile per l'uso.

potresti aver bisogno di attivare l'estensione per una specifica libreria.

8 feb 2017 11:22:25
0

function_exists dovrebbe essere utilizzato dopo il nome della funzione in un tema, non prima.

add_action( 'loop_start', 'add_slider' );

function add_slider() {

if ( function_exists( 'soliloquy' ) ) { 

soliloquy( 'slider', 'slug' ); 

    }

}

Questo controllo serve per assicurarsi che il plugin sia attivo prima di eseguire una funzione e/o generare del markup, altrimenti potresti ottenere un errore del tipo "call to undefined function".

29 mar 2018 13:55:30
0

php.net definisce questo come

(PHP 4, PHP 5, PHP 7) function_exists — Restituisce TRUE se la funzione specificata è stata definita

Devo concordare con Michelle nell'utilizzo nel senso che si [dovreb]be usare il controllo solo per qualcosa di simile al controllo del type cast; quindi si verificherebbe se una funzione esiste (in quella pagina o da qualsiasi cosa richiamata in quella pagina/file) per poi sapere se è sicuro eseguire un'altra funzione o interpretare del template HTML.

Come qualcuno ha menzionato, è comunemente usato per verificare se il tuo file/tema (usando WordPress) è in grado di eseguire la richiesta necessaria. L'ho usato per verificare se un tema ha una specifica parte di template.

if ( function_exists( 'register_sidebar' ) ) { get_sidebar(); }

24 giu 2019 03:41:41