PHPで条件付きGETとかEtagとかでパフォーマンス向上

先程アップデートしたWordPressプラグインで実装したコードの一部をご紹介。

以下で紹介する関数はPHPで条件付きGET(Conditional GET)に対応するための関数です。

どういうものかというと、ブラウザからリクエストがあった際に、最終更新日(Last-Modified)をレスポンスヘッダでおくると、そのブラウザは次回以降のアクセスの際に「あの日以降更新した?」と聞いてくるので、更新してなかったときには「まだしてないよ」とだけ返す(コンテンツは返さない)仕組みのことです。

ソース

function conditional_get($time = 0)
{
  $last_modified = gmdate('D, d M Y H:i:s T', $time);
  $etag = md5($last_modified);
  header('Last-Modified: '.$last_modified);
  header('ETag: "'.$etag.'"');
  if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $last_modified) {
      header('HTTP/1.1 304 Not Modified');
      exit;
    }
  }
  if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
    if (preg_match("/{$etag}/", $_SERVER['HTTP_IF_NONE_MATCH'])) {
      header('HTTP/1.1 304 Not Modified');
      exit;
    }
  }
}

使い方

あらかじめ、コンテンツの最終更新日を取得して、conditional_get() に渡すと、必要な処理をいろいろやってくれます。

そのあとで、実際のコンテンツを取得して出力です。
実際には、$time以降の更新がない場合は、conditional_get() 内で終了します。

$time = get_modified() // コンテンツの更新日時をローカルタイムスタンプで取得

conditional_get($time);

$html = get_contents(); // コンテンツを取得
echo $html;

conditioal_get() の前にコンテンツを取得しちゃうと意味が半減することがあるかもしれないので注意。

Enhancing CSS 0.3

WordPressに外部CSSを添付するプラグインの”Enhancing CSS”をアップデートしました。

更新内容

条件付きGET(Conditional GET)に対応

CSSのデータを出力する際に、”Last-Modified”ヘッダを出力し、クライアントからの”If-Modified-Since”または”If-None-Match”に条件が一致した場合に”HTTP/1.1 304 Not Modified”を返します。

これによりブラウザ側でCSSがキャッシュされパフォーマンスが向上します。

子テーマを作成するためのstyle.cssをダウンロード

保存した外部CSSをもとに、子テーマを作成するためのstyle.cssがダウンロード出来るようになりました。

ダウンロード用のstyle.cssには親テーマのstyle.cssへのリンクや、子テーマとして動作するための最低限のコメントが、自動的に挿入されます。

子テーマ作成に関する詳細は以下のページを御覧ください。

子テーマ – WordPress Codex 日本語版

Twenty Tenテーマのヘッダー画像の高さを変更する

前回の記事でWordPressのTwenty TenテーマのJavaScriptおよびCSSを使ったカスタマイズの事例についてご紹介しましたが、今回は、同じ Twenty Ten テーマのヘッダー画像の高さを変更する方法について。

今回は、とても簡単なものではありますが、PHPがからみます。

変更したい部分

変更方法

Twenty Tenテーマでは、とても親切なことに、このヘッダー画像のサイズを変更するためのフィルターフックが用意されています。

そこで、それを利用して画像サイズを変更するプラグインを作成するか、子テーマのfunctions.phpに書き込みます。

以下のソースのうち300の部分は画像の高さです。
お好きな数字に変更してください。

<?php
/*
Plugin Name: twentyten_header_image_height
*/

add_filter('twentyten_header_image_height', 'twentyten_header_image_height');

function twentyten_header_image_height($height){
    return 300;
}

?>

以上のソースを、以下のいずれかの方法で適用してください。

  1. 子テーマのfunctions.phpにペーストする。(やや上級者むけ。子テーマってわかります?)
  2. 拡張子が.phpの任意のファイル名のテキストファイルを作成し、WordPressのプラグイン管理画面から登録する。

ちなみに、横幅を変更する場合は、height の部分を width に変更してください。

変更前のヘッダー画像管理画面

変更後のヘッダー画像管理画面

画像のサイズ部分が書き換わります。

それにしても、Twenty Ten テーマってほんとうに良く出来てます。
子テーマ用のフレームワークとして十分に機能する気がします。

Enhancing CSS & JavaScriptでTwenty Tenテーマをカスタマイズ

このサイトで配布しているEnhancing CSSプラグインとEnhancing JSプラグインは、それぞれ外部CSSと外部JavaScriptをWordPressに添付するプラグインです。

今回の記事では、これらのプラグインを使ってTwenty Tenテーマをカスタマイズする方法をご紹介します。

カスタマイズ例

以下の画像はTwenty TenテーマにEnhancing CSS及びEnhancing JavaScriptを使用して、外部CSS及びJavaScriptでカスタマイズした事例です。

CSSとJavaScript以外はメニューの設定も含めて全て同じです。もちろんテーマファイルの書き換えも一切行っていません。

はじめに

以下のサンプルを試す前にプラグインをインストールしてください。

メニューの位置を変更する

カスタマイズ例ではメニューの位置が画像の上部に変更されています。
この修正は、CSSでも可能ですが、JavaScriptにて行ないました。

  1. まず、Enhancing JavaScriptの管理画面(外観->拡張JavaScript)を開いて、Enqueue Scriptsの中からprototypeにチェックを入れて保存してください。
    以上の操作でテーマファイル側にprototype.jsが組み込まれます。
  2. 以下のソースをコピーしてJavaScriptのエディター内にペーストしてください。

コピー&ペーストするソース

function init(){
  var oImg = $('branding').getElementsByTagName('IMG')[0];
  if (document.getElementsByTagName('BODY')[0].className.indexOf('home') >= 0) {
    $('masthead').appendChild(oImg);
  } else {
    $('branding').removeChild(oImg);
  }
}

Event.observe(window, 'load', init);

サイトタイトル部分に画像を使用する

  1. まず任意のロゴ画像を作成して、WordPressのメディアからアップロードして、画像のURLをコピーしてください。
  2. 以下のソースを”外観” -> ”拡張CSS” のCSSエディター内にペーストして、画像のパスの部分をアップロード画像と書き換えてください。(画像の横幅や高さもかえましょう!)
#site-title a
{
  background-image: url(/wp-content/uploads/2010/09/buttonw-grey-8bit.png);
  background-position: left top;
  background-repeat: no-repeat;
  display: block;
  width: 178px;
  height: 58px;
  text-indent: -9999px;
  overflow: hidden;
}

#site-description
{
  text-align: right;
}

サイトを確認してください。
もし、何も表示されていなければ画像のURLに間違いがあります。
また、ロゴ画像の上下左右が欠けている場合は、横幅と高さを調べて上記のソースと差し替えてください。

メニューをカッコよくする

以下のソースを”外観” -> “拡張CSS” のCSSエディター内に追加してください。

/* メニュー全体の背景の設定 */
#access
{
  background-color: #ffffff;
  background-image: url(/wp-content/uploads/2010/09/menu.png);
  background-repeat: repeat-x;
  background-position: left top;
  color: #000000;
  border-bottom: 1px solid #cccccc;
  margin-bottom: 5px;
  padding: 5px 0;
}

/* メニューのリンク文字列 */
#access a
{
  color: #000000;
}

/* メニューの項目別の背景 */
#access li > a
{
  background-image: url(/wp-content/uploads/2010/09/menu-items.png);
  width: 150px;
  height: 40px;
  padding: 0px;
  text-align: center;
  margin-right: 3px;
}

/* メニューの項目別の背景(マウスオーバー及びカレントページ) */
#access ul li.current_page_item > a,
#access li:hover > a
{
  background-image: url(/wp-content/uploads/2010/09/menu-items.png);
  background-position: left bottom;
  color: #666666;
}

/* ポップアップメニューを無効にする */
#access ul li:hover > ul
{
  display: none;
}

まとめ

すごく、ざっとした説明で恐縮ですが、以上のような手順で、JavaScriptによるHTMLの書き換え+CSSというテクニックを使用すれば、複雑なテンプレートタグを使用しなくても十分に実用的なサイトが作れることがおわかりいただければ幸いです。

参考までにサンプルで使用した画像をおいておきますので、ご利用いただければ上記の事例が簡単に再現できると思います。

サンプル画像のダウンロード

WordPressプラグインEnhancing JavaScript 0.1をリリース

WordPress上で外部JavaScriptを取り扱うためのプラグインをリリースしました。

firegoby » WordPressに外部JavaScriptを追加するプラグイン

このプラグインを使用するとビジュアル エディターでJavaScriptを編集したり、WordPressにデフォルトで組み込まれているprototype.jsやjqueryなどのJavaScriptフレームワークを簡単にテーマに組み込むことが可能です。

Enhancing CSS 0.2

先日リリースしたEnhancing CSSのアップグレードを行ないました。

WordPressに外部CSSを追加するプラグイン

変更内容

  1. CSSの入力用のインターフェースに、行番号表示や、「取り消し」「やり直し」「検索」「置換」のボタンの追加など、ビジュアルエディターとしての機能を向上しました。
  2. 同梱のCodeMirrorのライセンスファイルも添付しました。
  3. その他、いくつかの外観に関する細かい修正を行ないました。

WordPressプラグイン”EnhancingCSS”をリリース

WordPressの管理画面上からCSSを編集し、外部スタイルシートとしてサイトに添付するプラグインを作成しました。

詳しくは以下のページへ。

firegoby » WordPressに外部CSSを追加するプラグイン

売りは、ビジュアル エディターに添付することが可能なことと、編集画面が色分けされることです。

WordPressに新しい権限グループを追加

WordPress に ウェブマスターという権限グループを追加するプラグインを作った。

WordPressにWebmasterという権限グループを追加

権限(ロール)をあれこれ触りたいという用途には向かないが、こういうロールが欲しいと思ってくれる人は多いと思う。

ちなみに、プラグイン内には、createNewRole.class.php というのが入っていて、このクラスは新しいロールの作成をとても簡単にやってくれるので、自力で他のロールを作りたいという人にも分かりやすい気がする。

参考

WordPressのビジュアルリッチエディターに独自CSS

WordPressのビジュアルリッチエディター内で編集中のコンテンツに、独自のCSSを適用する方法。

2010/09/14 追記

本サイトで配布しているEnhancing CSSというプラグインを使うと簡単にできます。

以下は WordPress3.0 以降でのみ有効。

テーマファイルで設定する場合

  • editor-style.css というファイルをテーマディレクトリの直下に作成する。
  • functions.php に add_editor_style(); という行を追加する。

add_editor_style() はパラメータにCSSのファイル名を指定することもできるが、親テーマか子テーマのディレクトリ以下での相対パスで指定する必要があることに注意する。

プラグインで設定する場合

このサイトで配布している以下のプラグインにも、以下の処理を追加した。

ビジュアルリッチエディタにテーブル編集用のボタンを追加するプラグイン

add_filter('mce_css', 'add_custom_editor_style');

function add_custom_editor_style($css) {
  $files = preg_split("/,/", $css);
  $files[] = '/path/to/style.css';
  $files = array_map('trim', $files);
  return join(",", $files);
}

/path/to/style.css の部分が追加したいCSSまでのURL。
このファイル内にエディターに適用したいCSSを記述すると、ビジュアルリッチエディターに反映される。

以下の部分はいらないと思うんだけど、念のため。

$files = array_map('trim', $files);

参考

WordPressのカスタム背景を任意の要素に指定する

WordPress 3.0から追加された機能のひとつにカスタム背景というサイトの背景を管理画面から変更するための機能がある。

この機能を有効にした際に表示される背景の設定画面はとてもよくできていて、background-position や background-repeat も簡単なチェックボックスで設定できるので、ぜひ有効にしたい。

使い方

使い方は非常に簡単。

  1. デフォルトのページの背景を style.css 等で body 要素に定義しておく。
  2. テーマファイルの functions.php に、add_custom_background(); という行を追加しておく。

以上で、以下のような管理画面が表示され、背景の設定が可能になる。

body 要素以外に適用するには?

今回、私たちが作成中のサイトでは、ページの上部にバーが表示されるため body 要素に背景を指定するには不都合が色々とあった。

そんな場合には、以下のようにコールバック関数を定義して、コールバック関数側で指定する要素を変えてやればいい。

add_custom_background('custom_background_callback');

上記の例では、custom_background_callback というのがコールバック関数の関数名になる。

あとは、以下のようにコールバック関数を用意して、そちらで任意の要素(以下の例では #wrap)に対して背景のスタイルを指定する。

function custom_background_callback() {
  $background = get_background_image();
  $color = get_background_color();
  if ( ! $background && ! $color )
    return;

  $style = $color ? "background-color: #$color;" : ''; 

  if ( $background ) {
    $image = " background-image: url('$background');";

    $repeat = get_theme_mod( 'background_repeat', 'repeat' );
    $bg_repeat = array('no-repeat', 'repeat-x', 'repeat-y', 'repeat');
    if (!in_array($repeat, $bg_repeat))
      $repeat = 'repeat';

    $repeat = " background-repeat: $repeat;";

    $position = get_theme_mod( 'background_position_x', 'left' );
    if ( ! in_array( $position, array( 'center', 'right', 'left' ) ) )
        $position = 'left';
    $position = " background-position: top $position;";

    $attachment = get_theme_mod( 'background_attachment', 'scroll' );
    if ( ! in_array( $attachment, array( 'fixed', 'scroll' ) ) )
        $attachment = 'scroll';
    $attachment = " background-attachment: $attachment;";

    $style .= $image . $repeat . $position . $attachment;
  }

  echo "<style type=\"text/css\">\n";
  echo "#wrap {\n";
  echo trim( $style )."\n";
  echo "}\n";
  echo "</style>\n";
}

ちなみに、この関数のソースの元ネタは wp-includes/theme.php にある _custom_background_cb() という関数。

参考