ウィジェットアイテムを自作する

ウィジェットアイテムとはウィジェットにドラッグ&ドロップで加えられる定形のテンプレート。

ウィジェット

ソースコードの骨格

class WP_Widget_●●● extends WP_Widget { // クラスWP_Widgetの継承クラスを定義
    function WP_Widget_●●●() { } // 「利用できるウィジェット」として登録する(コンストラクタ)
    function form( $instance ) { } // 管理画面のウィジェットにフォームを表示する
    function update( $new_instance, $old_instance ) { } // 管理画面のウィジェットの「保存」をクリックしたときの処理
    function widget( $args, $instance ) { } // ウィジェットをWeb上に表示する
}

function WP_Widget_●●●Init() { // インスタンスの生成
    register_widget('WP_Widget_●●●');
}

add_action('widgets_init', 'WP_Widget_●●●Init');

クラスWP_Widget()の引数の意味は次の4つ。

WP_Widget(ウィジェットID, ウィジェット名, ウィジェットオプション, コントロールオプション);

例)
WP_Widget_●●●(
    $name = 'ウィジェットアイテム名',
    $widget_ops = array( 'classname' => 'Widget_●●●' , description' => 'ウィジェットアイテムの説明文');
    $control_ops = array('width' => '300px' , 'height' => '300px');
    parent::WP_Widget(false , $name , $widget_ops , $control_ops);
    );

フォームを定義するとウィジェットアイテムの表示を変更できる

$instanceにはフォームで入力されたデータ(titleやtext)が格納されている。
ウイジェットには、識別するための一意な属性(id, name) が付けられています。その属性を get_field_id, get_field_name 関数で取得して、HTML属性の id, name で使用します
$args には、呼び出された dynamic_sidebar の情報、ウイジェットの情報、前後の付加する div情報等が設定されています。extract関数で渡された $args 連想配列を変数名と値に展開しています

$body = esc_attr($instance['body']); // body内のHTMLタグを取り除く

echo '<p><label for=" '    .$this->get_field_id('body').   ' ">'    .__('テキスト:').   '</label>
<textarea  rows="8" colls="20" id="   '.$this->get_field_id('body').   '" name="'   .$this->get_field_name('body').   '">'   .$body.   '</textarea></p>';
    }
記述する場所はfunctions.php
4つの関数から自作できる。

class AddWidgetItem extends WP_Widget { // クラスWP_Widgetの継承クラスを定義

    function AddWidgetItem() {  // 「利用できるウィジェット」に追加する
        $widget_option = array( // ウィジェットアイテムの説明文
            'description' => '入力したテキストを表示するだけのウィジェットです'
            );

parent::WP_Widget(false, $name = 'テキスト表示ウィジェット', $widget_option); // ウィジェットアイテム名
    }


    function form($instance) { // 管理画面のウィジェットアイテムのフォーム表示
        $body = esc_attr($instance['body']);

echo '<p><label for=" ' .$this->get_field_id('body'). ' ">' .__('テキスト:'). '</label>
<textarea  rows="8" colls="20" id=" '.$this->get_field_id('body'). '" name="' .$this->get_field_name('body'). '">' .$body. '</textarea></p>';
    }


    function update($new_instance, $old_instance) { // 管理画面のウィジェットアイテムを保存したときの処理
        $instance = $old_instance;
        $instance['body'] = trim($new_instance['body']);
        return $instance;
    }


    function widget($args, $instance) { // ウィジェットアイテムをWeb上に表示する処理
        extract( $args );
        $body = apply_filters( 'my_widget_body', $instance['body'] );
        echo '<li class="my-text-widget"><p>'.$body.'</p></li>';
    }
}


add_action('widgets_init', create_function('', 'return register_widget("AddWidgetItem");'));