Можно ли переопределить эту функцию/класс в дочерней теме?
Можно ли переопределить эту функцию 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
дочерней темы загружается раньше, чем родительской.
Вам просто нужно запустить свой код с более высоким приоритетом, чем у родительской темы. По умолчанию в функции 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" );' ) );

Вау, я не знал о приоритетах по умолчанию! Ты уверен, что не имеешь в виду более низкий приоритет? Разве не лучше, чтобы родительский класс регистрировался первым, чтобы потом можно было его отменить? Если приоритет выше, разве он не выполнится раньше, чем родительский класс получит шанс зарегистрироваться?

Я дошел до создания подкласса class Child_Chocolat_Widget_New_Entrys extends Chocolat_Widget_New_Entrys {...
, но получаю ошибки: Class 'Chocolat_Widget_New_Entrys' not found
. Я добавил require_once
для импорта родительской темы, но тогда появляется ошибка Cannot redeclare chocolat_content_width()
. Так как же можно создать подкласс в дочерней теме, если файл дочерней темы загружается первым?

Окей, мне удалось создать подкласс, поместив его в отдельный файл и подключив этот файл с подклассом прямо перед регистрацией. add_action( 'widgets_init', function() {
require 'child_chocolat_widget.php';
return register_widget( "Child_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 ) { //переопределяем метод
}
}
