क्लास के संदर्भ में कुछ हुक काम क्यों नहीं करते हैं?


16

मैं इस पर बहुत स्टम्प्ड हूं। मैं कुछ चीजों को करने के लिए अपने प्लगइन वर्ग के अंदर add_action का उपयोग कर रहा हूं- लिपियों और शैलियों को सिर पर जोड़ें, wp_ajax, आदि यहां की क्रियाएं हैं, __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'));
}

किसी को कभी भी कुछ इस तरह से भर आया? मैं वास्तव में यह जानना चाहता हूं कि एक वर्ग के भीतर से हुक का उपयोग कैसे किया जाता है- यह इतना गन्दा है कि कक्षा के बाहर की क्रियाएँ करता है!


3
क्या आप इस वर्ग का एक उदाहरण बनाते हैं? ex: $my_plugin = new MYClass();जब से मैं एक ही वर्ग के भीतर से कोई समस्या नहीं के साथ इन एक ही हुक का उपयोग किया है।
बेनेटर्न

1
इसके अतिरिक्त, सुनिश्चित करें कि हुक के रूप में कार्य करने वाले में publicदृश्यता है।
जोसेफ लीडी

बैनटर्न हाँ मैं हूँ। @ जोसेफ यह हो सकता है। निर्माण सार्वजनिक हो सकता है? चीयर्स
हार्ले

@ हार्ले - बैनटर्नेट पूछ रहे थे कि आप एक उदाहरण कहाँ बनाते हैं।
स्टीफन हैरिस

@ हार्ले यदि आप एक दृश्यता संशोधक शामिल नहीं करते हैं, तो यह स्वचालित रूप से जनता के लिए सेट है। मैं वास्तविक कार्य का जिक्र कर रहा था जिसमें जो भी कार्य किया जा रहा है वह निष्पादित होता है।
जोसेफ लीड

जवाबों:


10

कभी-कभी निश्चित समय पर कुछ हुक लगाने की आवश्यकता होती है। उदाहरण के लिए, कुछ हुक पर निष्पादित करने की आवश्यकता init

इसे अपने में जोड़ें __construct()

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

फिर इस फ़ंक्शन को जोड़ें, जिसमें सभी हुक होंगे जिन्हें इनिट पर निकाल दिया जाना चाहिए ।

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'));
}

एक और उदाहरण:

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 );

आप हुक के बारे में पढ़ना चाहेंगे और जब उन्हें निकाल दिया जाएगा। तो आप जानते हैं कि कब और कहां अपने कार्यों को ट्रिगर करना है। प्लगइन एपीआई / एक्शन संदर्भ


3

यह एक बहुत पुराना सवाल है, लेकिन अगर कोई भी उत्तर की तलाश में है, तो मेरे पास एक समान मुद्दा था। मेरी एक क्लास थी

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

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

प्लगइन :: init () कभी नहीं कहा जा रहा था। मुझे तब अपनी गलती का एहसास हुआ। जिस वर्ग के लिए मैं यह कर रहा था उसे तुरंत करने के लिए:

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

इसे ठीक करने के लिए, मैंने सिर्फ तात्कालिकता कोड बदल दिया है:

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

दूसरा विकल्प यह होगा कि कंस्ट्रक्टर में एक अलग हुक का उपयोग करें:

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

या तात्कालिकता में एक पूर्व हुक:

add_action("plugins_loaded", "plugin_init");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.