Pourquoi certains hooks ne fonctionnent-ils pas dans le contexte de la classe?


16

Je suis assez perplexe sur celui-ci. J'utilise add_action dans ma classe de plugin pour faire certaines choses - ajouter des scripts et des styles à la tête, wp_ajax, etc. Voici les actions, dans le __construct:

function __construct(){
    add_action('admin_menu', array($this, 'sph_admin_menu'));
    add_action('sph_header', array($this, 'sph_callback'));
    add_action('sph_header_items', array($this, 'sph_default_menu'), 1);
    add_action('sph_header_items', array($this, 'sph_searchform'), 2);
    add_action('sph_header_items', array($this, 'sph_social'), 3);

    //Below here they don't work. I have to call these outside of the class (but I need class variables within the functions)
    add_action('wp_print_styles', array(&$this, 'sph_stylesheets'));
    add_action('wp_print_scripts', array(&$this, 'sph_scripts'));
    add_action( 'wp_ajax_nopriv_add_to_list', array(&$this, 'le_add_to_list'));
    add_action( 'wp_ajax_add_to_list', array(&$this, 'le_add_to_list'));
    add_action('init', array(&$this, 'register_menu'));
}

Quelqu'un a déjà rencontré quelque chose comme ça? J'aimerais vraiment savoir comment utiliser ces crochets à l'intérieur d'une classe - c'est tellement compliqué d'avoir des actions en dehors de la classe!


3
avez-vous créé une instance de cette classe? ex: $my_plugin = new MYClass();depuis que j'ai utilisé ces mêmes crochets à partir d'une classe sans problème.
Bainternet

1
De plus, assurez-vous que les fonctions servant de crochets ont une publicvisibilité.
Joseph Leedy

Bainternet ouais je suis. @Joseph ça pourrait être ça. la construction peut-elle être publique? Santé
Harley

@Harley - bainternet demandait créer une instance.
Stephen Harris

@Harley si vous n'incluez pas de modificateur de visibilité, il est automatiquement défini sur public. Je faisais allusion à la fonction réelle qui effectue toute action qui est accrochée.
Joseph Leedy

Réponses:


10

Parfois, certains crochets doivent être tirés à certains moments. Exemple, certains crochets doivent être tirés lors de l' initialisation .

Ajoutez ceci à votre __construct()

add_action('init', array(&$this, 'init'));

Ajoutez ensuite cette fonction, qui contiendra tous les hooks qui doivent être tirés lors de l' initialisation .

public function init(){
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
    add_action('hook_name', array(&$this, 'your_method_name'));
}

Un autre exemple:

add_action( 'init', function () {

    add_action( 'hook_name', 'function_name', 10, 3 );
    add_action( 'hook_name', __NAMESPACE__ . '\namespaced_function_name', 10 );
    add_action( 'hook_name', '\specific\namespace\function_name', 5 );

}, 1 );

Vous voudrez lire sur les crochets et quand ils sont tirés. Vous savez donc quand et où déclencher vos actions. API de plugin / Référence d'action


3

C'est une assez vieille question, mais au cas où quelqu'un chercherait une réponse, j'ai eu un problème similaire. J'ai eu un cours

class Plugin{
  function __construct(){
    add_action('init', array(&$this, 'init'));
  }

  function init(){
    // code...
  }
}

Plugin :: init () n'a jamais été appelé. J'ai alors réalisé mon erreur. Pour instancier la classe, je faisais ceci:

if(class_exists('Plugin')){
    add_action("init", "plugin_init");
    function socialsports_init() {
      global $plugin;
      $plugin = new Plugin;
    }
}

Pour y remédier, je viens de changer le code d'instanciation en:

if(class_exists('Plugin')){
    add_action("init", "plugin_init");
    function socialsports_init() {
      global $plugin;
      $plugin = new Plugin;
      $plugin->init();
    }
}

L'autre option serait d'utiliser un crochet différent dans le constructeur:

function __construct(){
  add_action('wp_loaded', array(&$this, 'init'));
}

Ou un crochet antérieur dans l'instanciation:

add_action("plugins_loaded", "plugin_init");
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.