2011-02-18 11 views
7

Estoy en el proceso de escribir un plugin de Wordpress que crea una página en el área de administración, así como la ejecución de algunos códigos frontales.

El código siguiente arroja un buen error Fatal error: Using $this when not in object context. Lo cual es bastante desconcertante, ya que la variable se llama dentro de la clase.

Tal vez no estoy siguiendo la estructura del plugin de Wordpress para funciones y clases, pero el código conceptual a continuación fue creado usando las entradas relevantes en el desarrollo de plugins en Wordpress Codex.

Podría alguien explicar por qué se desencadena el error, porque cuando creo una instancia de la clase fuera de la base de código de Wordpress todo está bien.

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

Respuesta

9

Por lo tanto, parece que lo he reparado, volviendo a lo básico y haciendo a Google la humilde pregunta: "Usar clases en los plugins de Wordpress".

Tanto el artículo por Jay Fortner y uno en dConstructing.com fueron útiles.

Básicamente, ahora estoy llamando add_menu_page y add_submenu_page desde dentro de la clase. Estaba bajo la impresión de que esas funciones de algún modo crearon un objeto, pero obviamente no lo hacen.

Mi código ahora se ve algo como esto y yo soy capaz de llamar a la variable de clase declarada sin error:

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

Oye ... el código no funciona para mí. Entonces, cambio esta función 'add_action ('admin_menu', 'my_plugin_menu');' a esta 'add_action ('admin_menu', array ($ this, 'my_plugin_menu'));' – KeepMove

1

depende de cómo se llame a la clase, estáticamente Class :: method() arrojará errores. Si ese es el caso, creo que necesita usar self :: $ test; pero podría estar equivocado.

+0

no estoy seguro de cómo Wordpress llama a la clase, pero utilizando self :: prueba en lugar de $ this-> la prueba no resuelve el error, me temo. – mensch

4

Lo que debe hacer es la siguiente:

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

Usando array('MyClass', 'index') causa php para ejecutar el método como methed estático, pero pasar un objeto real como el primer argumento llamará al método a través del objeto.

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

También funcionaría si quiere reutilizar el objeto.

4

Esto ya no es cierto.

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.

Desde: 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') 

O

$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

Dentro de la acción agregué la etiqueta del formulario. Entonces, ¿qué debo pasar en acción y dónde puedo obtener valor de publicación? Gracias por adelantado. –

+0

Comprueba la matriz $ _POST para los valores de publicación. – geilt

Cuestiones relacionadas