web-dev-qa-db-ja.com

WP_Widget_Textクラスを拡張する

デフォルトのWordPressテキストウィジェットの出力を変更しようとしています。ウィジェットはOOPで書かれているので、クラスを拡張して1つのメソッドを上書きするという単純なやり方になることを望みました - しかしそれはそれほど簡単ではないことがわかりました。

難しいのは、私はしたくない新しいウィジェットを作成したくないということです。それは本質的に新しい名前のテキストウィジェットのコピーにすぎません - 私は本当に現在のテキストウィジェットの出力を変更したい。

私はこのための2つのファイルを含む小さなプラグインを書きました:メインのプラグインファイルと実際のクラスです。メインのプラグインファイルでは、私は単にします:

add_action('widgets_init', 'include_my_class');
function include_my_class() {
    include("custom_class.php");
}

このようにしないと、拡張しようとしているクラスが存在しないという致命的なエラーが発生します。それでも、それが正しい方法であるかどうかはわかりません。

私のカスタムクラスはこんな感じです:

class CustomTextWidget extends WP_Widget
{

    public function __construct() {
        parent::__construct();
    }

    public function widget( $args, $instance ) {

        /** This filter is documented in wp-includes/default-widgets.php */
        $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

        /**
         * Filter the content of the Text widget.
         *
         * @since 2.3.0
         *
         * @param string    $widget_text The widget content.
         * @param WP_Widget $instance    WP_Widget instance.
         */
        $text = apply_filters( 'widget_text', empty( $instance['text'] ) ? '' : $instance['text'], $instance );
        echo $args['before_widget'];
        if ( ! empty( $title ) ) {
            echo $args['before_title'] . $title . $args['after_title'];
        } ?>
            // lots and lots of custom markup here…
            <div class="my-custom-textwidget"><?php echo !empty( $instance['filter'] ) ? wpautop( $text ) : $text; ?></div>
        <?php
        echo $args['after_widget'];
    }
}

残念ながら、私のクラスは何もしません、コアWordPressウィジェットはまだ使用されています。しかし、エラーがないので、私は完全に間違っていることもできません、しかし、私はどこで私は間違っていますか?新しいウィジェットを導入しないようにするための回避策はありますか?

1
Sven

それについて考えてみてください、なぜあなたが追加のクラスを定義したという理由だけでWordPressが何かをするのですか?

それは魔法ではありません(魔法の魔法でもコード駆動の魔法でもありません)。テキストウィジェットは、classが存在するという理由だけでは表示されません。 WordPressがロードされると wp_widgets_init() が実行され、register_widget('WP_Widget_Text')が実行されます。

技術的には、異なるクラスを使うように言うことはできません。できることは、ネイティブクラスの登録を解除して自分のクラスを登録することです。あなたのクラスが同じ名前と設定を出力する限り、それはネイティブウィジェットと実質的に見分けがつかないでしょう。

1
Rarst