Como verificar se um plugin (WooCommerce) está ativo?

9

Estou tentando modificar a cabeça e o pé das minhas páginas do WooCommerce. Eu tenho uma ifdeclaração que deve visar a loja e o carrinho do WooCommerce, mas não é. Se eu modificar o PHP após a ifinstrução, nada será alterado. Mas se eu modificar o PHP na elsedeclaração é funciona:

Isso não 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 ?>

Isso 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 ?>

Eu acho que a função WooCommerce pode não estar definida corretamente, porque isso também 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 ?>
Urze
fonte

Respostas:

18

Sua edição me levou a essa ideia, de fato não existe nenhuma função chamada »woocommerce«, existe uma classe » WooCommerce« embora. Uma coisa a ter em atenção é que a verificação precisa ser atrasada o suficiente, para que os plug-ins sejam realmente inicializados, caso contrário - obviamente - a classe não existe e a verificação retorna false. Portanto, seu cheque deve ficar assim:

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

Na página de documentação do WooCommerce » Criando um plugin para o WooCommerce « Encontrei este:

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

Pessoalmente, acho que não é tão confiável quanto checar a turma. Por razões óbvias, e se o nome da pasta / arquivo for diferente, mas também funcionar bem? Além disso, se você fizer assim, há uma função de API que você pode usar, chamada apropriadamente is_plugin_active(). Mas como normalmente só está disponível nas páginas de administração, você deve disponibilizá-lo incluindo wp-admin/includes/plugin.phponde a função reside. Utilizando-o, a verificação ficaria assim:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}
Nicolai
fonte
3
Este poderia ser um jogo divertido "partido", encontrando outras maneiras ;-) Deixe-me juntar-se com if( function_exists( 'WC' ) ), mas é mais preciso ter o nome do plugin na verificação de classe, como você sugeriu ;-)
birgire
2
Na verdade, essa função WC() existe , eu estava apenas tentando encontrar um caminho mais curto referindo-se a ela ;-) Eu acho que seria mais preciso com if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Jogando junto, poderíamos também teste para constantes (por exemplo WOOCOMMERCE_VERSION) ou ações (por exemplo did_action( 'woocommerce_loaded' )) ;-) @ialocin
birgire
1
É verdade que, no final do dia, existem muitas possibilidades! @birgire
Nicolai
1
Sim, ir :) Então WPSE é realmente tipo de é a versão on-line »99 maneiras de resolver os seus problemas PHP / worpress« - Eu tive que cunhar-la, para torná-lo oficial :) @birgire
Nicolai
2
Esta resposta NÃO é confiável. Como nem a pergunta nem a resposta indicam explicitamente o contexto, é possível que o WooCommerce esteja ativo, mas carregado após esse código. Por exemplo, em outro plugin, isso acontece antes de ser carregado. A verificação de classe sugerida é muito mais confiável, se você a incluir adicionalmente no plugins_loaded hook . check_for_woocommerce()add_action('plugins_loaded', 'check_for_woocommerce');
kontur
6

Muitos dos plugins oficiais do WooCommerce resolvem isso verificando a WC_VERSIONconstante, que o WooCommerce define, uma vez que todos os plugins foram carregados. 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);
    }
}

O bônus adicional é que você pode usar o PHP version_compare()para verificar se uma versão nova o suficiente do WooCommerce está instalada (se o código exigir recursos específicos), pois a constante WC_VERSION é adequada para isso.

kontur
fonte
Este é realmente um bom caminho. Boa dica para os desenvolvedores de plugins incluírem também.
Jacob Raccuia
3

Para melhorar as respostas dadas, estamos usando o seguinte:

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

Isso evita dois problemas:

  • O WooCommerce sendo instalado em um diretório não padrão - nesse caso if ( in_array( 'woocommerce/woocommerce.php', apply_filters(..., não funciona.
  • Esta verificação está sendo chamada antes do carregamento do WooCommerce - nesse caso if ( class_exists( 'WooCommerce' ) ) { .. }, não funciona.
Jan Żankowski
fonte
Esta resposta é útil para desenvolvedores de plug-ins, pois você pode apenas agrupar todo o arquivo principal do plug-in com esta instrução SE.
Dave Hilditch
Esta foi a única solução que funcionou para mim no meu plugin! Obrigado!!!
Sam
1

Achei isso útil na documentação do desenvolvedor do WooCommerce.

Você pode simplesmente chamar a is_woocommerce_active()função dentro do seu arquivo de plugin.

Exemplo

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

is_woocommerce_active definido como abaixo, conforme documentação 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
fonte
0

Você pode agrupar seu plug-in em uma verificação para ver se o WooCommerce está instalado e ativo ou não:

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
fonte
3
Isso não funciona com multisites
Andrew Lazarus
@AndrewLazarus Obrigado por mencionar isso - acabei de perder uma hora com esse problema! :)
wickywills