3ステップでつくるWordPressサイドバーウィジェット

WordPressのサイドバーウィジェットを自作すると、クライアント向けにWordPressを納入する際に色々と便利なので、実際の作り方をなるべく簡単にご紹介します。

ステップ1:WP_Widgetクラスを定義する。

ウィジェットプラグインを作成するには、WP_Widgetというクラスを継承した子クラスを作成する必要があります。

クラスとか継承とか難しそうですが、テンプレートのようなものを用意するだけと思えば簡単です。

以上のソースはウィジェットプラグインを作成するためのテンプレートのようなものです。

とりあえず、このファイルを任意の名前(たとえばmywidget.phpなど)で保存してzip圧縮した後、プラグインのインストール画面からアップロードしましょう。

プラグインを有効にした後でウィジェットの画面に移動すると、以下のような感じで新しいウィジェットが追加されていると思います。

これから実際にウィジェットを自作するわけですが、とりあえず必要なカスタマイズは以下のとおりです。

  • 3行目の”My Widget”を任意の名前に変更。この部分がプラグインの名前になります。
  • 8行目及び11行目の”MyWidget”を変更。この部分は半角英数またはアンダーバーしか使用できません。また、両方とも同じ文字列である必要があります。
  • 18行目の”はじめてのウィジェット”を変更。これが管理画面で表示されるウィジェット名です。
  • 14行目の”はじめてのウィジェットです。”を変更。これはウィジェットに関する説明文です。
  • 15行目はウィジェットのオプション用フォームの縦横のサイズです。array()とすればデフォルトのサイズが自動的に適用されます。

ここまでの作業で、なにもしないウィジェットが動作するようになります。

実際に、サイドバーにドラッグ&ドロップできますのでお試しください。

ステップ2:オプションフォームを作成する。

ウィジェットでは以下のようなオプション用のフォームをつくることが可能です。

オプション用のフォームは、form()メソッド内に必要な記述をいれるだけで、多くの処理はWordPressコアが勝手にやってくれます。

今回はテキストをただ表示するだけのシンプルなウィジェットを作りますが、実はそれだけなら以下のようなソースを24〜26行目のform()メソッドと置き換えるだけでフォームの作成から保存する処理までが完了します。

public function form($par) {
    // タイトルの入力
    $title = (isset($par['title']) && $par['title']) ? $par['title'] : '';
    $id = $this->get_field_id('title');
    $name = $this->get_field_name('title');
    echo 'タイトル:<br />';
    echo '<input type="text" id="'.$id.'" name="'.$name.'" value="';
    echo trim(htmlentities($title, ENT_QUOTES, 'UTF-8'));
    echo '" />';
    echo '<br />';

    // テキストの入力
    $text = (isset($par['text']) && $par['text']) ? $par['text'] : '';
    $id = $this->get_field_id('text');
    $name = $this->get_field_name('text');
    echo 'テキスト:<br />';
    echo '<textarea style="width:100%" id="'.$id.'" name="'.$name.'">';
    echo trim(htmlentities($par['text'], ENT_QUOTES, 'UTF-8'));
    echo '</textarea>';
}

ここでのポイントは以下のとおりです。

  • オプションで保存された項目は、form()メソッドの引数に配列($par)として渡される。
  • 各入力項目を区別する名前(この例ではtext)を指定して必要な項目を取得する。
  • 各フォーム要素のname属性及びid属性は、get_field_name()及びget_field_id()で取得した値を指定すること。

超簡単にかいつまんで説明すると、titleとかtextを単純に別の文字列(半角英数など)に臨機応変に変えてねということです。

ステップ3:保存した内容を出力する。

保存した内容の出力は、さらに簡単です。

widget()メソッド内で以下のような処理を行うだけです。

public function widget($args, $par) {
    echo $args['before_widget'];
    echo $args['before_title'];
    echo trim(htmlentities($par['title'], ENT_QUOTES, 'UTF-8'));
    echo $args['after_title'];
    echo trim($par['text']);
    echo $args['after_widget'];
}

ここでのポイントは以下のとおりです。

  • $argsが含まれる行はそのままでオッケー。むしろ変更しないほうが吉です。
  • ウィジェットのタイトルを$args['before_title']と$args['after_title']の間で出力する。
  • コンテンツを$args['after_widget']の直前で出力する。必要に応じてdiv要素等で囲むとCSSで扱いやすいと思います。

最後に

このページでのサンプルではいい加減なバリデーションしかしてませんが、WordPressコアには便利なバリデーションがたくさんありますので、ちゃんとやりましょう。

http://codex.wordpress.org/Data_Validation

できあがったウィジェットプラグインは以下のような感じです。

PHPが出来る人には意外と簡単じゃないかなと思うのですがどうでしょう?

指定した記事を単独で表示するサイドバーウィジェット

午前0時を過ぎたので昨日になりますが、神戸のWordBenchに参加しました。

みなさん、お疲れさまでした。

ところで、そのなかで、トップページの下の方に今後のイベントを表示したいとか、ウィジェットでやったらいいとか、そんなやりとりがありました。

実は、その解決に役立ちそうなのをすでに持っていたので、公開しておきます。

このプラグインは、URLを指定すると、その記事の投稿サムネールやタイトル、記事などを単独で表示するプラグインです。

使い道

このプラグインは単に指定された投稿またはページを単独で表示するだけです。

しかし、投稿サムネールがあればそのimgタグも出力できますので、たとえばサイドバーウィジェット上でキャンペーンなどの告知用バナーなどが、超簡単に作成できます。

HTML部分はテンプレート化していますので、様々なシーンで利用可能な優れものです。

導入手順

テーマファイル内の functions.php に以下の記述を追加してください。

register_sidebar( array(
    'name' => 'Home Widget Area',
    'id' => 'home-widget-area',
    'description' => 'The HOME widget area',
    'before_widget' => '<div id="%1$s" class="home-widget-container %2$s">',
    'after_widget' => '</div><div class="clearfix">&nbsp;</div>',
    'before_title' => '<h2 class="widget-title">',
    'after_title' => '</h2>',
));

続いて、テーマファイル内のindex.phpのhave_posts()ループの直下あたりに、以下の記述を追加してください。

dynamic_sidebar('home-widget-area');

ここまでの処理でトップページに新しいウィジェットエリアが追加されました。

あとは、本プラグインを以下からダウンロードして、インストールして下さい。

singlepost-widget

次にウィジェットの設定画面で、このウィジェットを有効化してテンプレートをゴニョゴニョすれば完成です。

イベントが完了したら、ワンタッチで削除できますので幸せですよ。

詳しい仕様

  • 投稿のIDまたはURLからその投稿に関する情報を取得します。URLが指定された場合は内部でIDに変換して、そのIDからget_post()してます。
  • サムネールのサイズはそのテーマで使用可能なサイズが自動的にプルダウンに出ます。
  • テンプレートはコンテンツ出力部分のテンプレートを指定できます。テンプレート内では、以下のような専用タグが使用できます。
    • %post_thumb% – 投稿サムネールのimgタグ
    • %class% – CSS用のクラス属性
    • %post_title% – 投稿のタイトル
    • %post_excerpt% – 投稿の抜粋
    • その他,
    • WordPressのget_post()関数を%で囲んだもの。

意味分かりにくいですかね?

でも、これは、解決策のひとつとしてとてもオススメであることは間違いありません。

わからないことがあれば、twitterで質問してくださいませ。

WordPressでローカルナビゲーションを表示するプラグインを作った。

WordPressで以下のような感じのローカルナビゲーションを表示するためのサイドバーウィジェットを追加するプラグインをつくった。

firegoby » WordPressでローカルナビゲーションを表示するプラグイン

ウィジェットの管理画面はこんな感じ。