組み込みウィジェットとスタンドアロンウィジェット
デフォルトのWordPressインストールにはウィジェットのセットが含まれています。これらの標準ウィジェットに加えて、テーマやプラグインによって追加のウィジェットを含めることができます。テーマやプラグインに組み込まれたウィジェットの利点は、追加機能を提供し、ウィジェットの数を増やすことです。
欠点は、テーマが変更されたりプラグインが無効化された場合、プラグインやテーマウィジェットの機能が失われることです。しかし、ウィジェットのデータと設定はオプションテーブルに保存され、テーマやプラグインが再アクティブ化されると復元されます。
テーマにウィジェットを含めると、そのテーマがアクティブな場合にのみ使用できます。ユーザーがテーマを変更することを決定した場合、そのウィジェットへのアクセスを失います。しかし、ウィジェットがプラグインに含まれている場合、ユーザーはテーマを変更してもウィジェットの機能へのアクセスを失うことはありません。
ウィジェットの構造
視覚的に、ウィジェットは2つの領域で構成されています:
- 1. タイトルエリア
- 2. ウィジェットオプション
例えば、以下は管理画面とフロントエンドにおける組み込みテキストウィジェットのレイアウトです:
管理エリアのウィジェットフォーム。
サイト訪問者に表示されるウィジェット。
このウィジェットのHTML出力は次のようになります:
<div id="text-7" class="widget widget_text">
<div class="widget-wrap">
<h4 class="widgettitle">
This is a text widget
</h4><!-- .widgettitle -->
<div class="textwidget">
I can put HTML in here. <a href="http://google.com/">Search me!</a>
</div><!-- .textwidget -->
</div><!-- .widget-wrap -->
</div><!-- #text-7 -->
各ウィジェットは、表示されるデータに関連するHTMLを出力する独自の方法を持っています。ウィジェットのラッパータグは、表示されるウィジェットエリアによって定義されます。
組み込みテキストウィジェットのようなウィジェットを作成するために必要なPHPコードは次のようになります:
<?php
class My_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'my-text', // Base ID
'My Text' // Name
);
add_action( 'widgets_init', function() {
register_widget( 'My_Widget' );
});
}
public $args = array(
'before_title' => '<h4 class="widgettitle">',
'after_title' => '</h4>',
'before_widget' => '<div class="widget-wrap">',
'after_widget' => '</div></div>',
);
public function widget( $args, $instance ) {
echo $args['before_widget'];
if ( ! empty( $instance['title'] ) ) {
echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
}
echo '<div class="textwidget">';
echo esc_html__( $instance['text'], 'text_domain' );
echo '</div>';
echo $args['after_widget'];
}
public function form( $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : esc_html__( '', 'text_domain' );
$text = ! empty( $instance['text'] ) ? $instance['text'] : esc_html__( '', 'text_domain' );
?>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php echo esc_html__( 'Title:', 'text_domain' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'Text' ) ); ?>"><?php echo esc_html__( 'Text:', 'text_domain' ); ?></label>
<textarea class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'text' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'text' ) ); ?>" type="text" cols="30" rows="10"><?php echo esc_attr( $text ); ?></textarea>
</p>
<?php
}
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
$instance['text'] = ( ! empty( $new_instance['text'] ) ) ? $new_instance['text'] : '';
return $instance;
}
}
$my_widget = new My_Widget();
ウィジェットの開発
ウィジェットを作成して表示するには、次の手順を実行する必要があります:
- 1. 標準のWP_Widgetクラスを拡張してウィジェットのクラスを作成し、そのいくつかの関数を使用します。
- 2. ウィジェットを登録して、ウィジェット画面で利用できるようにします。
- 3. テーマにウィジェットを追加するためのウィジェットエリアが少なくとも1つあることを確認します。
あなたのウィジェットクラス
WP_Widgetクラスはwp-includes/class-wp-widget.phpにあります。
<?php
class My_Widget extends WP_Widget {
public function __construct() {
// actual widget processes
}
public function widget( $args, $instance ) {
// outputs the content of the widget
}
public function form( $instance ) {
// outputs the options form in the admin
}
public function update( $new_instance, $old_instance ) {
// processes widget options to be saved
}
}
これらの各関数のドキュメントはウィジェットクラスコードにあります:
- 1.
construct
: 管理画面でウィジェットを説明、名前、表示幅で設定します。 - 2.
widget
: ウィジェットオプションを処理し、ページにHTMLを表示します。$args
パラメータは、ウィジェットタイトルクラスとウィジェットコンテンツクラスを表示するために使用できるHTMLを提供します。 - 3.
form
: ウィジェットのオプションを設定するために使用されるフォームを表示します。ウィジェットにオプションがない場合、この関数はスキップできます(ただし、空であっても含めることが最良のプラクティスです)。 - 4.
update
: ウィジェットオプションをデータベースに保存します。ウィジェットにオプションがない場合、この関数はスキップできます(ただし、空であっても含めることが最良のプラクティスです)。
ウィジェットの登録
register_widget()関数はウィジェットを登録するために使用されます。
この関数をwidgets_initフックを使用して呼び出します:
<?php
add_action( 'widgets_init', 'wpdocs_register_widgets' );
function wpdocs_register_widgets() {
register_widget( 'My_Widget' );
}
ウィジェットをラップするHTMLや、タイトルとウィジェットコンテンツのクラスは、register_sidebar()を使用してウィジェットエリアを登録する際に指定されます。
例
テキストウィジェットの例
この記事の冒頭の例からテキストウィジェットを構築します。まず、WP_Widgetクラスを拡張するウィジェットクラスを設定します。
クラスコンストラクタでは、親コンストラクタを呼び出し、ウィジェットのベースIDと名前を渡します。また、クラスコンストラクタ内でwidgets_init
アクションにフックしてウィジェットを登録します。
次に、ウィジェットを作成する際に使用する引数を宣言します。定義しなければならない引数は4つ、before_title
、after_title
、before_widget
、after_widget
です。これらの引数は、ウィジェットのタイトルとウィジェット自体をラップするコードを定義します。
引数を定義した後、ウィジェットの関数を定義します。この関数は2つのパラメータを受け取ります。前述の$args
配列とウィジェットの$instance
で、フォームからのオプションを処理し、サイトのフロントエンドにウィジェットのHTMLを表示する関数です。上記の例では、ウィジェット関数は単にウィジェットタイトルを出力し、widget_title
フィルターを通します。その後、シンプルなウィジェットラッパーとウィジェットのテキストフィールドの内容を出力します。例に示されているように、$instance
に保存されているウィジェットのオプションにアクセスできます。
次に、フォーム関数を定義します。この関数は1つのパラメータ、$instance
を受け取り、ユーザーがウィジェットを作成するためにウィジェット管理画面で使用するフォームを出力します。上記の例では、関数は$title
と$text
変数を定義し、それらを以前に入力された値に設定します(その値が存在する場合)。その後、タイトル用のテキストフィールドとテキストコンテンツ用のテキストエリアを持つシンプルなフォームを出力します。
最後に、更新関数を定義します。この関数は2つのパラメータ、$new_instance
と$old_instance
を受け取り、提出されたときに新しいオプションでウィジェットを更新する責任があります。ここでは、$instance
を空の配列として定義します。次に、タイトルとテキストのキーを$new_instance
の値に設定します(それらが存在する場合)。その後、$instance
を返します。
最後に、上記のすべてが定義されたら、新しいウィジェットクラスをインスタンス化し、作業をテストします。
サンプルウィジェット
<?php
/**
* Adds Foo_Widget widget.
*/
class Foo_Widget extends WP_Widget {
/**
* Register widget with WordPress.
*/
public function __construct() {
parent::__construct(
'foo_widget', // Base ID
'Foo_Widget', // Name
array( 'description' => __( 'A Foo Widget', 'text_domain' ) ) // Args
);
}
/**
* Front-end display of widget.
*
* @see WP_Widget::widget()
*
* @param array $args Widget arguments.
* @param array $instance Saved values from database.
*/
public function widget( $args, $instance ) {
extract( $args );
$title = apply_filters( 'widget_title', $instance['title'] );
echo $before_widget;
if ( ! empty( $title ) ) {
echo $before_title . $title . $after_title;
}
echo __( 'Hello, World!', 'text_domain' );
echo $after_widget;
}
/**
* Back-end widget form.
*
* @see WP_Widget::form()
*
* @param array $instance Previously saved values from database.
*/
public function form( $instance ) {
if ( isset( $instance['title'] ) ) {
$title = $instance['title'];
} else {
$title = __( 'New title', 'text_domain' );
}
?>
<p>
<label for="<?php echo $this->get_field_name( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
</p>
<?php
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
return $instance;
}
} // class Foo_Widget
このサンプルウィジェットは、次のようにwidgets_initフックで登録できます:
<?php
// Register Foo_Widget widget
add_action( 'widgets_init', 'register_foo' );
function register_foo() {
register_widget( 'Foo_Widget' );
}
名前空間を使用した例
PHP 5.3で名前空間を使用する場合、次の例のようにコンストラクタを直接呼び出す必要があります:
<?php
namespace a\b\c;
class My_Widget_Class extends \WP_Widget {
public function __construct() {
parent::__construct( 'baseID', 'name' );
}
// ... rest of the functions
}
そして、ウィジェットを登録するには:
<?php
// Register Foo_Widget widget
add_action( 'widgets_init', 'register_my_widget' );
function register_my_widget() {
register_widget( 'a\b\c\My_Widget_Class' );
}
詳細についてはこの回答をstack exchangeで参照してください。
特別な考慮事項
サイドバーではなく別のテンプレートファイル内でウィジェットを使用したい場合、the_widget()
を使用してプログラム的に表示できます。この関数はウィジェットクラス名を受け入れます。ウィジェットクラス名を次のように関数に渡します:
<?php the_title(); ?>
<div class="content">
<?php the_content(); ?>
</div><!-- .content -->
<div class="widget-section">
<?php the_widget( 'My_Widget_Class' ); ?>
</div><!-- .widget-section -->
特定のページの特定のエリアでウィジェットを使用する必要がある場合、たとえば、サイトのフロントページのセクションでフォームの横にイベントのリストを表示したり、ナビゲーションの横にメガメニューでメールキャプチャフォームを表示したりする場合に、このアプローチを使用することをお勧めします。