Estoy en el proceso de escribir un complemento de WordPress que crea una página en el área de administración, además de ejecutar un código de interfaz.
El siguiente código arroja un buen Fatal error: Using $this when not in object context
error. Lo cual es bastante desconcertante, ya que la variable se llama dentro de la clase.
Tal vez no estoy siguiendo la estructura del complemento de WordPress prevista para funciones y clases, pero el código conceptual a continuación se creó usando las entradas relevantes sobre el desarrollo de complementos en el Codex de WordPress.
¿Alguien podría explicar por qué se activa el error? Porque cuando creo una instancia de la clase fuera del código base 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'));
}
mensch
Entonces, parece que lo he solucionado, volviendo a lo básico y haciéndole a Google la humilde pregunta: “Uso de clases en complementos de WordPress”.
Tanto el artículo de jay fortner y uno en dConstructing.com fueron útiles.
Básicamente, ahora estoy llamando a add_menu_page y add_submenu_page desde dentro de la clase. Tenía la impresión de que esas funciones de alguna manera creaban un objeto, pero obviamente no lo hacen.
Mi código ahora se parece a esto y puedo 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;
}
-
Oye…, el código no funciona para mí. Entonces, cambio esto
add_action('admin_menu', 'my_plugin_menu');
función a estoadd_action('admin_menu', array($this, 'my_plugin_menu'));
– Ari
12 de junio de 2014 a las 15:32
geilt
Esto ya no es verdad.
No olvide, si pasa la clase, es posible que desee pasarla por referencia, incluso puede pasar las funciones propias de una clase usando &$this dentro de una clase y continuar modificando la misma instancia, esto ayuda a no tener para recrear una clase cada vez que llama a una parte diferente del complemento pero a la misma clase.
De: https://codex.wordpress.org/Function_Reference/do_action_ref_array
A partir de PHP 5.4, la matriz ya no se pasa por referencia a pesar del nombre de la función. Ni siquiera puede usar el signo de referencia ‘&’ porque el tiempo de llamada pasa por referencia ahora arroja un error. Lo que puede hacer es pasar el puntero de referencia como un elemento de matriz. Hacerlo requiere que se agreguen todas las devoluciones de llamada a la acción para esperar un puntero de referencia. Esto no es algo que verá en las acciones de WordPress. Esta técnica se proporciona únicamente con fines informativos.
$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
}
}
-
Dentro de la acción agregué una etiqueta de formulario. Entonces, ¿qué debo pasar en acción y dónde puedo obtener valor de publicación? Gracias por adelantado.
– Vishal Tanna
9 dic 2016 a las 12:39
-
Verifique la matriz $_POST para conocer los valores de publicación.
– geilt
12 dic 2016 a las 17:34
Lo que debes hacer es lo 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')
hace que php ejecute el método como un método estático, pero pasar un objeto real como 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 desea reutilizar el objeto.
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.