Вызовите внешний объект в функции класса во время обратного вызова
Вопрос
У меня класс, который имеет функцию, которая проверяет и создает таблицу в базе данных. Для этого мне нужно использовать объект WordPress $ WPDB.
Мне нужна функция, чтобы запустить только на первой активации плагина, поэтому я использую функцию:
register_activation_hook ( __FILE__, array( 'MemorialCandles', 'dbInstall' ) );
Проблема в том, что я всегда получаю эту ошибку:
Фактальная ошибка: используя $ this, когда не в контексте объекта в /HOME/xxx/xxx/wordpress/wp-content/plugins/memorialcandles/memorial-candles.class.php в строке 77
Код класса:
<?php
// Global Variables:
global $wpdb;
register_activation_hook ( __FILE__, array( 'MemorialCandles', 'dbInstall' ) );
/**
* Class: MemorialCandles
*
* Provides skeleton to the plugin and handles queries and action.
*
* @author Dor Zuberi <dor@zubri.me>
* @copyright 2011 Dor Zuberi
* @license http://www.php.net/license/3_01.txt
*/
class MemorialCandles
{
// Variables
/**
* @var string stores plugin direction - RTL or LTR.
*/
private $pluginDirection;
/**
* @var string stores the plugin database table name.
*/
private $tableName;
// Constructor
/**
* Initiates the plugin, stores and configure the basic setup procedures.
*
* @return void
*/
function __construct()
{
global $wpdb;
$this->tableName = $wpdb->prefix . 'memorialcandles';
}
// Getters
// Setters
// Methods
/**
* Handles the database table creation.
*
* @return void
*/
function dbInstall()
{
global $wpdb;
if( $wpdb->get_var( "SHOW TABLES LIKE `{$this->tableName}`" ) != $this->tableName )
{
$sql = "CREATE TABLE `{$this->tableName}` (
id int(8) NOT NULL AUTO_INCREMENT,
fullName text NOT NULL,
message text NOT NULL,
postDate text NOT NULL,
galleryID int(8) NOT NULL,
UNIQUE KEY id(id)
);";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
}
/**
* Handles the database table drop procedure.
*
* @return void
*/
function dbUninstall()
{
global $wpdb;
$sql = "DROP TABLE IF EXISTS `{$this->tableName}`;";
$wpdb->query( $sql );
}
}
?>
Заранее спасибо! : D.
Решение
Пытаться:
register_activation_hook ( __FILE__, array( new MemorialCandles(), 'dbInstall' ) );
Или определить Dbinstall как «стадичный» и используйте его, чтобы установить имя таблицы вместо конструктора, который, я думаю, является лучшим подходом.
Другие советы
ОК, новый ответ, и на этот раз протестированное рабочее решение. Сначала создайте экземпляр вашего класса и только затем вызовите свой register_activation_hook
Итак, что -то вроде:
$MemorialCandles = NEW MemorialCandles();
register_activation_hook ( __FILE__, array( 'MemorialCandles', 'dbInstall' ) );