플러그인의 사용자 정의 위젯 기능이 작동하지 않습니까?


15

나는 내가 만든 테마 중 하나에서 바로 코드를 가져 갔으며, 정렬되지 않은 목록에 50 개의 모든 상태 목록이 있습니다. 위젯에 끌어서 놓을 수있는 위젯으로 포장되었습니다.

문제는 PLUGIN 파일 에서이 코드를 사용하려고하면 다음 오류가 발생한다는 것입니다.

Fatal error: Call to a member function register() on a non-object in C:\xampp\htdocs\wordpress\wp-includes\widgets.php on line 431

왜 테마에서는 작동하지만 플러그인에서는 작동하지 않습니까? 그건 그렇고, 활성 테마는 내가 코드에서 가져온 테마가 아닙니다.

여기 내 코드가 있습니다 : http://pastebin.com/ZeRWW3yb

감사.

답변:


15

교체를 시도하십시오 :

register_widget('States_Widget');

와:

add_action('widgets_init', 'register_states_widget');
function register_states_widget() {
    register_widget('States_Widget');
}

기꺼이 도울 수있다
Bainternet

2
한 줄짜리 : add_action ( 'widgets_init', create_function ( '', 'return register_widget ( "States_Widget");'));
Zachary Schuessler 13:13에

3
이러한 단일 라이너는 사용자가 remove_action을 실행하려는 경우 제거 할 수있는 후크 기능이 없기 때문에 사용할 수 없다는 심각한 단점이 있습니다.
Elliot

1

위젯 이름을 인수로 전달하여 클래스 메소드 내에서 위젯을 초기화해야한다고 가정하십시오. 이를 달성하려면 다음을 수행하십시오.

class WidgetMonster {
    /**
     * Register widget via PHP lambda function as an argument to the add_action function
     * @var $widget_name string | WP_Widget.
     */
    public static function register_widget_helper( $widget_name ) {
        add_action('widgets_init',
            function() use ( &$widget_name ) {
                return register_widget( $widget_name );
            }
        );
    }
}

변수 $widget_name이름을 사용 하려면 변수 이름을 람다 함수에 전달해야 합니다. 이 작업을 수행하는 부분은 use (&$widget_name)입니다. 이미 언급했듯이 이와 같이 초기화 된 후크는에 의해 제거 될 수 없습니다 remove_action.

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