回答:
答えてくれてありがとう。両方の答えが正しい道に私を設定しましたが、誰もすぐに機能しませんでした。だから私は私のソリューションを以下に共有しています。
plugins / parent-plugin / parent-plugin.phpに親プラグインを作成します。
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
plugins / child-plugin / child-plugin.phpに子プラグインを作成します。
<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
register_activation_hook( __FILE__, 'child_plugin_activate' );
function child_plugin_activate(){
// Require parent plugin
if ( ! is_plugin_active( 'parent-plugin/parent-plugin.php' ) and current_user_can( 'activate_plugins' ) ) {
// Stop activation redirect and show error
wp_die('Sorry, but this plugin requires the Parent Plugin to be installed and active. <br><a href="' . admin_url( 'plugins.php' ) . '">« Return to Plugins</a>');
}
}
deactivate_plugins( $plugin );
なんらかの理由で使用していないことに注意してください。そこで、wp_dieを使用してアクティベーションのリダイレクトをキャンセルし、ユーザーに通知しました。
利点:
短所:
plugins / parent-plugin / parent-plugin.phpに親プラグインを作成します。
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
plugins / child-plugin / child-plugin.phpに子プラグインを作成します。
<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
add_action( 'admin_init', 'child_plugin_has_parent_plugin' );
function child_plugin_has_parent_plugin() {
if ( is_admin() && current_user_can( 'activate_plugins' ) && !is_plugin_active( 'parent-plugin/parent-plugin.php' ) ) {
add_action( 'admin_notices', 'child_plugin_notice' );
deactivate_plugins( plugin_basename( __FILE__ ) );
if ( isset( $_GET['activate'] ) ) {
unset( $_GET['activate'] );
}
}
}
function child_plugin_notice(){
?><div class="error"><p>Sorry, but Child Plugin requires the Parent plugin to be installed and active.</p></div><?php
}
利点:
不利益:
アクティブ化リンクを無効にすることに関する私の質問については、私は使用できます:
add_filter( 'plugin_action_links', 'disable_child_link', 10, 2 );
function disable_child_link( $links, $file ) {
if ( 'child-plugin/child-plugin.php' == $file and isset($links['activate']) )
$links['activate'] = '<span>Activate</span>';
return $links;
}
ただし、このコードを配置する場所がないため、非常に非実用的であることが判明しました。このコードを実行するには親プラグインをアクティブにする必要があるため、親プラグインに配置できませんでした。確かに子プラグインまたはfunctions.phpに属していません。だから私はこのアイデアを廃棄しています。
これを試してみてください、コメントされているので、理解するのに役立ちます。
<?php
register_activation_hook( __FILE__, 'myplugin_activate' ); // Register myplugin_activate on
function myplugin_activate() {
$plugin = plugin_basename( __FILE__ ); // 'myplugin'
if ( is_plugin_active( 'plugin-directory/first-plugin.php' ) ) {
// Plugin was active, do hook for 'myplugin'
} else {
// Plugin was not-active, uh oh, do not allow this plugin to activate
deactivate_plugins( $plugin ); // Deactivate 'myplugin'
}
}
?>
これによりエラーがスローされる場合は、「myplugin」の「オプション」を確認し、falseまたはアクティブ化しないように設定することもできます。
推奨される解決策の両方に欠陥があります。
方法1:前述のように、プラグイン管理画面のチェックボックスを使用して親プラグインと子プラグインが同時にアクティブになると、wp_die()画面が表示されます。
方法2:いくつかのユースケースでは、 'plugins_loaded'(https://codex.wordpress.org/Plugin_API/Action_Reference)の後、およびアンインストールフック(https:// codex。 wordpress.org/Function_Reference/register_uninstall_hook)。たとえば、親プラグインがアクティブかどうかに関係なく、アンインストール時にアドオンでコードを実行する場合、このアプローチは機能しません。
溶液:
まず、親プラグインのメインPHPファイルの最後に次のコードを追加する必要があります。
do_action( 'my_plugin_loaded' );
これにより、すべてのサブスクライバーにイベント/シグナルがディスパッチされ、コアプラグインがロードされたことが通知されます。
次に、アドオンのクラスは次のようになります。
class My_Addon
{
static function init ()
{
register_activation_hook( __FILE__, array( __CLASS__, '_install' ) );
if ( ! self::_is_parent_active_and_loaded() ) {
return;
}
}
#region Parent Plugin Check
/**
* Check if parent plugin is activated (not necessarly loaded).
*
* @author Vova Feldman (@svovaf)
*
* @return bool
*/
static function _is_parent_activated()
{
$active_plugins_basenames = get_option( 'active_plugins' );
foreach ( $active_plugins_basenames as $plugin_basename ) {
if ( false !== strpos( $plugin_basename, '/my-plugin-main-file.php' ) ) {
return true;
}
}
return false;
}
/**
* Check if parent plugin is active and loaded.
*
* @author Vova Feldman (@svovaf)
*
* @return bool
*/
static function _is_parent_active_and_loaded()
{
return class_exists( 'My_Plugin' );
}
/**
*
* @author Vova Feldman (@svovaf)
*/
static function _install()
{
if ( ! self::_is_parent_active_and_loaded() ) {
deactivate_plugins( basename( __FILE__ ) );
// Message error + allow back link.
wp_die( __( 'My Add-on requires My Plugin to be installed and activated.' ), __( 'Error' ), array( 'back_link' => true ) );
}
}
#endregion Parent Plugin Check
}
if (My_Addon::_is_parent_active_and_loaded())
{
// If parent plugin already included, init add-on.
My_Addon::init();
}
else if (My_Addon::_is_parent_activated())
{
// Init add-on only after the parent plugins is loaded.
add_action( 'my_plugin_loaded', array( __CLASS__, 'init' ) );
}
else
{
// Even though the parent plugin is not activated, execute add-on for activation / uninstall hooks.
My_Addon::init();
}
それが役に立てば幸い :)
TGM Plugin Activationが必要だと思います。
TGM Plugin Activationは、WordPressテーマのプラグイン(およびプラグイン)を簡単に要求または推奨できるPHPライブラリです。ユーザーは、ネイティブのWordPressクラス、関数、およびインターフェイスを使用して、プラグインを単独または一括でインストール、更新、さらには自動的にアクティブ化することができます。バンドルされたプラグイン、WordPressプラグインリポジトリのプラグイン、またはインターネット上の他の場所でホストされているプラグインを参照できます。
if (is_plugin_active('path/to/plugin.php')) { // Do something }