web-dev-qa-db-fra.com

Est-il possible de remplacer cette fonction/classe dans un thème enfant?

Est-il possible de remplacer cette fonction widget à partir d'un thème parent? J'ai vu ce blog, mais il s'agissait d'un cas plus simple.

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

parent

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

J'ai essayé d'utiliser remove_action('widgets_init','???'); mais je me suis vite rendu compte que je ne pouvais pas comprendre la fonction qui l'avait enregistrée!

J'ai pensé à surcharger la fonction et à créer une sous-classe, mais elle est quand même enregistrée dans le parent sous le nom de la classe parente.

Je pensais simplement copier la classe entière, mais l'enfant functions.php est chargé avantparents.php.

3
Chloe

Vous devez simplement exécuter votre code avec une priorité plus élevée que celle du thème parent. La fonction par défaut sur add_action est 10 pour que vous puissiez utiliser:

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

Cela annulera l'enregistrement de ce widget. Bien sûr, vous pouvez toujours créer une nouvelle classe qui étend la classe de ce widget pour remplacer les méthodes souhaitées et pour enregistrer un nouveau widget en fonction de cela:

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

Alors voici l'exemple clair:

Dans functions.php:

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

Dans child_chocolat_widget.php [Fichier de classe personnalisé, quel que soit le nom que vous puissiez conserver]

class my_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys() {
    public function __construct() {}
    public function widget( $args, $instance ) { //override method
     }
}
0
Raghavendra