Este posibilă suprascrierea acestei funcții/clase într-un child theme?

11 aug. 2014, 01:14:08
Vizualizări: 15.5K
Voturi: 3

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.

0
Toate răspunsurile la întrebare 2
3

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" );' ) );
11 aug. 2014 03:07:51
Comentarii

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?

Chloe Chloe
11 aug. 2014 05:08:01

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?

Chloe Chloe
11 aug. 2014 05:22:23

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

Chloe Chloe
11 aug. 2014 06:02:52
0

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ă
     }
}
28 nov. 2018 14:56:09