ทำไม hooks บางอันไม่ทำงานในบริบทของคลาส?


16

ฉันค่อนข้างนิ่งงันกับสิ่งนี้ ฉันใช้ add_action ภายในปลั๊กอินของฉันเพื่อทำบางสิ่ง - เพิ่มสคริปต์และสไตล์ไว้ที่ส่วนหัว wp_ajax ฯลฯ นี่คือการกระทำในโครงสร้าง __:

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

มีใครเคยเจอเรื่องแบบนี้บ้างไหม? ฉันอยากรู้วิธีใช้ hooks พูดจากภายในห้องเรียน - มันยุ่งมากกับการกระทำนอกห้องเรียน!


3
คุณสร้างตัวอย่างของคลาสนี้หรือไม่ เช่น$my_plugin = new MYClass();ฉันได้ใช้ hooks อันเดียวกันนี้จากในชั้นเรียนโดยไม่มีปัญหา
Bainternet

1
นอกจากนี้ตรวจสอบให้แน่ใจว่าฟังก์ชั่นที่ทำหน้าที่เป็นตะขอมีpublicการมองเห็น
Joseph Leedy

Bainternet ใช่ฉันเป็น @ โจเซฟที่อาจเป็นได้ สามารถสร้างเป็นสาธารณะได้หรือไม่ ไชโย
ฮาร์เลย์

@Harley - bainternet กำลังถามว่าคุณจะสร้างอินสแตนซ์ที่ไหน
Stephen Harris

@Harley หากคุณไม่มีตัวแก้ไขการมองเห็นมันจะถูกตั้งค่าเป็นสาธารณะโดยอัตโนมัติ ฉันหมายถึงฟังก์ชั่นที่เกิดขึ้นจริงการดำเนินการใด ๆ ที่จะถูกติดยาเสพติด
Joseph Leedy

คำตอบ:


10

บางครั้งต้องใช้ตะขอบางอันในเวลาที่แน่นอน ตัวอย่างเช่นตะขอบางส่วนจะต้องมีการยิงinit

เพิ่มไปยังของคุณ __construct()

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

แล้วเพิ่มฟังก์ชั่นนี้ซึ่งจะมีตะขอทั้งหมดที่จะต้องมีการยิง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 );

คุณจะต้องอ่านเกี่ยวกับ hooks และเมื่อพวกเขาถูกไล่ออก ดังนั้นคุณจะรู้ว่าเมื่อไรและที่ไหนที่จะกระตุ้นการกระทำ ปลั๊กอิน API / การอ้างอิงการกระทำ


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

หรือเบ็ดก่อนหน้าใน instantiation:

add_action("plugins_loaded", "plugin_init");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.