web-dev-qa-db-ja.com

子テーマでこの関数/クラスをオーバーライドすることは可能ですか?

親テーマからこの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です。

3
Chloe

あなたは単にあなたのコードが親テーマであるものより高い優先順位で実行する必要があります、あなたが使うことができるように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" );' ) );
4
a378853

それで、これは明確な例です:

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
Raghavendra