プラグイン(WooCommerce)がアクティブかどうかを確認するにはどうすればよいですか?


9

WooCommerceページの頭と足を変更しようとしています。私が持っているifWooCommerceのお店やカートをターゲットとすることになっている文を、そうではありません。ifステートメントの後にPHPを変更しても、何も変わりません。しかし、elseステートメントでPHPを変更すると、次のように機能します。

これは機能しません:

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

これは機能します:

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

これも機能するため、WooCommerce関数は適切に定義されていない可能性があります。

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

回答:


18

あなたの編集はこの考えに私を導いてくれました、確かに»woocommerce«という関数はありません、WooCommerceしかしクラス» «があります。注意すべきことの1つは、プラグインが実際に初期化されるようにチェックが十分に遅れる必要があることです。それ以外の場合-明らかに-クラスは存在せず、チェックはを返しますfalse。したがって、チェックは次のようになります。

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

WooCommerceドキュメントページ» WooCommerceのプラグインの作成 «私はこれを見つけました:

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

個人的には、クラスをチェックするほど信頼性は低いと思います。明白な理由で、フォルダ/ファイル名が異なる場合はどうなりますか?さらに、このようにすると、適切に名前が付けられis_plugin_active()た、使用可能なAPI関数があります。ただし、通常は管理ページでのみ使用できるためwp-admin/includes/plugin.php、関数が存在する場所にを含めることで使用可能にする必要があります。これを使用すると、チェックは次のようになります。

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
  // some code
} else {
  / more code
}

3
これは私が持つに参加してみましょう;-)他の方法を見つけること、楽しい「パーティー」のゲームかもしれないif( function_exists( 'WC' ) )が、それはあなたが示唆したように;-)、クラスチェックでプラグイン名を持つことが、より正確だ
birgire

2
実際にはこの関数WC() が存在します。私はそれを参照することでより短い方法を見つけようとしていました;-)私はそれがより正確になると思います if( function_exists( 'WC' ) && is_object( WC() ) && is_a( WC(), 'WooCommerce' ) );-) 一緒に遊んで、定数(例WOOCOMMERCE_VERSION)またはアクション(例did_action( 'woocommerce_loaded' ))をテストすることもできます;-) @ialocin
birgire

1
確かに、結局のところ、多くの可能性があります!@birgire
Nicolai

1
うん、それを行く:)だから、WPSEは一種の実際には、あなたのPHP / WorPressの問題を«解決するために»99の方法のオンライン版である-私はそれが公式:) @birgire作るために、それをコインしなければならなかった
ニコライ

2
この答えは信頼できません。質問も回答もコンテキストを明示的に述べていないため、WooCommerceはアクティブですが、このコードの後に​​読み込まれる可能性があります。たとえば、別のプラグインでは、たまたまロードされます。plugins_loadedフックでさらにラップすると、提案されたクラスチェックははるかに信頼性が高くなります。つまり、if句をcheck_for_woocommerce()関数にラップして登録しますadd_action('plugins_loaded', 'check_for_woocommerce');
kontur

6

公式のWooCommerceプラグインの多くは、WC_VERSIONすべてのプラグインがロードされると、WooCommerceが定義する定数をチェックすることでこれを解決します。簡略化されたコード:

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

追加のボーナスはversion_compare()、WC_VERSION定数がこれに適しているため、PHPを使用してWooCommerceの十分に新しいバージョンがインストールされているかどうかをさらにチェックできることです(コードに特定の機能が必要な場合)。


これは本当に良い方法です。プラグイン開発者も含めるための良いヒント。
Jacob Raccuia

3

与えられた答えを改善するために、これを使用します:

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

これにより、2つの問題が回避されます。

  • WooCommerceが標準以外のディレクトリにインストールされている-この場合、if ( in_array( 'woocommerce/woocommerce.php', apply_filters(...機能しません。
  • このチェックは、WooCommerceがロードされる前に呼び出されます-この場合、if ( class_exists( 'WooCommerce' ) ) { .. }機能しません。

この回答は、プラグインのメインファイル全体をこのIFステートメントでラップするだけなので、プラグイン開発者に役立ちます。
Dave Hilditch、

これは私のプラグインで私のために働いた唯一の解決策でした!ありがとうございました!!!
サム

1

これはWooCommerce開発者のドキュメントから有用であることがわかりました。

is_woocommerce_active()プラグインファイル内で関数を呼び出すだけです。

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

is_woocommerce_activeは、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; }
    }
}

0

プラグインをチェックにラップして、WooCommerceがインストールされていてアクティブかどうかを確認できます。

if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
echo 'WooCommerce is active.';
} else {
echo 'WooCommerce is not Active.';
}

3
これはマルチサイトでは機能しません
Andrew Lazarus

@AndrewLazarus言及していただきありがとうございます-私はこの問題で1時間失われました!:)
wickywills
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.