web-dev-qa-db-ja.com

アクティブプラグインでis_plugin_active()がfalseを返す

だから私は私のテーマファイルのインクルードに次のものがあります:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php' ) ) {
  $shop_id = woocommerce_get_page_id( 'shop' );
  $shop_page = get_page( $shop_id );
}

しかし、プラグインがアクティブであるという事実にもかかわらず、is_plugin_active( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php')はfalseを返しています。

customize_preview_initに夢中になっている間にこれをやっているということだけが問題を起こすことが想像できる唯一の問題なので、is_plugin_active()がテーマカスタマイザによってトリップアップされるのではないかと思います。何か洞察がありますか?

6
Brian

is_plugin_active()はプラグインのベース名だけをパラメータとして期待します。

だから使用:

is_plugin_active( 'woocommerce/woocommerce.php' );

この関数はオプション'active_plugins'を使用します。これは既にプラグインディレクトリからの相対パスのリストです。

マルチサイトインストールではget_site_option( 'active_sitewide_plugins')も検索します。

実装上の注意として:これらのチェックを避けてください。一部のユーザーはプラグイン名またはディレクトリの名前を変更します。代わりに実際に使用する機能をテストしてください。

if ( function_exists( 'woocommerce_get_page_id' ) )
{
    // do something
}
18
fuxia

どのプラグインがアクティブになっているのかわからない場合は、次の操作を行います。

// get array of active plugins
$active_plugins = (array) get_option( 'active_plugins', array() );
// see active plugins 'plugin-dir-name/plugin-base-file.php'
echo '<pre>';
print_r( $active_plugins );
echo '</pre>';
if ( ! empty( $active_plugins ) && in_array( 'plugin-dir-name/plugin-base-file.php', $active_plugins ) ) {
    // do something if plugin is active
}

参考のために 'wp-admin/includes/plugin.php'内のis_plugin_active関数を調べてください。

function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
2
Aamer Shahzad