È possibile sovrascrivere questa funzione/classe in un child theme?
È 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.

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" );' ) );

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?

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?

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

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