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

9

Estoy tratando de modificar la cabeza y el pie de mis páginas de WooCommerce. Tengo una ifdeclaración que se supone que debe apuntar a la tienda y al carrito de WooCommerce, pero no lo es. Si modifico el PHP después de la ifdeclaración, nada cambia. Pero si modifico el PHP en la elsedeclaración es 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 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 definida correctamente, 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 ?>
Brezo
fuente

Respuestas:

18

Su edición me llevó a esta idea, de hecho no hay una función llamada »woocommerce«, WooCommerceaunque sí hay una clase » «. Una cosa a tener en cuenta es que el cheque debe demorarse lo suficiente, de modo que los complementos se inicialicen realmente, de lo contrario, obviamente, la clase no existirá y el cheque regresará false. Entonces su cheque debería verse así:

if ( class_exists( 'WooCommerce' ) ) {
  // some code
} else {
  / more code
}

En la página de documentación de WooCommerce » Crear un complemento para WooCommerce « He encontrado esto:

/**
 * Check if WooCommerce is active
 **/
if ( 
  in_array( 
    'woocommerce/woocommerce.php', 
    apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) 
  ) 
) {
    // Put your plugin code here
}

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 también debería funcionar bien? Además, si lo hace así, hay una función API que puede usar, apropiadamente nombrada is_plugin_active(). Pero debido a que normalmente solo está disponible en las páginas de administración, debe habilitarlo incluyendo wp-admin/includes/plugin.php, donde reside la función. Al usarlo, el cheque se vería así:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}
Nicolai
fuente
3
Este podría ser un divertido juego de "fiesta", encontrando otras formas ;-) Déjame unirme if( function_exists( 'WC' ) ), pero es más exacto tener el nombre del complemento en la verificación de clase, como sugeriste ;-)
birgire
2
En realidad, esta función WC() existe , solo estaba tratando de encontrar un camino más corto al referirme a ella ;-) Supongo que sería más preciso con if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Jugando, también podríamos probar constantes (p WOOCOMMERCE_VERSION. Ej. ) O acciones (p did_action( 'woocommerce_loaded' ). Ej. ) ;-) @ialocin
birgire
1
Es cierto que al final del día hay muchas posibilidades. @birgire
Nicolai
1
Sí, adelante :) Así que WPSE es una especie de versión en línea de »99 formas de resolver sus problemas de PHP / WorPress« - Tuve que acuñarlo para hacerlo oficial :) @birgire
Nicolai
2
Esta respuesta NO ES confiable. Dado que ni la pregunta ni la respuesta indican explícitamente el contexto, es posible que WooCommerce esté activo, pero cargado después de este código. Por ejemplo, en otro complemento, se carga antes. La verificación de clase sugerida es mucho más confiable, si además la envuelves en plugins_loaded hook . Es decir, envolver la cláusula-si en una check_for_woocommerce()función, y registrarlo conadd_action('plugins_loaded', 'check_for_woocommerce');
kontur
6

Muchos de los complementos oficiales de WooCommerce resuelven esto comprobando la WC_VERSIONconstante, que WooCommerce define, una vez que todos los complementos se han cargado. Código simplificado:

add_action('plugins_loaded', 'check_for_woocommerce');
function check_for_woocommerce() {
    if (!defined('WC_VERSION')) {
        // no woocommerce :(
    } else {
        var_dump("WooCommerce installed in version", WC_VERSION);
    }
}

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

kontur
fuente
Esta es una muy buena manera. Un buen consejo para que los desarrolladores de complementos también lo incluyan.
Jacob Raccuia
3

Para mejorar las respuestas dadas, estamos usando esto:

$all_plugins = apply_filters('active_plugins', get_option('active_plugins'));
if (stripos(implode($all_plugins), 'woocommerce.php')) {
    // Put your plugin code here
}

Esto evita dos problemas:

  • WooCommerce se instala en un directorio no estándar, en cuyo caso if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...no funciona.
  • Esta comprobación se invoca antes de cargar WooCommerce, en cuyo caso if ( class_exists( 'WooCommerce' ) ) { .. }no funciona.
Jan Żankowski
fuente
Esta respuesta es útil para los desarrolladores de complementos, ya que puede envolver todo el archivo principal del complemento con esta declaración IF.
Dave Hilditch el
¡Esta fue la única solución que funcionó para mí en mi complemento! ¡¡¡Gracias!!!
Sam
1

Esto me pareció útil en la documentación para desarrolladores de WooCommerce.

Simplemente puede llamar a la is_woocommerce_active()función dentro de su archivo de complemento.

Ejemplo

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

is_woocommerce_active se define a continuación según la documentación de woo

/**
 * Check if WooCommerce is activated
 */
if ( ! function_exists( 'is_woocommerce_activated' ) ) {
    function is_woocommerce_activated() {
        if ( class_exists( 'woocommerce' ) ) { return true; } else { return false; }
    }
}
Nilesh
fuente
0

Puede envolver su complemento en una comprobació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 is active.';
} else {
echo 'WooCommerce is not Active.';
}
Prem Tiwari
fuente
3
Esto no funciona con sitios múltiples
Andrew Lazarus
@ AndrewLazarus Gracias por mencionar eso: ¡acabo de perder una hora por este problema! :)
wickywills