클래스 컨텍스트 내에서 일부 후크가 작동하지 않는 이유는 무엇입니까?


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
이 클래스의 인스턴스를 작성 했습니까? 예 : $my_plugin = new MYClass();클래스에서 문제없이 동일한 후크를 사용했기 때문에.
Bainternet

1
또한 후크 역할을하는 기능에 public가시성 이 있는지 확인하십시오 .
Joseph Leedy

Bainternet 네 맞습니다. @Joseph 그게 될 수 있습니다. 건설 할 수 있습니까? 건배
할리

@Harley-bainternet은 인스턴스를 어디에서 만들지 묻고있었습니다 .
Stephen Harris

@Harley 가시성 수정자를 포함하지 않으면 자동으로 public으로 설정됩니다. 나는 실제 기능을 언급하고 있었지만 어떤 행동을하고 있는지를 수행했습니다.
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 );

고리에 관한 정보와 발사시기를 읽어보십시오. 따라서 언제 어디서 액션을 트리거 할 것인지 알 수 있습니다. 플러그인 API / 액션 참조


3

이것은 매우 오래된 질문이지만 누군가 답을 찾고있는 경우 비슷한 문제가 있습니다. 나는 수업을했다

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

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

플러그인 : : 초기화 ()가 호출되지 않았습니다. 그런 다음 실수를 깨달았습니다. 클래스를 인스턴스화하기 위해 나는 이것을하고 있었다 :

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");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.