¿Es posible sobrescribir esta función/clase en un tema hijo?

11 ago 2014, 01:14:08
Vistas: 15.5K
Votos: 3

¿Es posible sobrescribir esta función widget de un tema padre? Vi este blog, pero trataba un caso más simple.

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

Tema padre

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

Intenté usar remove_action('widgets_init','???'); pero pronto me di cuenta de que no podía obtener una referencia a la función que lo registró.

Pensé en sobrescribir la función y crear una subclase, pero aún así, está registrada en el padre con el nombre de la clase padre.

Pensé en copiar toda la clase, pero el functions.php del tema hijo se carga antes que el del padre.

0
Todas las respuestas a la pregunta 2
3

Simplemente necesitas ejecutar tu código con una prioridad mayor que la del tema padre. El valor predeterminado en la función add_action es 10, por lo que puedes usar:

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

Esto desregistrará ese widget. Por supuesto, también puedes crear una nueva clase que extienda la clase de ese widget para sobrescribir los métodos que desees y registrar un nuevo widget basado en eso:

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
Comentarios

¡Vaya, no sabía acerca de las prioridades por defecto! ¿Estás seguro de que no te refieres a una prioridad más baja? ¿No querrías que el padre se registrara primero, para que puedas desregistrarlo? Si tuviera una prioridad más alta, ¿no se ejecutaría primero, antes de que el padre tenga la oportunidad de registrarse?

Chloe Chloe
11 ago 2014 05:08:01

Llegué hasta el punto de crear una subclase class Child_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys {..., pero me está dando errores: Class 'Chocolat_Widget_New_Entrys' not found. Añadí require_once para importar el tema padre, pero luego se queja de Cannot redeclare chocolat_content_width(). Entonces, ¿cómo puedo hacer una subclase de esto en el tema hijo, si el archivo hijo se carga primero?

Chloe Chloe
11 ago 2014 05:22:23

Vale, pude crear una subclase poniéndola en un archivo separado y requiriendo el archivo separado que contiene la subclase justo antes de 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

Aquí está el ejemplo claro:

En functions.php:

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

En child_chocolat_widget.php [Archivo de clase personalizado, puedes mantener cualquier nombre]

class my_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys() {
    public function __construct() {}
    public function widget( $args, $instance ) { //sobrescribir método
     }
}
28 nov 2018 14:56:09