Переопределение функции класса плагина

18 окт. 2017 г., 11:02:35
Просмотры: 17.8K
Голосов: 5

У меня похожая ситуация, как здесь.

В классе стороннего плагина есть функция, которую я хочу переопределить, расширив этот класс.

Исходная функция класса:

class Import_Facebook_Events_Facebook {
    public function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            return null;
        }
        //другой код здесь
}

Что я пробовал (но это не сработало - без эффекта):

class Import_Facebook_Events_Facebook_Ext extends Import_Facebook_Events_Facebook {
    public function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            $facebook_event->place->id = ''; //добавил эту строку
            //return null;
        }
        //другой код здесь
}

new Import_Facebook_Events_Facebook_Ext();

В чем ошибка? Как добиться желаемого эффекта?

Оригинальный класс Import_Facebook_Events_Facebook() создается в другом классе:

class Import_Facebook_Events{

    private static $instance;

    public static function instance() {
        if( ! isset( self::$instance ) && ! (self::$instance instanceof Import_Facebook_Events ) ) {
            self::$instance = new Import_Facebook_Events;

            self::$instance->facebook = new Import_Facebook_Events_Facebook();

        }
        return self::$instance; 
    }
}

И этот класс создается в отдельной функции:

function run_import_facebook_events() {
    return Import_Facebook_Events::instance();
}
5
Комментарии

Полагаю, можно попробовать переопределить экземпляр после его создания. Например, Import_Facebook_Events::$instance = Import_Facebook_Events_Ext::instance(); ... в противном случае придётся возвращаться к тому, что запускает run_import_facebook_events, чтобы попытаться переопределить на этом верхнем уровне.

majick majick
18 окт. 2017 г. 11:15:27

@majick Я попробовал это, и получил экран с сообщением Эта страница не работает. infopsi.md в настоящее время не может обработать этот запрос. HTTP ERROR 500.

Iurie Iurie
18 окт. 2017 г. 11:33:38

Перед созданием экземпляра вашего нового класса, необходимо остановить создание экземпляра оригинального класса, а затем найти, где это происходит.

mmm mmm
18 окт. 2017 г. 12:38:28

@mmm Я добавил ответ, можешь взглянуть?

Iurie Iurie
18 окт. 2017 г. 13:08:45

@majick Я добавил ответ, можешь проверить?

Iurie Iurie
18 окт. 2017 г. 13:09:35
Все ответы на вопрос 1
1

Наконец-то я разобрался, как решить свою проблему:

class Import_Facebook_Events_Facebook_Ext extends Import_Facebook_Events_Facebook {

    function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            $facebook_event->place->id = '';
            //return null;
        }
        //другой код здесь

        return $event_location;
    }
}

$new_ife_events = run_import_facebook_events();
$new_ife_events->facebook = new Import_Facebook_Events_Facebook_Ext();

Вопрос: последние две строки кода должны быть включены в функцию/экшен?

18 окт. 2017 г. 13:07:52
Комментарии

хорошее решение, похоже, вы можете использовать его везде, где вам нужно... все действительно зависит от того, где именно вы хотите использовать $new_ife_events

majick majick
18 окт. 2017 г. 16:30:10