Este posibilă suprascrierea acestei funcții/clase într-un child theme?
Este posibilă suprascrierea acestei funcții widget
dintr-o temă părinte? Am văzut acest blog, dar se ocupa de un caz mai simplu.
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" );' ) );
Am încercat să folosesc remove_action('widgets_init','???');
dar am realizat rapid că nu pot obține un handler pentru funcția care a înregistrat-o!
M-am gândit să suprascriu funcția și să creez o subclasă, dar totuși, este înregistrată în tema părinte sub numele clasei părinte.
M-am gândit să copiez întreaga clasă, dar fișierul functions.php
al child theme-ului este încărcat înainte de parents.php
.

Pur și simplu trebuie să rulezi codul tău cu o prioritate mai mare decât cea a temei părinte, valoarea implicită pentru funcția add_action
este 10, așa că poți folosi:
function s157343_unregister_widgets() {
unregister_widget( 'Chocolat_Widget_New_Entrys' );
}
add_action( 'widgets_init', 's157343_unregister_widgets', 20 );
Aceasta va dezînregistra acel widget. Desigur, poți crea o nouă clasă care extinde clasa widget-ului pentru a suprascrie metodele dorite și pentru a înregistra un nou widget bazat pe aceasta:
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" );' ) );

Uau, nu știam despre prioritățile implicite! Ești sigur că nu te referi la o prioritate mai mică? Nu ar fi mai bine ca părintele să se înregistreze mai întâi, ca să poți să-l dezactivezi? Dacă ar avea o prioritate mai mare, nu ar rula mai întâi, înainte ca părintele să aibă șansa să se înregistreze?

Am reușit să creez o subclasă class Child_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys {...
, dar primesc erori: Class 'Chocolat_Widget_New_Entrys' not found
. Am adăugat require_once
pentru a importa tema părinte, dar apoi se plânge Cannot redeclare chocolat_content_width()
. Deci cum pot să extind această clasă în tema copil, dacă fișierul copil este încărcat mai întâi?

Ok, am reușit să creez o subclasă punând-o într-un fișier separat și încărcând fișierul separat care conține subclasa chiar înainte de a o înregistra. add_action( 'widgets_init', function() {
require 'child_chocolat_widget.php';
return register_widget( "Child_Chocolat_Widget_New_Entrys" );
} );

Iată un exemplu clar:
În functions.php:
add_action( 'widgets_init', function() {
require 'child_chocolat_widget.php';
return register_widget( "Child_Chocolat_Widget_New_Entrys" );
} );
În child_chocolat_widget.php [Fișierul clasei personalizate, poți păstra orice nume]
class my_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys() {
public function __construct() {}
public function widget( $args, $instance ) { //suprascriere metodă
}
}
