Можно ли переопределить эту функцию/класс в дочерней теме?
Можно ли переопределить эту функцию widget
из родительской темы? Я видел этот блог, но он касался более простого случая.
Http://venutip.com/content/right-way-override-theme-functions
Родитель
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" );' ) );
Я попытался использовать remove_action('widgets_init','???');
, но вскоре понял, что не могу разобраться с функцией, которая его зарегистрировала!
Я думал о переопределении функции и создании подкласса, но, тем не менее, он зарегистрирован в родительском имя родительского класса.
Я думал о том, чтобы просто скопировать весь класс, но дочерний functions.php
загружен раньше parents.php
.
2 answers
Вам просто нужно запустить свой код с более высоким приоритетом, чем у родительской темы, значение по умолчанию для функции add_action
равно 10, поэтому вы можете использовать:
function s157343_unregister_widgets() {
unregister_widget( 'Chocolat_Widget_New_Entrys' );
}
add_action( 'widgets_init', 's157343_unregister_widgets', 20 );
Это приведет к отмене регистрации этого виджета. Конечно, вы все равно можете создать новый класс, который расширяет класс этого виджета, чтобы переопределить нужные вам методы, и зарегистрировать новый виджет на основе этого:
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" );' ) );
Итак, вот наглядный пример:
В functions.php :
add_action( 'widgets_init', function() {
require 'child_chocolat_widget.php';
return register_widget( "Child_Chocolat_Widget_New_Entrys" );
} );
В child_chocolat_widget.php [Файл пользовательского класса, любое имя, которое вы можете сохранить]
class my_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys() {
public function __construct() {}
public function widget( $args, $instance ) { //override method
}
}