Sovrascrivere una funzione di classe di un plugin in WordPress

18 ott 2017, 11:02:35
Visualizzazioni: 17.8K
Voti: 5

Ho una situazione simile a questa.

In una classe di un plugin di terze parti c'è una funzione che voglio sovrascrivere estendendo quella classe.

La funzione originale della classe:

class Import_Facebook_Events_Facebook {
    public function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            return null;
        }
        //altro codice qui
}

Quello che ho provato, ma non ha funzionato (nessun effetto):

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 = ''; //aggiunta questa riga
            //return null;
        }
        //altro codice qui
}

new Import_Facebook_Events_Facebook_Ext();

Cosa c'è di sbagliato qui? Come posso ottenere l'effetto desiderato?

La classe originale Import_Facebook_Events_Facebook() viene istanziata da un'altra classe:

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

E la classe sopra viene istanziata da una funzione separata:

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

Suppongo che potresti provare a sovrascrivere l'istanza dopo il fatto. Ad esempio Import_Facebook_Events::$instance = Import_Facebook_Events_Ext::instance(); ... altrimenti dovresti continuare a tornare a ciò che esegue run_import_facebook_events per vedere se puoi sovrascrivere a quel livello superiore.

majick majick
18 ott 2017 11:15:27

@majick Ho provato e ho ottenuto una schermata Questa pagina non funziona. infopsi.md non è attualmente in grado di gestire questa richiesta. HTTP ERROR 500.

Iurie Iurie
18 ott 2017 11:33:38

prima di istanziare la tua nuova classe, devi interrompere l'istanziazione della classe originale e poi devi trovare dove questo avviene.

mmm mmm
18 ott 2017 12:38:28

@mmm Ho aggiunto una risposta, puoi darci un'occhiata?

Iurie Iurie
18 ott 2017 13:08:45

@majick Ho aggiunto una risposta, puoi darci un'occhiata?

Iurie Iurie
18 ott 2017 13:09:35
Tutte le risposte alla domanda 1
1

Finalmente, ho capito come risolvere il mio 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;
        }
        //altro codice qui

        return $event_location;
    }
}

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

Una domanda: le ultime due righe di codice devono essere incluse in una funzione/azione?

18 ott 2017 13:07:52
Commenti

ottima soluzione, sembra che tu possa usarla ovunque ne abbia bisogno... dipende davvero da dove vuoi effettivamente utilizzare $new_ife_events

majick majick
18 ott 2017 16:30:10