Quantcast
Channel: 小粋空間
Viewing all 219 articles
Browse latest View live

フォームに設置した複数のsubmitボタン(送信ボタン)をjQueryで制御する

$
0
0


1つのフォームに複数設置したsubmitボタン(送信ボタン)の挙動をjQueryで操作・変更する方法を紹介します。

1.用途

このエントリーでは次の2つのケースを紹介します。

  • 1つのフォームに同じ動作を行う送信ボタンを複数設置する
  • 1つのフォームに異なる動作を行う送信ボタンを設置する

2.1つのフォームに同じ動作を行う送信ボタンを複数設置する

たとえばページに表示されたフォームなどの上下に送信ボタンがあった方が、スクロール量が減るなどの利便性が高い場合があります。これをHTMLだけで実現するには、form要素(赤色)内にtype属性値「submit」のinput要素(青色)を設置すれば可能です。

<form name="foo" method="post" action="foo.cgi">
  <input type="submit" value="送信" />
  …中略…
  <input type="submit" value="送信" />
</form>
サンプル1

ただし、HTMLだけで実現する場合、form要素内にinput要素を記述しないといけないという制約があるようです。次のマークアップでは送信ボタンをクリックしても動作しません。

<input type="button" value="送信" />
<form id="foo" name="foo" method="post" action="foo.cgi">
  …中略…
</form>
<input type="button" value="送信" />

かといってform要素の開始タグと終了タグの記述位置を、送信ボタンを表示したい位置に移動するのもどうかと思われます。

ということで、input要素とjQueryと組み合わせれば送信ボタンを好きな位置に設置する例を示します。ちなみに、input要素は「XHTMLタグ一覧表示ツール」をご覧になればお分かりの通り、div要素やp要素、span要素などの子要素であれば、form要素だけでなく、任意の位置に記述することができます。

具体的には、次のようなjQueryを実装します。HTMLマークアップは動作に必要な要素以外は省略しているのでツッコミなしで。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script>
$(function(){
    $('input[type=button]').click(function() {
        $('#foo').submit();
    });
});
</script>
 
<input type="button" value="送信" />
<form id="foo" name="foo" method="post" action="foo.cgi">
  …中略…
</form>
<input type="button" value="送信" />
サンプル2

送信ボタン用のinput要素はform要素の外側にあります。送信ボタンをクリックすれば、jQueryのclickイベントでform要素を検索し、submitイベントを実行します。

あるいは、送信ボタンによって動作を変更したい場合があると思います。

2.1つのフォームに異なる動作を行う送信ボタンを設置する

1項で設置したボタンに対し、それぞれ異なる動作を行わせる方法を紹介します。

まず、フォームから起動するCGI(action属性)などを変更するには、次のようにします。input要素にid属性値(赤色)を追加し、それぞれにclickイベントを実装します。clickイベントの中では、form要素のaction属性値を書き換えてからsubmitイベントを実行するようにします。どちらか一方が書き換え不要な場合はform要素のaction属性をそのまま利用しても構いません。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script>
$(function(){
    $('#button1').click(function() {
        $('#foo').attr('action', 'bar.cgi');
        $('#foo').submit();
    });
    $('#button2').click(function() {
        $('#foo').attr('action', 'hoge.cgi');
        $('#foo').submit();
    });
});
</script>
 
<input id="button1" type="button" value="送信" />
<form id="foo" name="foo" method="post" action="foo.cgi">
  …中略…
</form>
<input id="button2" type="button" value="送信" />
サンプル3

次に、同じCGIを起動し、クリックされた送信ボタンによってPOSTデータを変更したい場合は、次のようにします。type属性「hidden」のinput要素(赤色)を追加し、clickイベントの中でform要素のinput要素の値を設定してからsubmitイベントを実行します。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script>
$(function(){
    $('#button1').click(function() {
        $('input[type=hidden]').val('bar');
        $('#foo').submit();
    });
    $('#button2').click(function() {
        $('input[type=hidden]').val('hoge');
        $('#foo').submit();
    });
});
</script>
 
<input id="button1" type="button" value="送信" />
<form id="foo" name="foo" method="post" action="foo.cgi">
  <input type="hidden" name="data1" value="" />
  …中略…
</form>
<input id="button2"  type="button" value="送信" />
サンプル4

CGIでは(上の例では)POSTデータの「data1」から値を取得できます。さらに異なるCGIを起動したい場合は、上記の2つのサンプルを組み合わせてください。

以上です。他にも実現方法はあると思いますので色々試してみてください。


デザインの学校 これからはじめるIllustrator&Photoshopの本

$
0
0


デザイン系ソフトとして超定番なIllustratorとPhotoshopの入門書の紹介です。著者の黒野明子さんより献本頂きました。ありがとうございました。

デザインの学校 これからはじめるIllustrator&Photoshopの本
黒野 明子 著 ロクナナワークショップ 監修
技術評論社

Illustrator/Photoshopが全く初めての方でも大丈夫なように、本書ではソフトの起動・操作画面の名称から解説が始まります。Illustrator/Photoshopをお持ちでない場合も、DVDに以下のソフトが収録されているので、買った日から学習を始めることができます。

  • Adobe Illustrator CS5.1体験版
  • Adobe Photoshop CS5.1体験版

Illustratorの基本操作では、ロゴマークや名刺の作り方、Photoshopの基本操作では写真のレタッチ(加工・修正)やブログバナー・未にバナーの作成など、実用的なサンプルが丁寧で分かりやすく解説されています。

すべての手順が大きな文字で解説されており、それぞれにスクリーンショットもついているので、戸惑うことなく作業を進めることができると思います。また、書籍で使用しているサンプルはサポートサイトからダウンロードすることもできます。

これからIllustrator/Photoshopを始めてみようという方におすすめの1冊です。

以下目次です。

第1章 基本図形でイラストを描いてみよう ~ Illustrator
 01 絵を描く準備をしよう
 02 長方形や正方形を描いてみよう
 03 楕円や正円を描いてみよう
 04 図形に色を塗ってみよう
 05 線の太さを変えてみよう
 06 タッチのある線を描いてみよう
 07 ペンツールで自由な図形を描いてみよう
 08 図形を回転してみよう
 09 ドキュメントを保存しよう
第2章 ロゴマークを作ってみよう ~ Illustrator
 01 文字を入力してみよう
 02 文字を図形に変換してみよう
 03 図形を変形してみよう
 04 図形を重ねて切り抜いてみよう
 05 図形を装飾してみよう
 06 グラデーションを指定しよう
 07 つややかな光の表現を作成しよう
 08 立体感を出してみよう
第3章 名刺を作ってみよう ~ Illustrator
 01 名刺の枠を作ってみよう
 02 文字のスタイルを指定してみよう
 03 背景をパターンで指定しよう
 04 ロゴマークを貼り付けてみよう
 05 配置を整えてみよう
 06 名刺のバリエーションを作ってみよう
第4章 写真をレタッチしてみよう ~ Photoshop
 01 写真を切り抜いてみよう
 02 写真の明るさや色を修正してみよう
 03 写真の一部分だけ色を変えてみよう
 04 写真に図形を重ねてみよう
 05 写真に自由に描き込みしてみよう
 06 ファイルを保存しよう
第5章 ブログのタイトルバナーを作ってみよう ~ Photoshop
 01 サイズを指定して新規ドキュメントを作成しよう
 02 レイヤーを複製しよう
 03 文字の下地を作成しよう
 04 タイトルを入力しよう
 05 ブラシを使ってみよう
 06 Web 用に書き出してみよう
 07 ミニバナーを作ろう
第6章 写真をイラスト風に加工してみよう ~ Photoshop
 01 人物を切り抜いて合成してみよう
 02 人物を複数に増やしてみよう
 03 すべてのレイヤーを統合しよう
 04 写真をイラスト風のタッチにしてみよう
第7章 ポストカードを作ってみよう ~ Illustrator&Photoshop
 01 写真内の不要なものを消去してみよう
 02 はがきサイズのレイアウト枠を作ってみよう
 03 背景パターンを作ってみよう
 04 写真をはがきサイズの枠内に配置してみよう
 05 テキストを流し込んでみよう
 06 文字を装飾してみよう
 07 足跡のマークを入れてみよう

私はIllustrator/Photoshopともなんとなく使えるのですが、この本を読んで基本的な操作からもう一度しっかり身につけようかと思います。

余談ですが、黒野さんとは以前「CMSとして使うMovable Typeガイドブック」という書籍の共著で一緒にお仕事させて頂きました。

CMSとして使うMovable Typeガイドブック
黒野 明子 荒木 勇次郎
翔泳社

またいつか、そういった機会があればと思います。

クロスバイク用のフロアポンプ(空気入れ)

$
0
0


昨年買ったクロスバイク用のフロアポンプ(空気入れ)の紹介です。

クロスバイクを購入したとき、お店に人から「空気入れは必ず購入してください」と言われ、ネットで色々と調べて、シマノの「シマノ PRO フロアポンプ HPコンペティション」にしました。

なぜフロアポンプを購入しなければならないかというと、

  • 通常の空気入れでは入らない
  • 乗るときに空気圧を常に最適にしておいた方がいい

の2点のためです。ということで、以下解説です。

1.通常の空気入れでは入らない

通常の空気入れで入れらない理由は、空気圧の違いです。

ママチャリのタイヤの空気圧はせいぜい2.5~3kg/c㎡です。ところがクロスバイクやロードバイクの空気圧はなんと7~8kg/c㎡必要です。この空気圧にするためには普通の空気入れで入れることができないようです。

このことを知らずに、ママチャリ用やマウンテンバイク用の空気入れをうっかり買ってしまわないよう、注意が必要です。

またクロスバイクやロードバイクは、空気を入れる部分(バルブ)が仏式バルブ(フレンチバルブ)または米式バルブとなっています。ママチャリは英式です。つまり仏式バルブ・米式バルブに対応した空気入れが必要というわけです。

2.乗るときに空気圧を常に最適にしておいた方がいい

空気圧を常に最適にしておいた方がいいのは、タイヤを長持ちさせるためです。

空気圧が低過ぎるとタイヤと地面との接地面積が増えるため、パンクしやすくなります。また、摩擦も大きくなってスピードが出にくくなります。

乗り始めてから分かったのですが、空気圧を最適にしても数日で4~5kg/c㎡に下がります。つまりこまめに空気を入れる必要があるので、フロアポンプなしにはクロスバイクを楽しむことはできません。

ということでなかなか面倒なのですが、手がかかるところに楽しさもあります。

3.シマノプロ フロアポンプ コンペティション

クロスバイク・ロードバイク用のフロアポンプにも色々種類がありますが、「シマノプロ フロアポンプ コンペティション」を選んだのは、楽天のレビューでかなり評価が高かったためです。

シマノプロ フロアポンプ コンペティション

以下のページには2012年1月現在で481件のレビューがあり、全体で4.59とかなりの高評価です。

楽天市場 - シマノプロ フロアポンプ コンペティション

何がいいかと言うと、具体的にはグリップ部分が握りやすく、空気が入れやすいです。また旧モデルから本体が鉄からアルミに変更になり、軽くなってます。

ゲージ(メーター)はこのような感じです。他の製品は本体下部についているものが多いようですが、本体上部についているので見やすいです。表示はbar/psi(1bar×1.02=1㎏/c㎡)で11気圧まで入ります。

ゲージ

バルブは英・米・仏のすべてに対応しています。赤い方がフレンチバルブ用、黒い方が米式バルブ用で、利用する方にレバーの目印をあわせるとバルブに装着できます。英式を使うときにはアダプターを装着します。

バルブ

空気圧が高いので「入れるのが大変だろうな」と思われるかもしれませんが、実際は3~4回で既定の空気圧になります。

リロードしたときにjQueryでページの先頭にスクロールさせる方法

$
0
0


ページをリロードしたときに、jQueryでページの先頭にスクロールさせる方法を紹介します。

リンクをクリックしてページの先頭にスクロールさせる方法はネット色々出てきますが、リロードのタイミングでスクロール(=要はページの先頭を表示)させる手段がみつかりませんでした。

別の実験を行っていてこのような動作を行いたいケースが発生したため、少し調べてみました。認識誤りな点がありましたらご指摘ください。

1.JavaScriptのscrollTo()を使ったスクロール

まず、JavaScriptのscrollTo()を使って次のようなコードを記述してみましたが、正常に動作しませんでした。

window.onload = function(){
    window.scrollTo(0,0);
}

動作結果は次の通りです。

  • Firefox:ページトップに移動するが、スクロールバーは戻らない
  • Chrome:ページトップに移動しない(挙動としては一旦トップに戻って、またもとの位置にスクロールされる)
  • IE9:ページトップに移動しない(〃)

2.jQueryのscrollTop()を使ったスクロール

次に、jQueryのscrollTop()を使って次のようなコードを記述してみましたが、こちらも正常に動作しませんでした。

$(function() {
    var pos = $('html,body').scrollTop();
    $('html,body').scrollTop(-pos);
});
  • Firefox:ページトップに移動するが、スクロールバーは戻らない
  • Chrome:ページトップに移動しない(少し戻るがトップまで戻らない」)
  • IE9:ページトップに移動しない

3.jQueryのanimate()を使ったスクロール

最後にjQueryのanimate()で次のようなコードを書いてみたところ、とりあえずどのブラウザでもトップに戻ることができました。

$(function() {
    $('html,body').animate({ scrollTop: 0 }, '1');
});

animateの第2パラメータ(duration)を「'1'」としている理由は、「0」では動作しない(jQueryの仕様?)ということと、クォーテーションで括らないとIE9で正常に動作しないためです。また、firefoxはスクロール動作が遅いようです。

以上です。スクロールにこだわった実験ですが、観点がそもそも間違っていて「こうすればリロード前のスクロール状態がクリアできる」という方法があるかもしれません。あしからず。

TwitterやFacebookのように一番下までスクロールしたら自動的にコンテンツを表示する「jQuery.Bottomプラグイン」

$
0
0


TwitterのタイムラインやFacebookのニュースフィードように、ページの一番下までスクロールしたらコンテンツを自動的に表示する「jQuery.Bottomプラグイン」を紹介します。

1.サンプル

jQuery.Bottomプラグインにはデモページが用意されていますが、いまいちなのでサンプルページを作りました。

jQuery.Bottomプラグインサンプル
jQuery.Bottomプラグインサンプル

ページの一番下までスクロールすると自動的にコンテンツを表示します。

なお、最初に表示した状態でコンテンツがすべて表示されてしまっているとそもそも動作しないので注意してください。

2.プラグインの機能

jQuery.Bottomプラグインは「bottom」イベントを登録するためのものです。このイベントを利用してページの一番下までスクロールすれば、bottomイベントが発生します。

3.プラグインのダウンロード

githubのjQuery.Bottomプラグインのページよりダウンロードします(ページ左側にあるZIPをクリック)。

jQuery.Bottomプラグインのページ

4.プラグインのインストール

コンテンツを表示したいページに次のような内容を設定します。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript" src="jquery.bottom-1.0.js"></script>
<script type="text/javascript">
$(function() {
    $(window).bottom({proximity: 0.05});
    $(window).on('bottom', function() {
        // コンテンツ表示の処理を記述
    });
});
</script>

以下、設定内容の解説です。

bottom()メソッドでは、指定したオブジェクトにbottomイベントを登録します。下の例ではwindowオブジェクトに対して登録しています。

$(window).bottom();

特定の要素に対して設定することも可能です。

$('#hoge').bottom();

オプションのproximityは、スクロールバーがページ最下部にどの程度接近したらbottomイベントを発生させるかを決めるためのものです。

$(window).bottom({proximity: 0});

Twitterで、スクロールバーがページ一番下に到達しない時点でコンテンツの読み込みが開始するのを思い出してもらえればこのオプションの役割が分かると思います。

値に「0」を設定すると、スクロールバーがページ一番下に到達したときにbottomイベントが発生します。値を大きくしていくほどページ一番下から遠い位置でbottomイベントが発生します。冒頭のサンプルでは「0.05」になっています。

さて、メインのbottomイベント処理はon()メソッドで実行すると良いでしょう。

$(window).on('bottom', function() {
    // コンテンツ表示の処理を記述
});

さらに具体的なサンプルを示します。1項の動作サンプルではコンテンツの読み込みんでいる状態を分かりやすくするよう、setTimeout()を利用しているので、実際には以下のような実装になると思います(厳密にはajax()ではなく、getJSON()などを使うと思いますが)。

$(window).on('bottom', function() {
    var obj = $(this);
    if (!obj.data('loading')) {
        obj.data('loading', true);
        $('#image').html('<img src="loader.gif" />');
        $.ajax({
            url: "test.html",
            cache: false,
            success: function(html){
                $("#hoge").append(html);
                $('#image').html('');
               obj.data('loading', false);
            }
        });
    }
});

キモとなるのは赤色の部分で、このプラグインではスクロールを上下させたときにbottomイベントが何回も発生してしまいます。そのときに処理を重複させないための制御で、最初にイベントが発生した時点でobj.dataの「loading」をtrueにすることで次の重複イベントを処理しないようにします。

ローディング画像はイベントが発生した時点で任意のエリアに表示させ、コンテンツの表示と同時に削除します。

$(window).on('bottom', function() {
        …中略…
        ('#image').html('<img src="loader.gif" />');
        $.ajax({
            url: "test.html",
            success: function(html){
                …中略…
                $('#image').html('');
            }
        });
    }
});

5.注意事項

サンプルではスクロールバーが下の方にある状態でページをリロードすると、コンテンツの表示が連続で行われてしまうため、リロードしたときにページの先頭を表示する次の制御が必要かもしれません。

$('html,body').animate({ scrollTop: 0 }, 'normal');

Twitterなどではリロード時にコンテンツを最初から読み込み直しているのでスクロールバーが消えるようですが、そういった何らかの制御が必要みたいです。

6.参考サイト

参考サイトは以下です。ありがとうございました。

Androidのキーボードで全角の英数文字や記号を入力する

$
0
0


Androidのデフォルトで用意されているキーボードで全角の英・数・記号を入力する方法です。確認機種はXperia Acroです。機種によって操作方法が違っていたらすいません。

まず、半角英文字の入力は次のような感じです。

半角英文字の入力

全角文字に切り替えるには、キーボードの左下にある「文字あAa12」のキーを長押しします。

全角文字に切り替える

切り替え画面が表示されるので、「全」をタップします。キーボードの種類などもこの画面で切り替えられます。

切り替え画面

わかりにくいですが、これで全角キーボードに切り替わりました。「@」マークで冒頭のキーボードとの見分けがかろうじてつくと思います。

全角キーボード

入力すると全角になったことがわかります。

全角入力

上の状態で「↑」をタップして大文字に切り替えれば、そのまま全角で入力できます。半角大文字から全角に切り替えると一旦小文字に戻ってしまうので注意しましょう。

全角大文字

一旦全角にしたら、4つ前の画面で「半」をタップするまで、英数文字と記号について全角文字が適用され続けます。下は全角数字キーボードにして入力したところです。

全角数字キーボードにして入力したところ

記号を出すには、数字のキーボードに切り替えてから「↑」をタップします。

数字のキーボード

これで記号用のキーボードに切り替わりました。これは半角の状態です。

半角記号のキーボード

冒頭と同様、左下の「文字あAa12」を長押しして「全」をタップすれば全角記号のキーボードに切り替わります。

全角記号のキーボード

以上です。

Movable Typeの一覧画面にリストアクションを追加する

$
0
0


Movable Typeのプラグイン開発ネタで、一覧画面にリストアクションを追加する方法です。バージョンは5.1以降です。

「リストアクション」とは、一覧画面内に表示されたチェックボックスをチェックして動作をさせるための機能です。

リストアクションのメニューを表示
リストアクション

1.プラグインのリストアクションを追加する

プラグインのリストアクションは、次のように「プラグインアクション」というoptgroup要素の中に追加したアクションが表示されます。

プラグインのリストアクション

プラグインのリストアクションを追加するには、次の内容をfoo.plなど任意のファイル名でplugins配下にアップロードします。赤色部分がリストアクション定義です。

package MT::Plugin::Foo;
 
use strict;
use base qw( MT::Plugin );
 
my $plugin  = MT::Plugin::Foo->new({
    id          => 'foo',
    name        => 'foo',
    description => 'This is foo',
    version     => '0.1',
    registry => {
        list_actions => {
            entry => {
                foo => {
                    label => 'foo',
                    mode => 'foo',
                    order => 1000
                },
            },
        },
    },
});
MT->add_plugin($plugin);

2.コア機能としてリストアクションを追加する

コア機能としてのリストアクションは次のように、既存のリストアクションと並べて表示でき、1項のリストアクションよりメニューがすっきりします。もちろんメニューからの動作はプラグインで実装可能です。

コア機能のリストアクション

コア機能としてリストアクションを追加するには、次の内容をfoo.plなど任意のファイル名でplugins配下にアップロードします。

package MT::Plugin::Foo;
 
use strict;
use base qw( MT::Plugin );
 
my $plugin  = MT::Plugin::Foo->new({
    id          => 'foo',
    name        => 'foo',
    description => 'This is foo',
    version     => '0.1',
    registry => {
        callbacks => {
            init_request => \&init_request,
        },
    },
});
MT->add_plugin($plugin);
 
sub init_request {
    my ($eh, $app) = @_;
    my $core = MT->component("core");
    $core->registry("list_actions", "entry", "foo",
        {
            label => 'foo',
            mode => 'foo',
            order => 1000,
        });
}
1;

1項との違いは、プラグインのレジストリにlist_actionsを追加するのではなく、init_request実行契機でコア機能($core)のレジストリに追加している点です。

registry()のパラメータにサンプルのようなハッシュ形式を記載すれば、list_actions以外の内容でも追加することができます。

    $core->registry("list_actions", "entry", "foo",
        {
            label => 'foo',
            mode => 'foo',
            order => 1000,
        });

3.注意事項

プラグイン定義はYAMLでも記述することができますが、MT5.12現在では、次のようなYAMLを定義しても一覧画面にリストアクションを追加することができないようです。

id: foo
name: foo
version: 0.01
list_actions:
    entry:
        foo:
            label: 'foo'
            mode: foo
            order: 1000

複数のWordPressをまとめて管理できる「ManageWP」

$
0
0


複数のWordPressを一括管理できるサービス「ManageWP」を紹介します。アカウントをとってちょっと操作してみましたが、複数のウェブサイトをWordPressで管理している人にとってはかなり便利な気がします。

ManageWP
ManageWP

ManageWPは一括管理可能な画面を提供します。一括管理できるということは、複数のWordPressにログインせずに済むというメリットがあります。たとえば複数サイトに異なる記事を投稿したい場合など、ManageWPにログインして投稿先のWordPressを選択して投稿すれば、複数のWordPress管理画面を横断する必要がなくなります。

トライアル(2週間、10サイトまで)は無償ですが、基本は有償です。価格は最後に紹介します。

以下、操作方法です。

1.サインアップ

ManageWPのページにアクセスして「Sign Up」をクリック。

Sign Up

ユーザー名・メールアドレス・パスワードを入力して「Register」をクリック。

Register

完了するとようこそ画面が表示されます。

ようこそ画面

2.ウェブサイトの追加

ManageWPに管理したいウェブサイトを追加するには、1項の作業が終わると表示される「Add your first webiste」をクリック。

Add your first webiste

「website url」にWordPressのインストール先のURL(「wp-admin」は不要)、「admin usename」にインストールしたWordPressのユーザー名を入力して「Add Site」をクリック。

Add Site

WordPressへのアクセスが成功したら次の画面に切り替わるので、「Click hire to install ManageWP Worker plugin」のあたりをクリック。
これは、ManageWPの管理対象にするWordPressには「ManageWP Worker」プラグインが必要なためです。追加するWordPressにすべてこのプラグインをインストールします。

Click hire to install ManageWP Worker plugin

プラグインのインストール画面に移動するので、「ManageWP Worker」の「いますぐインストール」をクリック。

いますぐインストール

「プラグインを有効化」をクリック。

プラグインを有効化

ManageWPの画面に戻って「Add Site」をクリック。

Add Site

これで登録完了です。このダイアログを使って別のウェブサイトを続けて登録することもできますし、あとで追加することもできます。

登録完了

ウェブサイトを1つ登録すれば次のような管理画面が表示されます。日本語ではありませんが大体分かると思います。左側に主なメニュー、中央にはダッシュボードが表示されます。スクリーンショットは「user-domain/wordpress」と「hoge-domain/wordpress」の2つのウェブサイトを登録した状態にしています。

管理画面

次項以降で、いくつかの機能を紹介していきます。

3.記事の一括投稿

一括投稿画面です。右サイドバーにある「Select Sites」で投稿するサイトを選択します。

一括投稿画面

投稿が完了すると次のように表示されます。

投稿完了

一括投稿も可能ですが、複数のWordPressにログインしなおさずに、この画面だけで投稿できるのがいいですね。

4.プラグインの一括有効化

すでに各WordPressにインストールされているプラグインを一括で有効化してみます。ここでは「Akismet」を有効化してみます。

対象のウェブサイトをチェックして、インストール済みのプラグイン「Akismet」を検索します。

検索

有効化するウェブサイトをチェックして有効化します。チェックボックスがウェブサイトの部分とAkismetにあるのは、複数のプラグインがヒットしたときのことを考慮していると思われます。ウェブサイトの部分をチェックすれば、ヒットしたすべてのプラグインにチェックがつきます。

有効化

実施状況はプログレスバーで表示されます。

実施状況

完了しました。ウェブサイトのプラグイン画面をみたところ、チェックしたすべてのWordPressでAkismetが有効化されてました。

プラグイン画面

5.プラグインの一括インストール

各WordPressにプラグインを一括インストールしてみます。

インストールしたいプラグインを検索します。ここでは「WB-DBManager」を検索します。

プラグインを検索

みつかりました。「Install」をクリックします。

Install

インストールの進行状況はプログレスバーで表示されます。

インストール状況

チェックしたWordPressにインストールされました。有効化もされています。

プラグイン画面

6.ユーザーの一括管理

ユーザーの一括管理もできます。スクリーンショットはパスワードの一括変更です。

ユーザーの一括管理

7.バックアップ

バックアップも行えるようです。これは試してません。

バックアップ

8.SEOチェック

SEOの設定をチェックする機能(被リンク数・トラフィック・Twitter・Facebook等)もあるようです。

SEOチェック

9.費用・支払い

費用の確認や支払いは、メニュー上部にある「Trial」のリンクをクリック。

Trial

右側にある「order Now」をクリック。

order Now

タイプはスタンダード・プロフェッショナル・ビジネスの3種類があります。スタンダードは1年払いで1ヶ月あたり$6.30みたいです。ウェブサイト数と期間によって支払い額は異なるので、詳細を知りたい方はとりあえずアカウントをとって確認してみてください。

タイプ

以上です。元ネタは「複数のWordPressサイトを運営しているなら、ManageWPでまとめて管理しよう」です。


Excelの行・列の表示・非表示を切り替える

$
0
0


Excelの行・列の表示・非表示を切り替える方法です。

動作確認バージョンはExcel2003とちょっと古いです。新しいバージョンではメニューが若干異なると思われますが機能は同じかと思います。

このエントリーの解説では次の表を使用します。この表のB~D列の表示・非表示を切り替えます。エントリーの本題は2項です。

サンプル

1.「表示しない」メニューを利用する

非表示にしたい列を選択状態にしたあと、右クリックして「表示しない」を選択します。

「表示しない」を選択

このようになります。

非表示にした状態

行を非表示にする場合は行を選択状態にして同様の操作を行います。

非表示にした行・列を表示させるには、非表示になっている行または列をまたがるように選択状態にして、右クリックメニューから「再表示」を選択します。

ただしこの方法では、表示・非表示を一時的にしか行うことしかできません。ということで、より最適な方法を次項に示します。

2.「グループ化」する

このエントリーの本題です。まず、非表示にしたい行・列を選択状態にします。

非表示にしたい行・列を選択

メニューバーの「データ」→「グループとアウトラインの設定」→「グループ化」を選択します。Excel 2007/Excel 2010であれば「データ」→「アウトライン」→「グループ化」を選択します。

グループ化

セルの上部に、赤枠で括った表示が現れます。スクリーンショットのB~D列の上部にある点がグループ化対象、さらにその上にある線がグループを示します。線の端に表示されている「-」をクリックすれば、グループ化された列を非表示にします。

グループ化の表示

非表示になりました。「+」をクリックすれば、非表示の列を表示します。この機能を利用すれば表示・非表示を繰り返し行うことができます。左側に表示されている「1」「2」の機能については後述します。

非表示

グループ化を解除する場合は、解除したい行・列を選択して、メニューバーの「データ」→「グループとアウトラインの設定」→「グループ解除」を選択します。

グループ解除

行のグループ化を行うと、次のように表示されます。

行のグループ化

行・列のグループ化をあわせて行うと、次のように表示されます。

行・列のグループ化

行・列を閉じたところです。

行・列のグループ化で閉じたところ

複数箇所に設定することも可能です。この状態で左側にある「1」「2」のボタンをクリックすれば、まとめて表示・非表示が行えます。

複数箇所に設定

グループ化はさらに階層化することも可能です。階層化に伴い、左側の番号も積みあがっていきます。

グループ化の階層化

クロスバイク購入(GIANT TRADIST SL)

$
0
0


昨年12月にエントリーした「クロスバイク購入」の続きです。遅くなりましたが購入モデルのお披露目です。

購入した車種は、タイトルの通り「GIANT TRADIST SL」です(ピンボケ写真ですいません)。

GIANT TRADIST SL 2011春限定モデル

ちなみに12月にエントリーした記事の候補車種「GIANT TRADIST SL(2012年モデル):下」の2011年モデルになります。

GIANT TRADIST SL(2012年モデル)

2012年モデルにはフロントディレーラー(変速機)がついているなど、改良された点もあるのですが、あえて旧モデルを選んだ理由は次項で説明します。

1.入手経緯

比較的簡単に入手したように思われるかもしれませんが、そもそもこのモデルは「2011春限定モデル」の台数限定商品で、発表されたのは2011年2月頃。しかも発表からわずか1週間で予約で完売になってしまう人気モデルでした。

私がクロスバイクを買おうと思ったのは2011年の11月。ネットでこのモデルをみつけ、ホリゾンタルフレーム(トップチューブが地面と平行になっていること)のデザインとカラーが気に入って「欲しい!」と思ったのがそもそもの動機です。が、そのときには市中在庫はまったくない、かなり周回遅れな状態だったわけです。

なので、そのことが判明した時点で、後継の真っ黒な2012年モデルを買おうと決め、GIANTのショップに実物を見に行ったりしてました。これはこれで気に入ってました。

ところが懲りずに調べているうちに、とあるサイクルショップのウェブサイトに在庫として表示されているのを偶然発見しました。この車種には身長にあわせてサイズが2種類あるのですが、私の身長に合う方のサイズが残ってました。

ただウェブサイトでは在庫ありになっていても、すでに売り切れていることもよくあるケースです。さらにそのお店のウェブサイトは昔のいわゆる「ホームページ」っぽい感じで、更新もきちんと行われていないような雰囲気だったので、半ば諦めムードでお店に確認したところ、

「残ってますよ」

と意外な返答を頂き、すぐにおさえてもらって週末に実物を見にいき、速攻で決めました。それが2011年12月の上旬だったので、我ながらラッキーな買い物だったと思います。2011年の運はそこで使い果たしたと思いますがすぐに年が明けました(笑)。

2.仕様など

フレームカラーはハイポリッシュ。シートポストはカーボンで、ロードバイクタイプのサドルを使用しています。フロントフォークもフレームに合わせてクロムメッキ仕上げになっています。リム(タイヤの枠)の幅が太く、業界では「ディープリム」と呼ぶらしいです。

GIANT TRADIST SL 2011春限定モデル

以下、仕様です(公式サイトからの引用)。

フレームALUXX-Grade Aluminum OLD130mm
フロントフォークCr-mo
BBセットTH 7420ST 116-68mm
ギアクランクLASCO 44T/CG 165mm(S), 170mm(M)
チェーンSHIMANO HG73
R.ディレーラーSHIMANO TIAGRA
シフターSHIMANO SL-R440 9S
ブレーキセットTEKTRO ROAD 57mm
ブレーキレバーTEKTRO
ギアSRAM PG950 9S 12-26T
ヘッドセットFSA ORBIT DL
ハンドルバーAluminum 25.4 520mm
ハンドルステムAluminum 25.4 90mm
サドルSELLE ROYAL SETA M
シートピラーCarbon 27.2x350mm
シートクランプAluminum 31.8 SEATPIN
ペダルAluminum CAGE
FハブFORMULA 16H
RハブFORMULA 20H
リムGLM SL42 16H,20H
スポークStainless 14G
タイヤMAXXIS DETONATOR 700x28C
チューブバルブ仏式バルブ
付属品ベル

重量は9.5kgと結構軽いです。ディレーラーはリアのみで8段変速ですが、街乗りであればまったく支障ありません。

ちなみにクロスバイクを購入したお店は外から見ると、どこにでもある街の自転車屋さんですが、一歩中に入ると、展示されている自転車はロードバイクやクロスバイクで占められているという、羊の皮をかぶった狼のようなサイクルショップです。

WordPressのサイドメニューを折りたたむ「wp_list_folderプラグイン」バージョンアップ

$
0
0


WordPressのサイドメニューを折りたたむ「wp_list_folderプラグイン」をバージョンアップしました。

1.プラグインの機能

WordPressのサイドメニューで折りたたみができるようにします。

プラグイン適用前(Twenty Tenテーマ)
プラグイン適用前

プラグイン適用後の折りたたんだ状態
プラグイン適用後

2.プラグインの変更点

ページを移動したときに、メニューの折りたたみ状態を保持できない不具合を解消しました。以下解説です。

このプラグインはjQueryの「Listfolderプラグイン」を利用しているのですが、ページを移動したときに折りたたみ状態を保持するために、各メニュータイトルに次のようなid属性の設定が必要です(その値をクッキーに保持します)。

<dt class="sidetitle" id="hoge">Recent Entries</dt>
<dd>
  <ul>
    <li><a href="2011/08/post-8.html" title="e22">業務提携に関するお知らせ</a></li>
    <li><a href="2010/09/post-9.html" title="e23">モバイルサイトオープン</a></li>
    <li><a href="2010/07/java.html" title="e19">ソリューションセミナー</a></li>
  </ul>
</dd>

ただし、WordPressのウィジェットではこの設定を行うことが困難なようです。困難な理由は次のとおりです。

WordPressのウィジェットはwidgets_initフックでカスタマイズできるようになっています。下はTwentyElevenのfunctionc.phpにあるwidgets_initフックの実装です。

/**
 * Register our sidebars and widgetized areas. Also register the default Epherma widget.
 *
 * @since Twenty Eleven 1.0
 */
function twentyeleven_widgets_init() {
 
    register_widget( 'Twenty_Eleven_Ephemera_Widget' );
 
    register_sidebar( array(
        'name' => __( 'Main Sidebar', 'twentyeleven' ),
        'id' => 'sidebar-1',
        'before_widget' => '<aside id="%1$s" class="widget %2$s">',
        'after_widget' => "</aside>",
        'before_title' => '<h3 class="widget-title">',
        'after_title' => '</h3>',
    ) );
    …中略…
}
add_action( 'widgets_init', 'twentyeleven_widgets_init' );

メニュータイトルに該当するのは赤色で示した「before_title」の部分ですが、ウィジェットごとに異なるid属性値を設定できないようです。wp-includes/widgets.phpにあるregister_sidebar()のデフォルト値(赤色部分)も次のようになっています。

function register_sidebar($args = array()) {
    global $wp_registered_sidebars;
 
    $i = count($wp_registered_sidebars) + 1;
 
    $defaults = array(
        'name' => sprintf(__('Sidebar %d'), $i ),
        'id' => "sidebar-$i",
        'description' => '',
        'before_widget' => '<li id="%1$s" class="widget %2$s">',
        'after_widget' => "</li>\n",
        'before_title' => '<h2 class="widgettitle">',
        'after_title' => "</h2>\n",
    );
    …後略…

ただし、その手前にある「before_widget」にはid属性値が付与されるので、これを利用できるようにしました。

        'before_widget' => '<aside id="%1$s" class="widget %2$s">',

「before_title」にこの設定がある場合、ページ移動を行ったときに折りたたみ状態が保持されるようになります。

3.プラグインのダウンロード

wp_list_folderプラグインは以下のリンク先からダウンロードできます。

WordPressのサイドメニューを折りたたむ「wp_list_folderプラグイン」

HTML5のWebsocketを使ったお絵かきチャット

$
0
0


HTML5のWebsocket(Node.js+Socket.IO)を使って、お絵かきチャットが行えるサンプルを作ってみました。Node.js+Socket.IOについては、下記のエントリーを参照してください。

Windows+Node.js+Socket.IO

環境を作ったのは自分のPCのためリアルでお見せできないのが残念ですが、動画をキャプチャしたのでそちらでご確認ください。

1.サンプル動画

2つのブラウザからそれぞれ「http://127.0.0.1:8124」にアクセスして、チャットを行います。お絵かきの内容をページにアクセスしている別のブラウザに反映します。

下の表示は画面が小さいので、全画面表示にするかYoutubeのサイトで直接見た方がいいかもしれません。

2.サンプルコード

Node.jsとSocket.IOを使ったサンプルコードを掲載しておきます。

色々ネットを探しましたが(探しきれてないかもしれません)、Node.js+Socket.IOでお絵かきチャットを行う適当なコードがみつからなかったので自作しました。Node.jsやSocket.IOに精通されている方にとっては当たり前のような実装かと思います。冗長な部分等ありましたらご指摘ください。

app.js(サーバ側のソース)

var app = require('express').createServer()
  , io = require('socket.io').listen(app);
app.listen(8124);
 
app.get('/', function (req, res) {
    res.sendfile(__dirname + '/index.html');
});
 
io.sockets.on('connection', function (socket) {
 
    // クライアントからメッセージ受信
    socket.on('clear send', function () {
 
        // 自分以外の全員に送る
        socket.broadcast.emit('clear user');
    });
 
    // クライアントからメッセージ受信
    socket.on('server send', function (msg) {
 
        // 自分以外の全員に送る
        socket.broadcast.emit('send user', msg);
    });
 
    // 切断
    socket.on('disconnect', function () {
        io.sockets.emit('user disconnected');
    });
});

index.html(クライアント側のソース:赤色部分がWebsocket関連の処理)

<!doctype html>
<html>
<head>
<meta charset="utf-8"> 
<title>Canvas</title>
<style>
body {
    margin: 20px;
}
canvas {
    top: 20px;
    left: 20px;
    border: 5px solid #ccc;
}
#button {
    position: relative;
    top: -55px;
    left: 345px;
}
#save {
    font-size: 120%;
    width: 80px;
    height: 50px;
}
#clear {
    font-size: 120%;
    width: 80px;
    height: 50px;
}
ul {
    margin: 0;
    padding: 0;
    list-style: none;
}
li {
    cursor:pointer;
    cursor:hand;
    display:inline-block;
    border: 1px solid #000;
    width: 50px;
    height: 50px;
}
</style>
</head>
<body>
<canvas width="500" height="400"></canvas>
<ul>
<li style="background-color:#000"></li>
<li style="background-color:#f00"></li>
<li style="background-color:#0f0"></li>
<li style="background-color:#00f"></li>
<li style="background-color:#ff0"></li>
<li style="background-color:#fff"></li>
</ul>
<div id="button">
<input type="button" id="save" value="保存" />
<input type="button" id="clear" value="消去" />
</div>
 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
$(function() {
    var offset = 5;
    var fromX;
    var fromY;
    var drawFlag = false;
    var context = $("canvas").get(0).getContext('2d');
    var socket = io.connect('http://localhost');
 
    // サーバからメッセージ受信
    socket.on('send user', function (msg) {
        context.strokeStyle = msg.color;
        context.lineWidth = 2;
        context.beginPath();
        context.moveTo(msg.fx, msg.fy);
        context.lineTo(msg.tx, msg.ty);
        context.stroke();
        context.closePath(); 
    });
 
    socket.on('clear user', function () {
        context.clearRect(0, 0, $('canvas').width(), $('canvas').height());
    });
 
    $('canvas').mousedown(function(e) {
        drawFlag = true;
        fromX = e.pageX - $(this).offset().left - offset;
        fromY = e.pageY - $(this).offset().top - offset;
        return false;  // for chrome
    });
 
    $('canvas').mousemove(function(e) {
        if (drawFlag) {
            draw(e);
        }
    });
 
    $('canvas').on('mouseup', function() {
        drawFlag = false;
    });
 
    $('canvas').on('mouseleave', function() {
        drawFlag = false;
    });
 
    $('li').click(function() {
        context.strokeStyle = $(this).css('background-color');
    });
 
    $('#clear').click(function(e) {
        socket.emit('clear send');
        e.preventDefault();
        context.clearRect(0, 0, $('canvas').width(), $('canvas').height());
    });
 
    function draw(e) {
        var toX = e.pageX - $('canvas').offset().left - offset;
        var toY = e.pageY - $('canvas').offset().top - offset;
        context.lineWidth = 2;
        context.beginPath();
        context.moveTo(fromX, fromY);
        context.lineTo(toX, toY);
        context.stroke();
        context.closePath();
 
        // サーバへメッセージ送信
        socket.emit('server send', { fx:fromX, fy:fromY, tx:toX, ty:toY, color:context.strokeStyle });
        fromX = toX;
        fromY = toY;
    }
 
    $('#save').click(function() {
        var d = $("canvas")[0].toDataURL("image/png");
        d = d.replace("image/png", "image/octet-stream");
        window.open(d,"save");
    });
});
</script>
</body>
</html>

3.サーバへのデータ送信方法

お絵かきはHTML5のcanvasを利用しています。canvasを使ったお絵かきについては「HTML5のcanvasを使ったお絵かきツール詳説」で詳しく解説しているのでそちらを参照してください。サンプルは同じものを使っています。

サーバへお絵かき情報をサーバに送信するのは、マウスで線を引いているときに起動する関数draw()で、socket.emit()を記述します(青色部分)。

クライアント側

function draw(e) {
    var toX = e.pageX - $('canvas').offset().left - offset;
    var toY = e.pageY - $('canvas').offset().top - offset;
    context.lineWidth = 2;
    context.beginPath();
    context.moveTo(fromX, fromY);
    context.lineTo(toX, toY);
    context.stroke();
    context.closePath();
 
    // サーバへメッセージ送信
    socket.emit('server send', { fx:fromX, fy:fromY, tx:toX, ty:toY, color:context.strokeStyle });
    fromX = toX;
    fromY = toY;
}

「emit」は「送信する」という意味の英単語で、サーバ・クライアントどちらでも使えます。赤色は送受信のためのカスタムイベントで、ここでは任意の文字列「server send」を記述しています。

第2パラメータには他のブラウザにお絵かきを反映させるために必要な情報をJSON形式で定義しています。fxは開始地点のX座標、fyは開始地点のY座標、txは終了地点のX座標、tyは終了地点のY座標、colorは線の色です。必要な情報があればここにどんどん追加していけばOKです。

そして、クライアントからのデータを受信できるよう、サーバ側にsocket.on()を記述します。

サーバ側

io.sockets.on('connection', function (socket) {
    socket.on('server send', function (msg) {,
        // 受信メッセージの処理
    });
});

第1パラメータのカスタムイベント名はクライアントで設定したものと一致していなければいけません。ここが一致していないとサーバで受信できません。第2パラメータはデータ受信時の関数を定義します。パラメータ(ここではmsg)には受信時のデータを定義します。

4.クライアントへの送信方法

クライアントへブロードキャストで文字列を送信するには、まず、サーバ側にio.sockets.emit()を記述します(青色部分)。

サーバ側

io.sockets.on('connection', function (socket) {
    socket.on('server send', function (msg) {
        io.sockets.emit('send user', msg);
    });
});

赤色は先程と同様、カスタムイベントで、ここでは任意の文字列「send user」を記述します。第2パラメータにはクライアントから受信したチャットデータ(msg)を設定しています。

そして、サーバからのデータを受信できるよう、クライアント側にsocket.on()を記述します。

クライアント側

// サーバからメッセージ受信
socket.on('send user', function (msg) {
    context.strokeStyle = msg.color;
    context.lineWidth = 2;
    context.beginPath();
    context.moveTo(msg.fx, msg.fy);
    context.lineTo(msg.tx, msg.ty);
    context.stroke();
    context.closePath(); 
});

受け取るクライアントでは、サーバ側のemit()の第1引数(赤色のイベント名)を必ず指定します。ここが一致していないとクライアントで受信できません。第2パラメータはデータ受信時の関数を定義します。

受信後、関数の中で座標位置や配色を変数msgから取得します。JSONデータの取得方法は、例えば開始地点のX座標であれば「msg.fx」と書きます。あとはdraw()と同じ要領でお絵かきデータを表示します。

以上です。サンプルのHTML・CSS・jQueryの説明は割愛しています。

複数のページを1ページにまとめて表示するFirefoxアドオン「AutoPager」

$
0
0


複数のページを1ページにまとめて表示するFirefoxアドオン「AutoPager」を紹介します。

1.機能

このアドオンを適用すれば、複数ページにまたがるページを1ページにつなげてくれます。スクリーンショットはGoogleの検索結果です。

適用前
適用前

適用後
適用後

ある程度スクロールをするとページが読み込まれます。読み込むページ数は設定メニューで決めておくことができます。

2.インストール

「AutoPager」のページにアクセスして、「Add to Firefox」のリンクをクリックすればダウンロード画面が表示されます。

「AutoPager」のページ

3.設定

アドオンを有効にしたあとサイトを閲覧すると、ページの上部に「このサイトでこの設定を使いますか?」というバーが表示されます。「はい」をクリックすればスクロールによってページがどんどん表示されるようになります。

バー

オプションをクリックすれば次のようなメニューが表示されます。

メニュー

右クリックのコンテキストメニューには次のように表示されます。

コンテキスト

ツールバーにも次のように表示されます。

ツールバー

メニューの表示・非表示はアドオンマネージャの「設定」をクリック。

アドオンマネージャ

ここで制御できます。

ツールバー

4.その他

Google検索で正常に動作しないケースもあるようです。

Movable Typeでログイン後の管理画面を変更する「ScreenChangerプラグイン」

$
0
0


Movable Typeのログイン後の管理画面を変更する「ScreenChangerプラグイン」を公開します。

1.基本

Movable Typeでは、ログイン後の管理画面はユーザーダッシュボードになります(下)。

ダッシュボード

デフォルトでダッシュボードを表示させるのは、ログインしたユーザーによっては複数ブログの権限をもっている場合があり、どのブログ(またはウェブサイト)の管理画面を表示させればよいか一意に決められないのが理由のひとつと思われます。

また、「一律、ブログ記事一覧画面を出せばいいのでは?」と思われるかもしれませんが、デザイナーやコメント投稿者など、記事編集権限をもたないユーザーもいるので、単純に決めることができません。

2.機能

ということで、本プラグインを適用すればログイン後の画面をブログ記事一覧画面に変更します。

具体的には次の動作になります。

  • システム管理者:システムのブログ記事一覧画面
  • その他のユーザー:ユーザーがログイン可能な最若番ブログIDのブログのブログ記事一覧画面※
    ※ユーザーの権限によっては既存動作通りダッシュボードを表示する場合があります

なお、ユーザーダッシュボードを表示しないのはログイン直後のみで、管理画面にあるユーザーダッシュボードのリンクをクリックすれば、ユーザーダッシュボード画面に移動します。

3.価格

MT5.1版:1050円/1インストールMT(購入前に必ず動作確認してください)

4.プラグインのダウンロード・インストール

下記のリンクをクリックして、プラグインアーカイブをダウンロードします。

ScreenChanger_0_01.zip

プラグインアーカイブを展開し、中にあるScreenChangerフォルダごと、Movable Type のアプリケーションディレクトリのpluginsディレクトリにアップロードします。

システム管理画面のプラグイン設定画面で、「ScreenChanger~」が表示されればインストール完了です。

5.プラグイン開発について

本エントリーでダウンロードできるプラグインは最小限の機能のみ実装しています。表示したい管理画面を変更したい場合など、有償にて開発致します。

WordPress カスタムメニューの使い方(その1:基本)

$
0
0


WordPressのカスタムメニューの使い方について解説します。

カスタムメニュー機能で作ったメニュー
カスタムメニュー

今回はTwentyElevenテーマを使った、管理画面でのカスタムメニューの作成方法について解説します。functions.phpの設定が必要なカスタマイズなどについては別エントリーで紹介したいと思います。

WordPressのバージョンは3.3.1を使っています。

1.カスタムメニューとは

カスタムメニューとは文字通り、独自のメニューをカスタマイズする機能です。

カスタムメニューを利用すれば、固定ページ・カテゴリー・投稿・タグのリンクやカスタムリンク(管理画面上で作ったリンク)などを表示させることができます。またそれぞれのリンクを1つのメニューに混在表示させることも可能です。メニューの順序や階層表示も自由にカスタマイズ可能です。

2.メニューの作成

まず、ページに表示するカスタムメニューの元となる「メニュー」を作ります。管理画面の「外観」→「メニュー」をクリック。

管理画面

メニューの管理画面に移動するので、「メニューの名前」に任意の名称を入力して「メニューを作成」をクリック。ここで入力した名称はそのままページに表示されるわけではありません。この名称が何に使われるかは4項を先に読んでいただいた方が分かりやすいかもしれません。

メニュー

「メニューを作成」をクリックすると、このように表示が変わります。「メニューの名前」に別の名称を入力して「メニューを保存」をクリックすればメニュー名を変更できます。赤色の「メニューを削除」をクリックすれば、作成したメニューを削除します(クリックすれば確認のダイアログが表示されます)。「トップレベルのページを自動的に追加する」をチェックしておけば、最上位階層のページを作成したときに、そのページを自動的にメニューに追加します。

メニューを作成

「+」タブをクリックすれば新しいメニューを複数作成することができます。

新しいメニューを作成

ここでは次の「てすと1」「てすと2」という2つのメニューをサンプルに話を進めます。「てすと2」は使いませんが、複数のメニューがないと説明しにくい部分があるので(笑)。

サンプル

3.メニューにリンクの追加

左側に「テーマの場所」「カスタムリンク」「固定ページ」「カテゴリ」が表示されます。メニューに追加したいリンクは、これらのメニューを操作します。「投稿」「タグ」の表示については5項を参照してください。

メニュー

「テーマの場所」は、メニューにリンクを追加するものではなく、作成したメニューをどこに表示させたいかを決めるものです。プルダウンメニューには先程作成したメニュー名が選択できるようになっています。この項目は利用しているテーマによって表示が変わります。TwentyElevenテーマでは次のように「メインメニュー」がデフォルトで表示されます。

テーマの場所

このプルダウンを選択することで、これから作成するカスタムメニューの内容をナビゲーションに反映させることができます。

カスタムメニュー

「カスタムリンク」は好きなリンクを作ることができます。「URL」と「ラベル」を入力して「メニューに追加」をクリック。

カスタムリンク

このように追加されます。

カスタムリンクで追加

追加したリンクを編集するには、右側の▼マークをクリック。

追加したリンクを編集

編集画面が表示されます。赤色の「除外」をクリックすれば、メニューからこのリンクを削除できます。「キャンセル」をクリックすれば編集内容を元の状態に戻します。「タイトルの属性」にはtitle属性の値を設定します。編集した内容を保存する場合は、「メニューを保存」をクリックします。

編集画面

「固定ページ」は予め作成している固定ページのタイトルが表示されます。ここでは「サンプルページ」がある状態なので、これをメニューに追加します。チェックボックスをチェックして「メニューに追加」をクリック。

固定ページ

このように追加されます。

固定ページを追加

メニューはドラッグできるので、順番を入れ替えることができます。

順番を入れ替え

また、少し右にずらせば入れ子にすることもできます。

入れ子

「カテゴリー」はブログに登録しているカテゴリを表示します。ここではすべてのカテゴリーを選択してみます。

カテゴリー

このようになりました。カテゴリーの親子関係とは関係なく、それぞれのカテゴリーを好きな位置に移動することができます。

カテゴリーを好きな位置に移動

最後に「メニューを保存」をクリックして、作成したメニューを保存します。

4.メニューの表示

「外観」→「ウィジェット」をクリック。

管理画面

一覧にある「カスタムメニュー」を「メインサイドバー」にドラッグします。

カスタムメニュー

「タイトル」に任意のタイトル、「メニューを選択」から先程作成した「てすと1」を選択します。この操作でお分かりになったと思いますが、カスタムメニューで作成したメニューはひとつの独立したウィジェットとなるのではなく、「カスタムメニュー」ウィジェットをまずドラッグして、それから表示したいメニューを選択する操作となります。

ウィジェットの編集

これでページに表示されました。

ウェブサイト

5.オプションの表示

4項まででデフォルト状態の表示項目について解説しました。表示項目を追加するには、「外観」→「メニュー」の管理画面右上にある「表示オプション」をクリック。

表示オプション

表示オプションが表示されます。「投稿」「タグ」や詳細メニューが追加可能です。

表示オプション

「投稿」の項目です。投稿した記事をここから選択できます。

投稿

「タグ」の項目です。登録したタグをここから選択できます。

タグ"

詳細メニューを追加すると、メニューの編集画面が次のようになります。

メニューの編集画面

ここでの解説は割愛しますが、カスタム投稿タイプやカスタム分類の表示も可能です。

6.参考サイト

管理画面/外観/メニュー

WordPress カスタムメニューの使い方(その2:wp_nav_menuとregister_nav_menuによるカスタマイズ)

$
0
0


WordPressのカスタムメニューのカスタマイズ方法について解説します。

カスタムメニューを利用すれば、サイドメニューだけでなく、ナビゲーションを任意の場所に設置することもできるようになります。本エントリーでは、フッタに次のようなナビゲーションを追加してみます。

カスタムメニュー

WordPressのバージョンは3.3.1を使っています。カスタマイズにはTwentyElevenテーマを使います。また、フッタナビゲーションはヘッダナビゲーションのスタイルをそのまま流用しているので、id属性値が重複しています。予めご了承ください。

管理画面上でカスタムメニューを利用する方法は割愛していますので、「WordPress カスタムメニューの使い方(その1:基本)」を参照してください。

1.wp_nav_menuを使ってカスタムメニューを表示する

フッタにナビゲーションを表示するための準備として、footer.phpに赤色の内容を追加します。

<footer id="colophon" role="contentinfo">
  <nav id="access" role="navigation">
    <?php wp_nav_menu( array( 'menu' => 'Project Nav' ) ); ?>
  </nav>
  …後略…

メニューを表示するのはwp_nav_menu()です。パラメータに、「menu => 'Project Nav'」という内容を与えておきます。これは「Project Nav」という名前のカスタムメニューをここに表示する、という意味です。

次に管理画面で「Project Nav」という名前のカスタムメニューをつくり、リンクを追加します。

管理画面

カスタムメニューを保存すれば、冒頭のようなフッタナビゲーションが表示されます。

2.register_nav_menuを使ってカスタムメニューを選択できるようにする

1項では、メニュー画面で作成したカスタムメニューをfooter.phpに記述したwp_nav_menuの位置に直接関連づける方法を紹介しました。2項ではカスタムメニューを柔軟に選択できる方法を解説します。

1項のfooter.phpに設定したwp_nav_menu()のパラメータを、赤色のように「theme_location => 'Project Nav'」に変更します。theme_locationパラメータは、テーマ内で使用する場所を示すIDです。

<footer id="colophon" role="contentinfo">
  <nav id="access" role="navigation">
    <?php wp_nav_menu( array( 'theme_location' => 'Project Nav' ) ); ?>
  </nav>
  …後略…

次に、テーマのfunctions.phpに以下の内容を記述します。

register_nav_menu( 'Project Nav', __( 'Hoge Menu', 'twentyeleven' ) );

register_nav_menu()は第1パラメータに指定した名前(ID)に対応するtheme_locationを、メニュー画面の「テーマの位置」に表示するための関数です。第2パラメータは「テーマの位置」に表示する名称です。

この例では、さきほどwp_nav_menu()のtheme_locationパラメータで指定した「Project Nav」をregister_nav_menu()の第1パラメータに指定しています。

この設定を行うことでメニュー画面の「テーマの選択」に、次のように「Hoge Menu」が表示されるようになります。

メニュー画面

このようにしておけば、「Hoge Menu」とカスタムメニューの関連づけを管理画面上で設定できます。

register_nav_menu()のローカライズ部分、「__( 'Hoge Menu', 'twentyeleven' )」はイメージなので、「テーマの選択」にきちんと日本語を表示したい場合は適正なローカライズを行ってください。

この状態で任意の名称でカスタムメニューを作成・保存します。

カスタムメニュー

作成したカスタムメニューを、「テーマの場所」の「Hoge Menu」に関連づけます。

テーマの場所

関連づけを保存すれば、冒頭のようなフッタナビゲーションが表示されます。

3.「テーマの選択」を行っていない場合の振る舞い

2項の「テーマの選択」に表示された「Hoge Menu」にカスタムメニューを何も関連づけていない場合、表示するメニューがない状態になっていますが、実際には次のようなデフォルトメニューが表示されるようになっています。

デフォルトメニュー

仕組みは、wp_nav_menu()で用意されているfallback_cbパラメータ(表示するカスタムメニューが存在しない場合に起動する関数を定義)の設定にしたがって動作するようになっています。fallback_cbパラメータの設定を行っていない場合、WordPressのデフォルト動作でwp-includes/post-template.phpのwp_page_menu()を起動するようになっています。

wp_page_menu()ではwp_page_menu_argsフィルタを実行します。TwentyElevenテーマではこのフィルタを使って、functions.phpの以下の関数を起動するようになっています。

/**
 * Get our wp_nav_menu() fallback, wp_page_menu(), to show a home link.
 */
function twentyeleven_page_menu_args( $args ) {
	$args['show_home'] = true;
	return $args;
}
add_filter( 'wp_page_menu_args', 'twentyeleven_page_menu_args' );

上のソースコードだけでは分かりにくいのですが「show_home」にtrueを設定することで、先述のスクリーンショットのようなメニューを表示する仕組みになっています。

メニューを何も表示させたくない場合は、次の赤色部分のようにfallback_cbパラメータを追加し、起動関数を指定します。

<footer id="colophon" role="contentinfo">
  <nav id="access" role="navigation">
    <?php wp_nav_menu( array( 'theme_location' => 'Project Nav', 'fallback_cb' => 'no_menu' ) ); ?>
  </nav>
  …後略…

起動関数no_menu()は、functions.phpの最後に記述しておきます。

function no_menu(){
    echo "No menu";
}

このように設定しておけば、「テーマの場所」を選択していない場合、メニュー部分に「No menu」を表示します。

「テーマの場所」を選択していない場合

注:上のスクリーンショットの「No Menu」のスタイルは白に変更しています。

4.wp_nav_menuに設定可能なパラメータ

wp_nav_menuに設定可能なパラメータは次のとおりです。メニューにスタイルを付与したい場合にご利用ください。

パラメータ 意味初期値
$menu対応するメニュー名なし
$containerコンテナをラップする要素div
$container_classコンテナに適用するクラス名menu-{menu slug}-container
$container_idコンテナに適用するIDなし
$menu_classメニューを構成するul要素に適用するCSSクラス名。menu
$menu_idメニューを構成するul要素に適用するID。menu slug(順に増加)
$echoメニューをHTML出力する(true)か、PHPの値で返す(false)かtrue
$fallback_cbメニューが存在しない場合にコールバック関数を呼び出すwp_page_menu
$beforeリンクテキストの前のテキストなし
$afterリンクテキストの後のテキストなし
$link_beforeリンクの前のテキストなし
$link_afterリンクの後のテキストなし
$depth何階層まで表示するか。0 は全階層。0
$walkerCustom walker to useなし
$theme_locatonテーマ内で使用する場所。ユーザーが選択できるようにするには、register_nav_menu() で登録する。なし

5.参考サイト

テンプレートタグ/wp nav menu

WordPress 3.x デザイン&カスタマイズ スタイルブック

$
0
0


WordPressカスタマイズ本の紹介です。マイナビ様より献本頂きました。この場をお借りしてお礼申し上げます。

WordPress 3.x デザイン&カスタマイズ スタイルブック
エ・ビスコム・テック・ラボ
マイナビ

本書は、大規模サイト向けにWordPressを複数サイト化するためのテクニックを中心に紹介しています。具体的には、

  • ネットワーク化の設定
  • カスタム投稿タイプの設定
  • 固定ページを使ったツリー構造のサイト構築

などです。

複数サイトといえば、Movable Typeの「マルチブログ」が扱いやすいイメージがありますが、本書はWordPressで複数サイト化を行うためのネットワークの設定やカスタム投稿タイプの設定と、それらを利用したWordPressのカスタマイズについて詳しく解説されています。この本を読めば、WordPressでMTのマルチブログ並みの管理環境と、複数サイト向けのカスタマイズテクニックを習得することができるでしょう。

また、最近のウェブサイト制作に欠かせなくなってきたスマホやタブレット端末向けの最適化や、複数ユーザーによるサイト管理を意識した権限の作成などについても詳しく紹介しています。

さらにWordPressに精通していないユーザーをターゲットにした、管理画面から不要なメニューや項目を非表示にするといったTipsも紹介されています。

WordPressを中規模・大規模サイトに適用したい方はもちろん、ネットワーク化やカスタム投稿タイプ・権限の設定方法について詳しく知りたい方にも適した内容といえるでしょう。

以下、目次です。

Chapter1 ネットワークによる複数ブログの管理と構築
INTRO 複数ブログの管理と構築
1-1 ネットワークで構築するブログと基本設定
1-2 ブログの構築
1-3 ブログごとのカスタマイズ
1-4 グローバルナビゲーション
1-5 ルートページの作成
1-6 集約サイトを利用したルートページの作成
Chapter2 カスタム投稿タイプによる複数ブログの管理と構築
2-1 カスタム投稿タイプで構築するブログと基本設定
2-2 ルートページの作成
2-3 ブログの構築
2-4 アーカイブページの作成
2-5 ルートページのカスタマイズ
2-6 グローバルカテゴリー
Chapter3 ツリー構造のページの管理と構築
3-1 固定ページを利用したサイト構築
3-2 ツリー構造のサイト
3-3 ページ内のコンテンツをツリー構造で管理する
Chapter4 スマートフォン&タブレット最適化
4-1 スマートフォン&タブレットに最適化する
4-2 PC 用のサイトをそのまま表示する
4-3 iPhone 風のデザインで表示する
4-4 レスポンシブWeb デザインで表示する
4-5 スマートフォン&タブレット専用のテーマを作成する
Chapter5 ユーザーと管理画面
5-1 複数ユーザーによる管理と管理画面の表示
5-2 オリジナルのロールの作成
5-3 カスタム投稿タイプを管理する権限の作成
5-4 カスタムタクソノミーを管理する権限の作成
5-5 ネットワークにおけるユーザーの管理
Chapter6 カスタマイズ+α
6-1 サイドバーから不要なメニューを削除する
6-2 編集画面から不要な項目を削除する
6-3 編集画面に独自の入力項目を追加する
APPENDIX スタイルシートの設定
TAG & FUNCTION 機能別テンプレートタグ&関数一覧

姉妹本の「WordPress 3 サイト構築スタイルブック」もあります。

WordPress 3 サイト構築スタイルブック
エ・ビスコム・テック・ラボ
毎日コミュニケーションズ

Movable Typeでパンくずリストを作る

$
0
0


Movable Typeでパンくずリストを作る方法です。当ブログでオーソドックなパンくずリストの作り方の記事がまだなかったので、本エントリーでまとめることにします。

1.カテゴリアーカイブページにパンくずリストを表示

カテゴリアーカイブページに次のようなパンくずリストを表示します。

カテゴリアーカイブページのパンくずリスト

スクリーンショットのように表示するには、カテゴリアーカイブページ用のテンプレート(「カテゴリ別ブログ記事リスト」テンプレートなど)に以下のサブテンプレートをはりつけます。

<div class="breadcrumb">
  <a href="<$mt:BlogURL$>">TOP</a> &raquo;
<mt:ParentCategories glue=" &raquo; ">
  <a href="<$mt:BlogURL$><$mt:CategoryArchiveLink$>/"><$mt:CategoryLabel$></a>
</mt:ParentCategories>
</div>

「TOP »」はサブテンプレートに直接記述しています。

カテゴリはMTParentCategoriesタグを使って、親カテゴリから現在のカテゴリまでを順番に表示します。カテゴリページへのリンクはMTCategoryArchiveLinkタグを利用します。

MTParentCategoriesタグにglueモディファイを利用すれば、カテゴリを並べて表示する際の区切り文字をいれてくれます。ここでは区切り文字に「»」の実体参照である「&raquo;」を設定しています。

現在のカテゴリにカテゴリページへのリンクを設定したくない場合は、MTParentCategoriesタグで処理しているカテゴリとそのページのカテゴリを比較して、等しい場合のみMTCategoryArchiveLinkタグを適用しないようにします。

<div class="breadcrumb">
<$mt:CategoryID setvar="cat_id"$>
  <a href="<$mt:BlogURL$>">TOP</a> &raquo;
<mt:ParentCategories glue=" &raquo; ">
  <$mt:CategoryID setvar="current_cat_id"$>
  <mt:if name="current_cat_id" eq="$cat_id">
    <$mt:CategoryLabel$>
  <mt:else>
    <a href="<$mt:BlogURL$><$mt:CategoryArchiveLink$>/">
<$mt:CategoryLabel$></a>
  </mt:if>
</mt:ParentCategories>
</div>

これで末端のカテゴリにリンクが表示されなくなります。

カテゴリアーカイブページのパンくずリスト

2.ブログ記事ページにパンくずリストを表示

ブログ記事ページに次のようなパンくずリストを表示します。

カテゴリに属しているブログ記事のパンくずリスト

スクリーンショットのように表示するには、ブログ記事ページ用のテンプレート(「ブログ記事」テンプレートなど)に以下のサブテンプレートをはりつけます。

<div class="breadcrumb">
  <a href="<$mt:BlogURL$>">TOP</a> &raquo;
<mt:ParentCategories glue=" &raquo; ">
  <a href="<$mt:BlogURL$><$mt:CategoryArchiveLink$>/"><$mt:CategoryLabel$></a>
</mt:ParentCategories>
<mt:if tag="EntryCategory"> &raquo; </mt:if><$mt:EntryTitle$>
</div>

構造は1項のサブテンプレートとほぼ同じです。異なるのはカテゴリを表示したあとに、ブログ記事を表示するようにしています(赤色部分)。

カテゴリに属さないブログ記事があることも考慮し、MTIfタグでMTEntryCategoryタグを判定し、カテゴリが設定されている場合のみ、ブログ記事タイトルの直前に「&raquo;」を表示するようにしています。

この制御を行うことで、カテゴリに属していないブログ記事のパンくずリストは次のように表示します。

カテゴリに属していないブログ記事のパンくずリスト

3.ウェブページのパンくずリスト

ウェブページのパンくずリストについては「Movable Typeのパンくずリストでフォルダの代わりにウェブページを表示する」を参照してください。

HTMLの整形やJavaScriptの難読化を解除する「jsbeautifier.org」

$
0
0


HTMLの整形やJavaScriptの難読化を解除する「jsbeautifier.org」を紹介します。

JavaScriptの難読化解除には「JsDecoder」を利用していましたが、いつのまにか「Not Found」になってしまってました。

JsDecoder
Online JavaScript beautifier

ということで代わりのサイトを探したところ、「Online JavaScript beautifier」を見つけました。

Online JavaScript beautifier
Online JavaScript beautifier

使い方は簡単で、整形したいコードをはりつけて、ページ上にある「Beautify JavaScript or HTML」をクリックするだけです。サンプルコードが表示されているのでクリックすれば整形されることが分かります。

jQueryで試してみます。下は整形前のものです。

jQuery(整形前)

いい感じに整形されました。

jQuery(整形後)

次にHTMLで試してみます。下は整形前のものです。

HTML(整形前)

こちらも整形されました。

HTML(整形後)

オプションも用意されています。一番上のプルダウンはインデントのスタイル、2つめはJavaScriptのカーリーブレースの改行指定、3つめはscript要素・style要素内のインデント指定みたいです。「Preserve empty lines?」は空行の除去です。

オプション

各種ブラウザの拡張としても利用されているようです。

ブラウザの拡張

CSSの整形・圧縮が一瞬で行えるツール「csCSSc」

$
0
0


CSSの整形・圧縮が一瞬で行えるオンラインツール「csCSSc(Client-side CSS (De)Compressor)」を紹介します。圧縮(難読化)解除も行えます。

csCSSc

オンラインでCSSの整形・圧縮が行えるツールは色々出回ってます(4項参照)が、csCSScは動作が圧倒的に軽いです。

使い方をざっと説明します。

1.圧縮

ページ一番上にある「Original valid CSS-code」のテキストエリアにオリジナルのCSSをペーストして「Compress」をクリックすれば、一瞬で圧縮されます。

オプションの意味は次のとおりです。

  • include comments:コメントを含む
  • single line:1行化する
  • sort styles:アルファベット順にソートする

何もチェックしない場合は次のようにセレクタごとに改行して圧縮します。

「single line」をチェックして圧縮すれば、1行にまとめられます。

「sort styles」をチェックして圧縮すれば、セレクタの表示順序が整理できます。

2.整形

「Compressed CSS-code」に整形前のCSSをペーストして「Decompress」をクリックすれば整形されます。

このようになります。

3.圧縮・整形を組み合わせる

圧縮・整形の動作を組み合わせることで、元のCSSをアルファベット順に並べ替えるといったこともできます。

元のCSSを「Original valid CSS-code」にペーストし「sort styles」をチェックして実行します。

圧縮されたCSSに対して「Decompress」をクリックします。

これでアルファベット順に整形されました。

「Compressed CSS-code」にある程度整形されたCSSやコメントつきのCSSをペーストして「Decompress」を実行しても期待する結果にならないようなので、ご注意ください。

4.他のCSS整形ツール

調べたオンラインツールのリンクを掲載しておきます。csCSScでは機能が足りないという方は以下のツールをどうぞ。

ProCSSor(一番メジャーっぽい)

Code Beautifier


CSS Compressor
(Advanced modeのリンク先に機能拡張版あり)

styleneat

Clean CSS

Viewing all 219 articles
Browse latest View live




Latest Images