2011-02-18 11 views
7

Jestem w trakcie pisania wtyczki Wordpress, która tworzy stronę w obszarze administracyjnym, jak również wykonuje kod frontendu.

Poniższy kod wywoła miły błąd Fatal error: Using $this when not in object context. Co jest dość tajemnicze, ponieważ zmienna jest wywoływana wewnątrz klasy.

Może nie podążam za zamierzoną strukturą wtyczek Wordpress dla funkcji i klas, ale poniższy kod koncepcyjny został utworzony przy użyciu odpowiednich wpisów dotyczących rozwoju wtyczek w Kodeksie Wordpress.

Ktoś mógłby wyjaśnić, dlaczego błąd został wywołany, ponieważ kiedy tworzę instancję klasy poza kodem Wordpress wszystko jest w porządku.

if (!class_exists("MyClass")) { 
    class MyClass { 
    var $test = 'Test variable'; 

    public function index() { 
     //Index code 
    } 

    public function add() { 
     echo $this->test; 
    } 
    } 
} 

add_action('admin_menu', 'my_plugin_menu'); 

function my_plugin_menu() { 
    add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array('MyClass', 'index')); 
    add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array('MyClass', 'add')); 
} 

Odpowiedz

9

Wydaje mi się, że to naprawiłem, wracając do podstaw i prosząc Google o skromne pytanie: "Używanie klas w wtyczkach do Wordpressa".

Pomocne były zarówno artykuł od Jay Fortner, jak i jeden pod numerem dConstructing.com.

Zasadniczo nazywam teraz add_menu_page i add_submenu_page z poziomu klasy. Miałem wrażenie, że te funkcje w jakiś sposób stworzyły obiekt, ale oczywiście nie.

Mój kod wygląda teraz coś takiego i jestem w stanie nazwać zmienną klasy zadeklarowane bez błędu:

if (!class_exists("MyClass")) { 
    class MyClass { 
    var $test = 'Test variable'; 

    function __construct() { 
     add_action('admin_menu', 'my_plugin_menu'); 
    } 

    function my_plugin_menu() { 
     add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array(&$this, 'index')); 
     add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array(&$this, 'add')); 
    } 

    public function index() { 
     //Index code 
    } 

    public function add() { 
     echo $this->test; 
    } 
    } 
    new MyClass; 
} 
+0

Hej ..., kod nie działa dla mnie. Tak więc zmieniam tę funkcję 'add_action ('admin_menu', 'my_plugin_menu');' do tego 'add_action ('admin_menu', array ($ this, 'my_plugin_menu'));' – KeepMove

1

zależy od tego, jak klasa jest wywoływana, statycznie klasa :: metoda() będzie generować błędy. Jeśli tak jest, myślę, że musisz użyć testu self :: $; ale może być nie tak.

+0

Nie jestem pewien, jak Wordpress zwraca klasę, ale przy użyciu self :: testu zamiast $ this-> test nie rozwiązuje błędu, obawiam się. – mensch

4

Co należy zrobić, jest następujący:

function my_plugin_menu() 
{ 
add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array(new MyClass, 'index')); 
add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array('MyClass', 'add')); 
} 

Korzystanie array('MyClass', 'index') przyczynę php do wykonania metody jako statyczny metate, ale przekazanie rzeczywistego obiektu jako pierwszego argumentu wywoła metodę przez obiekt.

function my_plugin_menu() 
{ 
    $Class = new MyClass(); 
    add_menu_page(
     'My Plugin', 
     'My Plugin', 
     'manage_options', 
     'my-plugin', 
     array($Class, 'index') 
    ); 
} 

Działał również, jeśli chcesz ponownie użyć obiektu.

4

To już nie jest prawdą.

Don't forget, if you pass in the class, you may want to pass it by reference, you can even pass a classes own functions using &$this inside of a class and continue to modify the same instance, this helps to not have to recreate a class everytime you call a different part of the plugin but the same class.

Od: https://codex.wordpress.org/Function_Reference/do_action_ref_array

As of PHP 5.4, the array is no longer passed by reference despite the function's name. You cannot even use the reference sign '&' because call time pass by reference now throws an error. What you can do is pass the reference pointer as an array element. Doing so does require all callbacks added to the action to expect a reference pointer. This is not something you will see in WordPress actions. This technique is provided for informational purposes only.

$Class = new MyClass(); 
add_menu_page(
     'My Plugin', 
     'My Plugin', 
     'manage_options', 
     'my-plugin', 
     array(&$Class, 'index') 

Or

$myClass= new MyClass ; 

add_action('admin_menu', array($myClass, 'admin_menu')); 

class MyClass 
{ 
    public function admin_menu() 
    { 
     add_menu_page('MyMenu', 'MyMenu', 'read', 'mymenu', array($this, 'action')); 
    } 
    public function action() 
    { 
     //Do something here 
    } 
} 
+0

Wewnątrz akcji dodałem tag formularza. Więc co powinienem przekazać w akcji i gdzie mogę uzyskać wartość postu? Z góry dziękuję. –

+0

Sprawdź tablicę $ _POST dla wartości postów. – geilt

Powiązane problemy