Sobrescribir una función de clase de plugin

18 oct 2017, 11:02:35
Vistas: 17.8K
Votos: 5

Tengo algo similar a lo que se menciona aquí.

En una clase de un plugin de terceros hay una función que quiero sobrescribir extendiendo esa clase.

La función original de la clase:

class Import_Facebook_Events_Facebook {
    public function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            return null;
        }
        //otro código aquí
}

Lo que intenté, pero no funcionó (no tuvo efecto):

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 = ''; //añadí esta línea
            //return null;
        }
        //otro código aquí
}

new Import_Facebook_Events_Facebook_Ext();

¿Qué está mal aquí? ¿Cómo puedo lograr el efecto deseado?

La clase original Import_Facebook_Events_Facebook() se instancia desde otra clase:

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

Y la clase anterior se instancia desde una función separada:

function run_import_facebook_events() {
    return Import_Facebook_Events::instance();
}
5
Comentarios

Supongo que podrías intentar sobrescribir la instancia después del hecho. Ej. Import_Facebook_Events::$instance = Import_Facebook_Events_Ext::instance(); ... de lo contrario tendrías que seguir volviendo a lo que ejecuta run_import_facebook_events para ver si puedes sobrescribir en ese nivel superior.

majick majick
18 oct 2017 11:15:27

@majick Lo intenté y obtuve una pantalla Esta página no funciona. infopsi.md no puede manejar esta solicitud en este momento. ERROR HTTP 500.

Iurie Iurie
18 oct 2017 11:33:38

Antes de instanciar tu nueva clase, debes detener la instanciación de la clase original y luego tienes que encontrar dónde ocurre esto.

mmm mmm
18 oct 2017 12:38:28

@mmm He agregado una respuesta, ¿puedes revisarla?

Iurie Iurie
18 oct 2017 13:08:45

@majick He agregado una respuesta, ¿puedes revisarla?

Iurie Iurie
18 oct 2017 13:09:35
Todas las respuestas a la pregunta 1
1

Finalmente, descubrí cómo resolver mi problema:

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;
        }
        //otro código aquí

        return $event_location;
    }
}

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

Una pregunta: ¿las últimas dos líneas de código deben incluirse en una función/acción?

18 oct 2017 13:07:52
Comentarios

buena solución, parece que podrías usar eso donde lo necesites... realmente solo depende de dónde realmente quieras usar $new_ife_events

majick majick
18 oct 2017 16:30:10