web-dev-qa-db-fra.com

Est-il possible d'arrêter l'activation d'un thème lorsqu'un certain plugin n'est pas activé

Je prépare donc un thème qui dépendra d'un plugin (par exemple Timber ou Themosis ). Alors bien sûr, un thème se cassera s'il ne peut pas utiliser, cela dépend du plugin. Donc, je voudrais un moyen d'empêcher l'utilisateur d'activer un thème qui a besoin d'un plugin pour fonctionner, mais plutôt de montrer un message d'erreur convivial contenant le plugin nécessaire.

Jusqu'ici, j'ai découvert comment vérifier si un plugin est installé ou non ( link ), mais comment arrêter l'activation du thème si c'est possible à tout?

J'ai aussi découvert les actions switch_theme et after_switch_theme.

Donc, ce qui me manque en ce moment, c'est un moyen d'arrêter l'activation réelle. Est-ce possible?

edit: trouvé ceci pour afficher les notifications/avertissements de l'administrateur.

1
Ilyes512

Utiliser after_switch_theme activera le thème (ce qui est correct car nous souhaitons exécuter la vérification dans le contexte du nouveau thème).

Si les dépendances ne sont pas remplies ($missing_dependencies = true;), nous revenons instantanément au thème précédemment utilisé (transmis via after_switch_theme et $oldtheme).

add_action( 'after_switch_theme', 'check_theme_dependencies', 10, 2 );
function check_theme_dependencies( $oldtheme_name, $oldtheme ) {
  if ( $missing_dependencies ) :

    // Update default admin notice: Theme not activated.
    add_filter( 'gettext', 'update_activation_admin_notice', 10, 3 );

    // Custom styling for default admin notice.
    add_action( 'admin_head', 'error_activation_admin_notice' );

    // Switch back to previous theme.
    switch_theme( $oldtheme->stylesheet );
      return false;

  endif;
}

function update_activation_admin_notice( $translated, $original, $domain ) {
    // Strings to translate.
    $strings = array(
        'New theme activated.' => 'Theme not activated.'
    );

    if ( isset( $strings[$original] ) ) {
        // Translate but without running all the filters again.
        $translations = get_translations_for_domain( $domain );
        $translated = $translations->translate( $strings[$original] );
    }

    return $translated;
}

function error_activation_admin_notice() {
  echo '<style>#message2{border-left-color:#dc3232;}</style>';
}

Vous pouvez utiliser l'extrait de code ci-dessus dans votre functions.php, mais assurez-vous que after_switch_theme est appelé avant les dépendances requises.

Mise à jour: Il ne semble pas être un moyen simple d'empêcher la notification de l'administrateur de se déclencher via la fonction switch_theme. Remplacer le message via le filtre gettext semble être une bonne solution de contournement.

Merci à @ alpipego de me dire comment écraser des chaînes dans WordPress Core :)

Lectures supplémentaires: Modification des chaînes principales de WordPress

6
Sven

Je ne sais pas comment empêcher le changement de thème (bien qu'il puisse y avoir un moyen), mais je peux penser à une solution de contournement.

after_switch_theme passe l'ancien nom de thème à travers ...

do_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );

... vous devriez donc pouvoir vérifier le plug-in de cette action, puis réinitialiser l'ancien thème si le plug-in n'est pas actif/présent. La fonction switch_theme() vous permettra de changer de thème par programmation. Il suffit de passer une limace de feuille de style. Je viens de répondre à une question relative qui aidera sûrement à résoudre ce problème.

1
s_ha_dum

Je pense que cela n'empêchera personne d'activer un thème, mais voici une classe pour attacher des dépendances de plugins à des thèmes (ou à d'autres plugins): https://github.com/thomasgriffin/TGM-Plugin-Activation

À tout le moins, tous les avis d'interface utilisateur sont ajoutés, de sorte que l'administrateur sait qu'ils manquent quelque chose. Il ajoute même des liens pour installer les dépendances manquantes. Plutôt cool.

0
MathSmath

Ne pourriez-vous pas simplement inclure le plugin avec le thème, si vous en développez un? Les inconvénients de cette approche incluent le fait de ne pas mettre à jour le plug-in séparément, mais si votre thème dépend d'une version particulière d'un plug-in, il peut fonctionner correctement, à condition de corriger le plug-in souhaité.

0
user51165