web-dev-qa-db-fra.com

Quand is_admin () est-il disponible?

Je vois beaucoup de plugins qui consistent en une classe instanciée dans le même fichier, par exemple:

class My_Plugin {

  function __construct() {
    add_action('init', array( __CLASS__, 'baz' ) ); 
  }

  static function baz() {
    // some stuff that should happen in admin
  }

}

new My_Plugin();

Maintenant, cela fonctionnerait pour envelopper le fonctionnement interne de chaque fonction dans une condition, mais pourrais-je envelopper les instructions add_action() dans if( is_admin() ) et éviter de gonfler les listes de filtres respectives du site?

2
Isaac Lubow

Quand is_admin () est-il disponible?

À peu près partout. Le seul exemple que je puisse imaginer où il ne serait pas disponible, concerne les fichiers très précoces tels que wp-config.php, et certains drop-ins. Mais au moment où un mu-plugin, un thème ou un plugin est chargé, il est présent.

Maintenant, cela fonctionnerait pour envelopper le fonctionnement interne de chaque fonction dans une condition, mais pourrais-je envelopper les instructions add_action () dans if (is_admin ()) à la place et éviter de gonfler les listes de filtres respectives du site?

Oui, mais dans l'exemple que vous avez donné, il est plus facile de simplement accrocher à admin_init. Ajouter des éléments aux hooks n'est pas cher, c'est ce qui se produit lorsque le hook se déclenche et que la fonction est coûteuse.

Quelques notes supplémentaires

Je vois beaucoup de plugins qui consistent en une classe instanciée dans le même fichier, par exemple:

C'est une mauvaise pratique, vous avez raison de la remettre en question et ne devrait pas être copiée. Ne créez pas d'objet dans le même fichier que sa classe est définie, cela pose des problèmes.

function __construct() {
  add_action('init', array( __CLASS__, 'baz' ) ); 
}

Cela signifie que dès que vous créez cet objet, il enregistre les points d'ancrage et commence à faire des choses. Cela peut être gênant ou créer des problèmes qui sont facilement évités en ayant une fonction run ou start. Cela rend également l’écriture des tests unitaires très difficile, voire impossible dans certains cas. Un constructeur devrait préparer l'objet au travail, mais il ne devrait pas le faire. Pensez-y comme acheter une machine à laver ou laver des vêtements avec. Un constructeur peut assembler la machine et la préparer, mais il est pratique de pouvoir dire quand et si elle fonctionne

   add_action('init', array( __CLASS__, 'baz' ) ); 
 }

 static function baz() {

La fonction bar étant statique, si plusieurs objets étaient créés, baz serait exécuté plusieurs fois.

new My_Plugin();

Il y a quelques problèmes ici:

  • Le chargement du fichier crée immédiatement un objet et fait des choses. Vous ne voudrez peut-être pas encore le faire, alors vous en aurez perdu le contrôle
  • L'objet créé n'est jamais assigné, il est simplement laissé en suspens. Cela rend les traces de pile et le débogage beaucoup plus difficiles à faire car c'est maintenant une classe anonyme
  • Parce que c'est anonyme, vous ne pouvez jamais décrocher aucune de ses actions. Pour ce faire, vous avez besoin d'une référence à l'objet, mais c'est impossible ici

Le TLDR de la réponse d'origine est cependant que vous pouvez compter sur la disponibilité de is_admin et que vous ne devriez jamais rencontrer de situation dans un plugin ou un thème où elle n'est pas disponible

2
Tom J Nowell