Danke für die Antworten Jungs. Obwohl beide Antworten mich auf den richtigen Weg brachten, funktionierte keiner sofort. Also teile ich meine Lösungen unten.
Methode 1 - register_activation_hook verwenden:
Erstelle das Parent Plugin in der Datei plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Erstellen Sie das Child Plugin in der Datei 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>');
}
}
Beachten Sie, dass ich deactivate_plugins( $plugin );
aus irgendeinem Grund nicht benutze, es funktioniert nicht. Deshalb habe ich wp_die verwendet, um die Aktivierungsumleitung abzubrechen und den Benutzer zu informieren.
Vorteil:
- Einfache Lösung und keine zusätzlichen Datenbank-Treffer im Vergleich zu Methode 2
Nachteile:
- wp_die bildschirm ist hässlich
- Der wp_die-Bildschirm wird NOCH angezeigt, wenn Sie das übergeordnete Plugin und das untergeordnete Plugin gleichzeitig über die Kontrollkästchen im Verwaltungsbildschirm des Plugins aktiviert haben.
Methode 2 - Verwenden von admin_init und admin_notices
Erstelle das Parent Plugin in der Datei plugins / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Erstellen Sie das Child Plugin in der Datei 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
}
Vorteil:
- Funktioniert, wenn Sie das übergeordnete und das untergeordnete Plugin gleichzeitig mithilfe von Kontrollkästchen aktivieren
Nachteil:
- Es kommt zu zusätzlichen Datenbank-Treffern, da das Plugin zuerst aktiviert und nach Ausführung von admin_init deaktiviert wird.
Bei meiner Frage zum Deaktivieren des Aktivierungslinks könnte ich Folgendes verwenden:
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;
}
Es stellte sich jedoch als äußerst unpraktisch heraus, da es KEINEN Platz gibt, um diesen Code zu platzieren. Ich konnte es nicht auf das übergeordnete Plugin setzen, da das übergeordnete Plugin aktiv sein sollte, damit dieser Code ausgeführt wird. Gehört mit Sicherheit nicht zu child plugin oder functions.php. Also verschrotte ich diese Idee.
if (is_plugin_active('path/to/plugin.php')) { // Do something }