Bagaimana cara memeriksa apakah plugin (WooCommerce) aktif?

9

Saya mencoba mengubah kepala dan kaki halaman WooCommerce saya. Saya memiliki ifpernyataan yang seharusnya menargetkan toko dan gerobak WooCommerce, tetapi tidak. Jika saya memodifikasi PHP setelah ifpernyataan tidak ada perubahan. Tetapi jika saya memodifikasi PHP dalam elsepernyataan itu berfungsi:

Ini tidak berfungsi:

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

Ini berhasil:

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

Saya pikir fungsi WooCommerce mungkin tidak didefinisikan dengan benar, karena ini juga berfungsi:

<?php if (is_cart() || is_shop()): ?>
        <?php get_template_part('inc/header-shop'); ?>
    <?php else: ?>
        <?php get_template_part('inc/page-header'); ?>
    <?php endif ?>
Heather
sumber

Jawaban:

18

Hasil edit Anda membuat saya pada gagasan ini, meskipun tidak ada fungsi yang disebut »woocommerce«, ada kelas » WooCommerce« sekalipun. Satu hal yang perlu diperhatikan adalah, bahwa cek harus cukup terlambat, sehingga plug-in sebenarnya diinisialisasi, jika tidak - jelas - kelas tidak akan ada dan cek kembali false. Jadi cek Anda akan terlihat seperti ini:

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

Pada halaman dokumentasi WooCommerce » Membuat plugin untuk WooCommerce « Saya telah menemukan ini:

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

Secara pribadi saya pikir itu hampir tidak dapat diandalkan seperti memeriksa kelas. Untuk alasan yang jelas, bagaimana jika folder / nama file berbeda, tetapi harus berfungsi dengan baik juga. Selain itu jika Anda melakukannya seperti ini, maka ada fungsi API yang dapat Anda gunakan, sesuai namanya is_plugin_active(). Tetapi karena biasanya hanya tersedia di halaman admin, Anda harus membuatnya tersedia dengan menyertakan wp-admin/includes/plugin.php, tempat fungsi berada. Menggunakannya cek akan terlihat seperti ini:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}
Nicolai
sumber
3
Ini bisa menjadi permainan "pesta" yang menyenangkan, menemukan cara lain ;-) Biarkan saya bergabung if( function_exists( 'WC' ) ), tetapi lebih akurat untuk memiliki nama plugin di cek kelas, seperti yang Anda sarankan ;-)
birgire
2
Sebenarnya fungsi ini WC() ada , saya hanya mencoba mencari cara yang lebih singkat dengan merujuknya ;-) Saya kira itu akan lebih akurat dengan if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-). Bermain bersama, kita juga bisa menguji konstanta (mis. WOOCOMMERCE_VERSION) Atau aksi (mis did_action( 'woocommerce_loaded' )) ;-) @ialocin
birgire
1
Benar, pada akhirnya ada banyak kemungkinan! @birgire
Nicolai
1
Ya, lanjutkan :) Jadi WPSE sebenarnya adalah versi online dari »99 cara untuk menyelesaikan masalah PHP / WorPress Anda« - Saya harus membuat koin, untuk menjadikannya resmi :) @ birgire
Nicolai
2
Jawaban ini BUKAN andal. Karena pertanyaan atau jawabannya tidak secara eksplisit menyatakan konteksnya, ada kemungkinan WooCommerce aktif, tetapi dimuat setelah kode ini. Misalnya di plugin lain, itu terjadi untuk dimuat sebelumnya. Pemeriksaan kelas yang disarankan jauh lebih dapat diandalkan, jika Anda juga membungkusnya dengan hook plugins_loaded . Yaitu membungkus if-klausa dalam suatu check_for_woocommerce()fungsi, dan mendaftarkannya denganadd_action('plugins_loaded', 'check_for_woocommerce');
kontur
6

Banyak plugin WooCommerce resmi menyelesaikan masalah ini dengan memeriksa WC_VERSIONkonstanta, yang didefinisikan oleh WooCommerce, setelah semua plugin dimuat. Kode sederhana:

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);
    }
}

Bonus tambahannya adalah Anda dapat menggunakan PHP version_compare()untuk memeriksa lebih lanjut apakah versi WooCommerce yang cukup baru diinstal (jika kode Anda memerlukan kemampuan khusus), karena konstanta WC_VERSION cocok untuk ini.

kontur
sumber
ini cara yang sangat bagus. Tip yang bagus untuk dimasukkan oleh pengembang plugin.
Jacob Raccuia
3

Untuk meningkatkan jawaban yang diberikan, kami menggunakan ini:

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

Ini mencegah dua masalah:

  • WooCommerce diinstal di direktori non-standar - dalam hal if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...ini tidak berfungsi.
  • Pemeriksaan ini dipanggil sebelum WooCommerce dimuat - dalam hal if ( class_exists( 'WooCommerce' ) ) { .. }ini tidak berfungsi.
Jan Żankowski
sumber
Jawaban ini berguna untuk pengembang plugin karena Anda bisa membungkus seluruh file utama plugin Anda dengan pernyataan IF ini.
Dave Hilditch
Ini adalah satu-satunya solusi yang bekerja untuk saya di plugin saya! Terima kasih!!!
Sam
1

Saya menemukan ini berguna dari dokumentasi pengembang WooCommerce.

Anda cukup memanggil is_woocommerce_active()fungsi di dalam file plugin Anda.

Contoh

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

is_woocommerce_active didefinisikan seperti di bawah ini sesuai dokumentasi 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
sumber
0

Anda dapat membungkus plugin Anda dengan tanda centang untuk melihat apakah WooCommerce diinstal dan aktif atau tidak:

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
sumber
3
Ini tidak berfungsi dengan multisite
Andrew Lazarus
@AndrewLazarus Terima kasih telah menyebutkan itu - Saya baru saja kehilangan satu jam untuk masalah ini! :)
wickywills