Вызовите внешний объект в функции класса во время обратного вызова

wordpress.stackexchange https://wordpress.stackexchange.com/questions/16893

  •  22-10-2019
  •  | 
  •  

Вопрос

У меня класс, который имеет функцию, которая проверяет и создает таблицу в базе данных. Для этого мне нужно использовать объект 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'   ) );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top