■目的:
WordPressのウィジェットを使って、バナー広告の管理を行う。
■現状:
1.原始的な方法)
テンプレートにバナー広告を直接張り込む
2.ありそうな方法)
テンプレート内にiframeを使って表示
3.WPならではの方法)
「ページ」機能で広告専用ページをつくり、query_postsで1件だけ呼び、CSSでwidthとheightを固定して、overflow:none; overflow:hidden;ですね汗…にする。
1と2は技術的には簡単だけれど、更新がめんどう、HTMLやPHPやFTPがわかる人でないと苦労するなどの問題が。うちでは今のところ3のページ機能を使って広告管理をしていますが、今回「ウィジェット」を使うことでさらに表示位置を管理画面から簡単に変えられるようになります。
■方法:
※あらかじめ「ExecPHP」というウィジェットをインストールしておきます。コチラを参照
- 1.投稿>ページ にて、バナー広告コンテンツ専用ページをつくる(ページID:8 とする)。必要なバナーの分だけページを作成する。
- 2.コンテンツ(投稿内容)にバナー画像を挿入
- 3.そのページのカスタムフィールドにて、
- 4.公開(保存)
- 5.表示>ウィジェット にて、「利用できるウィジェット」から「PHP Code 1」を「サイドバー1」の好きな位置へドラッグ&ドロップ
- 6.ウィジェットを開き、以下の内容を記述
<?php
$ad = new WP_Query(”page_id=8“);
$ad_start = get_post_meta($ad->post->ID , ‘掲載開始日’ , true);
$ad_end = get_post_meta($ad->post->ID , ‘掲載終了日’ , true);
if ((!$ad_start || $ad_start < current_time(’mysql’)) && (!$ad_end || current_time(’mysql’) < $ad_end)):
echo nl2br($ad->post->post_content) ;
endif;
?>※page_id=8は、先に作成したページのIDです。
※WP_Queryの代わりにquery_postsでも良いと思います。 - 7.タイトルは空にして、右上「x」で画面を閉じる
- 8.変更内容を保存
キー:掲載終了日/値:2008-02-27 23:00:00
と設定。
以上
■結果:
設定した「掲載開始日」と「掲載終了日」の間だけ、ウィジェットの内容が表示されます。掲載終了日を過ぎると自動的にバナー広告は非表示となります。
■解説:
あらかじめ作成したバナー広告用のページ記事をID指定で呼び、変数$ad_start、$ad_startにそれぞれget_post_metaでカスタムフィールドの「掲載開始日」「掲載終了日」を代入し、current_time(’mysql’)で現在の日時とカスタムフィールドの値を比較して、その範囲以内(または上記カスタムフィールドの値が未設定)なら表示します。最後のnl2brは必要ないかもしれませんが、バナー画像でなく文章だった場合に、WP_Queryで呼び出すと改行が無効になってしまうようなので。query_postsでは改行は生きます。
■備考:
次回バナーを差し替える時は、後半のウィジェット設定は必要ありません。そのバナーセクションの表示位置を変えたい時だけ、ウィジェットの画面を開いて、ドラッグ&ドロップだけで簡単に表示場所を変えることができます。
その他のバナーも同じ要領で、別のPHPウィジェットを使って作ります。標準では「サイドバー1」しか用意されていませんが、register_sidebar()の引数に数字を与えていくつでもサイドバーを(サイドでなくてもフッタでもコンテンツヘッダでも)つくれるようなので、アイディア次第でかなり本格的なCMSが構築できるでしょう。それこそページ丸ごとウィジェット化(…もはやウィジェットではない)できなくはないわけですね。
2008年10月16日 at 9:24 AM
はじめまして、shoといいます。
アイデアを形にするのは難しいですよね^^
自力で作り上げていくのは素晴らしいことと思います。
ところで、この方法ですと作成した広告ページそのものに直アクセスされると期日に関係なく表示されてしまいますよね?どうしていますか?
各表示用のphpファイルにそれぞれ特定のIDかページを表示しない記述をするしかないのでしょうか。
2008年10月16日 at 10:25 AM
えーと、対策してない気がしますね(汗
ただ、本文に記述したのと同様、index.phpなりsearch.phpのループの内側に、if文を追加して
<?php while(have_posts()): the_post(); ?>
<?php $ad_start = get_post_meta(post->ID , “掲載開始日” , true); ?>
<?php $ad_end = get_post_meta(post->ID , “掲載終了日” , true); ?>
<?php if ((!$ad_start || $ad_start < current_time(”mysql”)) && (!$ad_end || current_time(”mysql”) < $ad_end)): ?>
—ループの中身—
<?php endif; ?>
<?php endwhile; ?>
と、そのページのカスタムフィールドの「掲載開始日」「掲載終了日」を見て表示する/しないを判断させれば良いと思います。その値がなければ無視して通常どおり表示されます。
(コメントありがとうございます!)