Можно ли переопределить эту функцию/класс в дочерней теме?


Можно ли переопределить эту функцию 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.

Author: Community, 2014-08-10

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" );' ) );
 5
Author: a378853, 2014-12-02 07:11:35

Итак, вот наглядный пример:

В 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
     }
}
 0
Author: Raghavendra, 2018-11-28 13:20:23