Dzięki za odpowiedzi chłopaki. Chociaż obie odpowiedzi postawiły mnie na właściwej ścieżce, żadna nie wyszła z pudełka. Dlatego dzielę się moimi rozwiązaniami poniżej.
Metoda 1 - Użycie register_activation_hook:
Utwórz wtyczkę nadrzędną we wtyczkach / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Utwórz wtyczkę podrzędną we wtyczkach / wtyczce podrzędnej / wtyczce podrzędnej.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>');
}
}
Zauważ, że nie używam, deactivate_plugins( $plugin );
ponieważ z jakiegoś powodu to nie działa. Użyłem wp_die, aby anulować przekierowanie aktywacyjne i poinformować użytkownika.
Korzyść:
- Proste rozwiązanie i nie powoduje dodatkowych trafień db w porównaniu z metodą 2
Niedogodności:
- ekran wp_die jest brzydki
- Ekran wp_die nadal będzie wyświetlany, jeśli aktywowałeś wtyczkę nadrzędną i wtyczkę podrzędną w tym samym czasie, korzystając z pól wyboru na ekranie administratora wtyczek.
Metoda 2 - Korzystanie z admin_init i admin_notices
Utwórz wtyczkę nadrzędną we wtyczkach / parent-plugin / parent-plugin.php:
<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/
Utwórz wtyczkę podrzędną we wtyczkach / wtyczce podrzędnej / wtyczce podrzędnej.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
}
Korzyść:
- Działa, gdy aktywujesz wtyczkę Parent i Child w tym samym czasie za pomocą pól wyboru
Niekorzyść:
- Podaj dodatkowe trafienia db, ponieważ wtyczka jest faktycznie aktywowana na początku i dezaktywowana po uruchomieniu admin_init.
Jeśli chodzi o moje pytanie dotyczące wyłączenia linku aktywacyjnego, mogę użyć:
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;
}
Okazało się to jednak bardzo niepraktyczne, ponieważ nie ma miejsca na umieszczenie tego kodu. Nie mogłem umieścić go we wtyczce nadrzędnej, ponieważ wtyczka nadrzędna powinna być aktywna, aby ten kod działał. Z pewnością nie należy do wtyczki potomnej ani funkcji. Php. Więc złomuję ten pomysł.
if (is_plugin_active('path/to/plugin.php')) { // Do something }