¿Cómo verificar si un plugin (WooCommerce) está activo?

8 jul 2015, 23:47:48
Vistas: 31.1K
Votos: 14

Estoy tratando de modificar el encabezado y pie de mis páginas de WooCommerce. Tengo una declaración if que se supone debe apuntar a la tienda y al carrito de WooCommerce, pero no funciona. Si modifico el PHP después de la declaración if nada cambia. Pero si modifico el PHP en la declaración else sí funciona:

Esto no funciona:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/CHANGE'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/page-header'); ?>
<?php endif ?>

Esto sí funciona:

<?php if (function_exists('woocommerce')): ?>
    <?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
<?php else: ?>
    <?php get_template_part('inc/CHANGE'); ?>
<?php endif ?>

Creo que la función WooCommerce podría no estar correctamente definida, porque esto también funciona:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
0
Todas las respuestas a la pregunta 7
7
27

Tu edición me llevó a esta idea, de hecho no existe una función llamada »woocommerce«, pero sí hay una clase »WooCommerce«. Algo importante a tener en cuenta es que la verificación debe realizarse lo suficientemente tarde para que los plugins estén inicializados, de lo contrario —obviamente— la clase no existirá y la verificación devolverá false. Así que tu verificación debería verse así:

if ( class_exists( 'WooCommerce' ) ) {
  // algún código
} else {
  // más código
}

En la página de documentación de WooCommerce »Creando un plugin para WooCommerce« encontré esto:

/**
 * Verifica si WooCommerce está activo
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Coloca aquí el código de tu plugin
}

Personalmente, creo que no es tan confiable como verificar la clase. Por razones obvias, ¿qué pasa si el nombre de la carpeta/archivo es diferente? Pero debería funcionar bien también. Además, si lo haces de esta manera, hay una función API que puedes usar, apropiadamente llamada is_plugin_active(). Pero dado que normalmente solo está disponible en páginas de administración, debes hacerla disponible incluyendo wp-admin/includes/plugin.php, donde reside la función. Usándola, la verificación se vería así:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // algún código
} else {
  // más código
}
9 jul 2015 00:02:17
Comentarios

Podría ser un juego "divertido" de fiesta, encontrando otras formas ;-) Permíteme unirme con if( function_exists( 'WC' ) ), pero es más preciso tener el nombre del plugin en la verificación de clase, como sugeriste ;-)

birgire birgire
9 jul 2015 02:05:26

Es un juego divertido de fiesta :) Supongo que hablas hipotéticamente, porque que yo sepa no existe una función WC. Así que debe ser para crear conciencia sobre function_exists(). No lo agregué a la respuesta porque el OP ya lo cubrió en su pregunta. @birgire

Nicolai Grossherr Nicolai Grossherr
9 jul 2015 11:16:21

En realidad esta función WC() existe, solo estaba tratando de encontrar una forma más corta refiriéndome a ella ;-) Supongo que sería más preciso con if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) ) ;-). Siguiendo el juego, también podríamos probar constantes (ej. WOOCOMMERCE_VERSION) o acciones (ej. did_action( 'woocommerce_loaded' )) ;-) @ialocin

birgire birgire
9 jul 2015 11:28:25

Cierto, al final del día hay muchas posibilidades! @birgire

Nicolai Grossherr Nicolai Grossherr
9 jul 2015 11:32:16

sí, de ahí la idea del juego de fiesta ;-)

birgire birgire
9 jul 2015 11:33:56

Sí, lo entiendo :) Así que WPSE es en realidad una especie de versión online de »99 formas de resolver tus problemas de PHP/WordPress« - Tuve que acuñarlo, para hacerlo oficial :) @birgire

Nicolai Grossherr Nicolai Grossherr
9 jul 2015 11:46:26

Esta respuesta NO ES confiable. Dado que ni la pregunta ni la respuesta establecen explícitamente el contexto, es posible que WooCommerce esté activo pero se cargue después de este código. Por ejemplo, en otro plugin que resulta cargarse antes. La verificación de clase sugerida es mucho más confiable si además la envuelves en el hook plugins_loaded. Es decir, envuelve la condición if en una función check_for_woocommerce() y regístrala con add_action('plugins_loaded', 'check_for_woocommerce');

kontur kontur
30 oct 2017 15:27:35
Mostrar los 2 comentarios restantes
1

Muchos de los plugins oficiales de WooCommerce resuelven esto verificando la constante WC_VERSION, que WooCommerce define, una vez que todos los plugins se han cargado. Código simplificado:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // no hay woocommerce :(
    } else {
        var_dump("WooCommerce instalado en la versión", WC_VERSION);
    }
}

La ventaja adicional es que puedes usar la función de PHP version_compare() para verificar además si está instalada una versión suficientemente nueva de WooCommerce (si tu código requiere capacidades específicas), ya que la constante WC_VERSION es adecuada para esto.

30 oct 2017 15:38:48
Comentarios

Esta es una forma realmente buena. Un buen consejo para los desarrolladores de plugins que también deberían incluir.

Jacob Raccuia Jacob Raccuia
29 ene 2018 17:11:59
2

Para mejorar las respuestas proporcionadas, estamos usando esto:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Coloca aquí el código de tu plugin
}

Esto previene dos problemas:

  • WooCommerce instalado en un directorio no estándar - en cuyo caso if ( in_array( 'woocommerce/woocommerce.php', apply_filters(... no funciona.
  • Esta verificación siendo invocada antes de que WooCommerce esté cargado - en cuyo caso if ( class_exists( 'WooCommerce' ) ) { .. } no funciona.
17 nov 2016 13:50:55
Comentarios

Esta respuesta es útil para desarrolladores de plugins ya que puedes simplemente envolver todo tu archivo principal del plugin con esta declaración IF.

Dave Hilditch Dave Hilditch
30 abr 2019 11:59:57

¡Esta fue la única solución que funcionó para mí en mi plugin! ¡¡¡Muchas gracias!!!

Sam Sam
19 may 2019 01:12:45
0

Encontré esto útil en la documentación para desarrolladores de WooCommerce.

Puedes simplemente llamar a la función is_woocommerce_active() dentro de tu archivo de plugin.

Ejemplo

if ( ! is_woocommerce_active() ) 
{
    add_action( 'admin_notices', 'WC_Subscriptions::woocommerce_inactive_notice' );
    return;
}

is_woocommerce_active definida de la siguiente manera según la documentación de Woo

/**
 * Verifica si WooCommerce está activado
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
11 dic 2019 19:22:55
0

Solución que uso en 2021:

add_action( 'admin_init', 'my_plugin_check_if_woocommerce_installed' );
function my_plugin_check_if_woocommerce_installed() {

    // Si WooCommerce NO está instalado, desactiva el plugin
    if ( is_admin() && current_user_can( 'activate_plugins') && !is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Mostrar aviso de error descartable
        add_action( 'admin_notices', 'my_plugin_woocommerce_check_notice' );

        // Desactivar este plugin
        deactivate_plugins( plugin_basename( __FILE__) );
        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }
    }
    // Si WooCommerce está instalado, activar el plugin y realizar procesamiento adicional
    elseif ( is_admin() && is_plugin_active( 'woocommerce/woocommerce.php') ) {

        // Realizar procesamiento adicional aquí
    }
}

// Mostrar aviso de error descartable si WooCommerce no está presente
function my_plugin_woocommerce_check_notice() {
    ?>
    <div class="alert alert-danger notice is-dismissible">
        <p>Lo sentimos, pero este plugin requiere WooCommerce para funcionar.
            Por favor, asegúrate de que WooCommerce está instalado y activado.
        </p>
    </div>
    <?php
}

El código se ejecuta en 'admin_init', en lugar de 'register_activation_hook' porque necesita que WooCommerce esté cargado y detectado correctamente. Si WooCommerce NO es detectado, hace lo siguiente:

a) Muestra un aviso de error descartable al administrador sobre la ausencia de WooCommerce. Esto es muy elegante ya que no usa 'wp_die'.

b) Desactiva automáticamente tu plugin personalizado.

Si WooCommerce es detectado, puedes proceder a añadir enlaces de menú, etc. según sea necesario.

ADVERTENCIAS:

  1. La solución anterior funciona bajo el supuesto de que el nombre principal del plugin WooCommerce y su archivo principal sigue siendo "woocommerce". Si esto cambiara en el futuro, los controles fallarían. Para que este código funcione en ese momento, se debería actualizar el nombre del directorio y archivo principal de WooCommerce en el código anterior, dentro de las comprobaciones if y elseif.

  2. Ten en cuenta que si tanto WooCommerce como tus plugins están instalados y funcionando correctamente, si desactivas WooCommerce en cualquier momento por cualquier razón, también se desactivaría automáticamente tu plugin.

2 dic 2021 09:38:05
0

Esto es para soporte multisitio.

$is_active = in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) );

// Verificar si es una instalación multisitio
if ( is_multisite() ) {
    // Incluir el archivo de funciones de plugins si no está disponible
    if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
        include_once ABSPATH . 'wp-admin/includes/plugin.php';
    }
    // Verificar si el plugin está activo en toda la red
    if ( function_exists( 'is_plugin_active_for_network' ) ) {
        $is_active = is_plugin_active_for_network( 'woocommerce/woocommerce.php' ) || $is_active;
    }
}

// Si el plugin está activo (ya sea en el sitio individual o en toda la red)
if ( $is_active ) {

}
14 ene 2024 21:19:38
2

Puedes envolver tu plugin en una verificación para ver si WooCommerce está instalado y activo o no:

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce está activo.';
} else {
echo 'WooCommerce no está activo.';
}
28 jun 2016 13:36:35
Comentarios

Esto no funciona con multisitios

Andrew Lazarus Andrew Lazarus
20 oct 2016 14:38:16

@AndrewLazarus Gracias por mencionarlo - ¡acabo de perder una hora con este problema! :)

wickywills wickywills
2 ene 2019 15:27:33