¿Por qué usar function_exists en WordPress? | Explicación y mejores prácticas

23 ago 2013, 07:30:20
Vistas: 61.6K
Votos: 35

He notado que muchos desarrolladores de temas de WordPress usan esto en el archivo functions.php

if (function_exists('register_nav_menus')) {
    register_nav_menus (array('primary' => 'Navegación del encabezado'));
}

En mi caso, siempre uso add_action para cada función que utilizo en functions.php

Así que, el código anterior lo escribiría como:

add_action('init', 'my_register_nav_menus');

function my_register_nav_menus() {
    register_nav_menus (array('primary' => 'Navegación del encabezado'));
}

Tengo dos preguntas:

  1. ¿Por qué usar la sentencia if en el primer método?

  2. ¿Cuál es la forma correcta?

0
Todas las respuestas a la pregunta 5
0
43

Verificar si las funciones integradas de WordPress existen antes de llamarlas es para compatibilidad con versiones anteriores, lo cual en mi opinión no es necesario.

Así que si ves if ( function_exists( 'register_nav_menus' ) ), el autor del tema está dando soporte a versiones anteriores a la 3.0.

Aún a veces ves if ( function_exists( 'dynamic_sidebar' ) ) ¿Por qué? No podría decirte porque dynamic_sidebar se introdujo en la versión 2.2.

Otra razón para usarlo es hacer que tu tema o plugin sea "pluggable". Una función pluggable es aquella que puede ser sobrescrita en un tema hijo o en otro plugin.

Esto se hace en la definición, no en la llamada, y se usa el operador ! para asegurarse de que no exista antes de definirla.

if ( ! function_exists( 'my_awesome_function' ) ) {
/**
 * Mi función asombrosa es asombrosa
 *
 * @param array $args
 * @return array
 */
function my_awesome_function( $args ) {
  //contenido de la función
  return array();
  }
}

Cuando se hace esto, un tema hijo u otro plugin puede sobrescribir esa función con la suya propia.

23 ago 2013 10:31:38
0

La función function_exists no es una forma alternativa de cargar una función como add_action, sirve para verificar en tu código que no exista otra función con el mismo nombre y así evitar que se rompa tu código. Según php.net:

Comprueba la lista de funciones definidas, tanto internas como definidas por el usuario, para ver si existe function_name.

Si tienes la misma función dos veces en tu código, esto lo romperá, por eso debes prefijar tus funciones con algo diferente a wp_.

Lee más: http://php.net/manual/es/function.function-exists.php

23 ago 2013 07:43:07
0

puedes usar http://php.net/function_exists

if(function_exists('my_function')){
   // my_function está definida
}

O si quieres ver todas las funciones disponibles, también puedes imprimirlas todas,

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

imprime en la página y puedes buscar esa función; si no aparece en la lista significa que no está disponible para usar.

Puede que necesites activar la extensión para una biblioteca en particular.

8 feb 2017 11:22:25
0

function_exists debe usarse después del nombre de la función en un tema, no antes.

add_action( 'loop_start', 'add_slider' );

function add_slider() {

if ( function_exists( 'soliloquy' ) ) { 

soliloquy( 'slider', 'slug' ); 

    }

}

Esto verifica que el plugin esté activo antes de mostrar una función y/o marcado, de lo contrario podrías obtener un error como llamada a función indefinida.

29 mar 2018 13:55:30
0

php.net lo define como

(PHP 4, PHP 5, PHP 7) function_exists — Devuelve TRUE si la función dada ha sido definida

Debo estar de acuerdo con Michelle en el uso, ya que solo deberías usar esta verificación para algo similar a la comprobación de tipo; por lo tanto, estarías buscando si una función existe (en esa página o desde cualquier cosa llamada en esa página/archivo de referencia) para saber si es seguro ejecutar otra función o analizar algún HTML de plantilla posiblemente.

Como alguien mencionó, se usa comúnmente para verificar si tu archivo/tema (usando WordPress) es capaz de ejecutar la solicitud necesaria. Lo he usado para verificar si un tema tiene una parte de plantilla específica.

if ( function_exists( 'register_sidebar' ) ) {
    get_sidebar();
}
24 jun 2019 03:41:41