È possibile sovrascrivere questa funzione/classe in un child theme?

11 ago 2014, 01:14:08
Visualizzazioni: 15.5K
Voti: 3

È possibile sovrascrivere questa funzione widget da un tema genitore? Ho visto questo blog, ma trattava un caso più semplice.

http://venutip.com/content/right-way-override-theme-functions

Genitore

class Chocolat_Widget_New_Entrys extends WP_Widget {

  function __construct() {...

  function widget( $args, $instance ) {...
}
add_action( 'widgets_init', create_function( '', 'return register_widget( "Chocolat_Widget_New_Entrys" );' ) );

Ho provato a usare remove_action('widgets_init','???'); ma mi sono subito reso conto che non potevo ottenere un riferimento alla funzione che l'ha registrato!

Ho pensato di sovrascrivere la funzione e creare una sottoclasse, ma comunque è registrata nel genitore con il nome della classe genitore.

Ho pensato di copiare l'intera classe, ma il functions.php del child theme viene caricato prima di quello del genitore.

0
Tutte le risposte alla domanda 2
3

Devi semplicemente eseguire il tuo codice con una priorità più alta rispetto al tema genitore. Il valore predefinito della funzione add_action è 10, quindi puoi utilizzare:

function s157343_unregister_widgets() {
     unregister_widget( 'Chocolat_Widget_New_Entrys' );
}
add_action( 'widgets_init', 's157343_unregister_widgets', 20 );

Questo annullerà la registrazione di quel widget. Naturalmente, puoi comunque creare una nuova classe che estende la classe del widget per sovrascrivere i metodi che desideri e registrare un nuovo widget basato su quella:

class my_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys() {
    public function __construct() {}
    public function widget( $args, $instance ) {}
}
add_action( 'widgets_init', create_function( '', 'return register_widget( "my_Chocolat_Widget_New_Entrys" );' ) );
11 ago 2014 03:07:51
Commenti

Wow, non sapevo delle priorità predefinite! Sei sicuro di non intendere una priorità più bassa? Non vorresti che il genitore si registrasse per primo, così puoi annullarne la registrazione? Se la priorità fosse più alta, non verrebbe eseguito prima, prima che il genitore abbia la possibilità di registrarsi?

Chloe Chloe
11 ago 2014 05:08:01

Sono arrivato al punto di creare una sottoclasse class Child_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys {..., ma mi dà errori: Class 'Chocolat_Widget_New_Entrys' not found. Ho aggiunto require_once per importare il tema genitore, ma poi si lamenta Cannot redeclare chocolat_content_width(). Quindi come posso creare una sottoclasse nel tema figlio, se il file figlio viene caricato per primo?

Chloe Chloe
11 ago 2014 05:22:23

Ok, sono riuscito a creare una sottoclasse inserendola in un file separato e richiedendo il file separato contenente la sottoclasse proprio prima di registrarla. add_action( 'widgets_init', function() { require 'child_chocolat_widget.php'; return register_widget( "Child_Chocolat_Widget_New_Entrys" ); } );

Chloe Chloe
11 ago 2014 06:02:52
0

Ecco quindi l'esempio chiaro:

In functions.php:

add_action( 'widgets_init', function() { 
    require 'child_chocolat_widget.php'; 
    return register_widget(  "Child_Chocolat_Widget_New_Entrys" ); 
} );

In child_chocolat_widget.php [File di classe personalizzato, puoi usare qualsiasi nome]

class my_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys() {
    public function __construct() {}
    public function widget( $args, $instance ) { //sovrascrive il metodo
     }
}
28 nov 2018 14:56:09