¿Es posible sobrescribir esta función/clase en un tema hijo?
¿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.

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

¡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?

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?

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

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