Cicindelaで遊ぼうと思ったところ普通のレンタルサーバでは難しいようだったので、さくらVPSを借りることにしました(現時点でまだ試用期間中ですが)。
仮想サーバですがroot権限ももらえて好き勝手できるすごいやつです。月額980円。

自由度が高い半面、セキュリティなども自分で考えないといけないので初心者には大変です。とりあえずやったことをメモ。

まず下記を参考にして初期設定。
http://blog.myfinder.jp/2010/09/vpsssh.html

あとはここを参考にしてApache、PHP、MySQLをさくさくインストール。
http://blog.mobf.net/archives/151

バーチャルドメインの設定も。
http://blog.mobf.net/archives/157

nackle.comはcoreserverで運用していますが、一部のサブドメインだけさくらVPSで運用することにします。つまり特定のサブドメインのみさくらVPSのIPを指すようにすればOKなので、僕の場合は既存のDNS設定に「a hoge xxx.xxx.xxx.xxx」だけ追加すればOK。

SSHのポートも変更。デフォルト(22番)のままだと危険らしい。
http://akabeko.sakura.ne.jp/blog/2010/09/さくらのvps-を使いはじめる-2/

さらにiptablesを設定して、開放するポートを限定。
http://akabeko.sakura.ne.jp/blog/2010/09/さくらのvps-を使いはじめる-3/

とりあえず今のところそんな感じ。

巷で最近話題のZen-Coding。
Dreamweaverでも使えます。

Downloads – zen-coding – Project Hosting on Google Code
http://code.google.com/p/zen-coding/downloads/list

「Zen Coding for Dreamweaver」というリンクがあるので、一番新しいバージョンをダウンロード(現時点で最新はv0.6)。
ダウンロード後、解凍したらxmpファイル(拡張機能ファイル)が出てくるので、これをExtension Managerで開いてインストールしてください。Dreamweaverを再起動したら、普通にコードエディタでZen-Codingが使用できます。

なお、展開コマンドは「Ctrl+,(コンマ)」ですのでご注意ください。

ループまとめ

ワードプレスでのサイト構築はループに始まりループに終わると言っても過言ではありません。
というわけでループについて簡単にまとめておきます。

基本ループ

<?php if(have_posts()): while(have_posts()): the_post(); ?>
//ほげほげ
<?php endwhile; endif; ?>

普通のブログであれば、大抵はこれだけで済みます。
現在のページ(トップページ、カテゴリページなど)に適合した投稿内容を表示してくれます。

have_posts()
表示すべき投稿記事があれば「true」を返し、なければ「false」を返します。表示対象となる投稿記事はページに依存します。
the_post()
投稿情報を読み込み、その情報をカスタムタグ(the_contentなど)で使えるように準備します。

基本ループをカスタマイズ

基本ループで呼び出される投稿は、デフォルトではそのページ(トップページ、カテゴリページなど)に依存しますが、基本ループの直前にこのコードを記述すると投稿を呼び出す条件が変更されます。

<?php query_posts($query_string.'&posts_per_page=5&cat=1,3'); ?>

上記だと、カテゴリID1または3に属する投稿が5件毎に呼び出されます。

query_posts()
基本ループで呼び出す投稿の条件(デフォルトはページに依存)を指定する。
$query_string
主に現在の表示ページ数などを表わす文字列。ページナビゲーションを利用する場合などに必須なので、特に問題が無ければ最初から付けておくとよいです。

ただし、この方法は条件分岐タグ(is_home()、is_category()など)の動作に影響を与えるので注意が必要です。

マルチループ

自由に投稿一覧を表示させたい場合は以下のループを使用します。

<?php $myposts = get_posts('numberposts=5&category=1'); ?>
<?php foreach($myposts as $post): ?>
<?php setup_postdata($post); ?>
//ほげほげ
<?php endforeach; ?>
get_posts()
ページに関係なく任意の投稿記事を読み込み、その情報を使えるように準備する。対象となる投稿記事は引数で指定する。
setup_postdata()
投稿データをカスタムタグ(the_contentなど)経由で呼び出せるように準備する。基本ループの「the_post()」に相当。あるいはこれは使用せず、「<?php echo $post->ID; ?>」という風に投稿データを直接呼び出してもよいです。

細かい挙動については、また個別にエントリを書こうと思います。

カテゴリページにて、そのカテゴリの記事一覧を表示する方法。
特殊な状況下ではこのような方法も有効かと思います。

ポイントは「get_query_var(‘cat’)」で現在のカテゴリIDを取得できるところでしょうか。あまり知られていないような気がしますが、僕が知らなかっただけかもしれません。

<ul>
<?php
if (have_posts()) :
$cat_id = get_query_var('cat');
$query = 'cat=' . $cat_id. '&showposts=99';
query_posts($query) ;
while (have_posts()) : the_post();
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
</ul>

WordPressは携帯電話からメールで更新することもできます。

Ktai Entry(メール投稿プラグイン)
http://wppluginsj.sourceforge.jp/ktai_entry/

  1. GMailのアカウントを新規取得。このメールアドレスに送信すると記事が投稿されるようにします(GMail以外のメールアドレスでもよいのですが、GMailのメールサーバは絵文字を処理してくれるので便利です)。
  2. GMail>設定>メール転送と POP/IMAP 設定の「POP ダウンロード」で「今後受信するメールでPOPを有効にする」を選択します。
  3. プラグインのファイル一式をwp-content/plugins/にアップする。
  4. WordPress管理画面>プラグインで「Ktai Entry」を有効にする。
  5. WordPress管理画面>設定>メール投稿で「投稿受付メールアドレス」にGMailのメールアドレスを入力する。
  6. WordPress管理画面>設定>投稿設定で「メールでの投稿」にGMailの情報を入力する(メールサーバは「ssl://pop.gmail.com」、ポートは「995」)。
  7. 上記設定欄の下にある「メール投稿用カテゴリーの初期設定」も選択しておく。
  8. WordPress管理画面>ユーザで投稿用ユーザを追加する。その際、投稿する携帯電話のメールアドレスをユーザのメールアドレスとして設定しておく。
  9. cronで定期的にwp-content/plugins/ktai_entry/retrieve.php(メールをチェックするプログラム)を実行するように設定する。

以上で完了。最後のcronは設定しなくてもよいですが、その場合、投稿が反映されるタイミングが「誰かがサイトにアクセスしてからn分後」という微妙なものになります。
その他、詳細はKtai Entryの公式サイトまで。

WEBページのURLに拡張子「.html」を付けるプラグイン。

.html on PAGES
http://wordpress.org/extend/plugins/html-on-pages/

WordPressで生成されるURLを擬似的に静的なHTMLっぽい感じにしたい場合、パーマリンク設定で例えば

/%category%/%postname%.html

と書けば、投稿は静的HTML風になる。が、WEBページはこのルールが適用されず、末尾に「.html」が付加されない。上記のプラグインを使用すればWEBページにも「.html」が付く。

ただしこのプラグインはパーマリンク設定とは無関係に、単純に末尾に「.html」を付けるだけという超単機能プラグインなので、「.html」以外の拡張子にしたい場合はプラグインのソースを直接さわる必要があるので注意。当然複数の拡張子を混在させることもできない。

floatでブロック要素を並べると、普通は右(float:right)か左(float:left)かどちらかにしか揃えることが出来ません。真ん中に揃えるには、position:relativeでうまく位置調整してあげます。

■HTML

<div class="menu">
<ul>
<li>メニュー1</li>
<li>メニュー2</li>
<li>メニュー3</li>
<li>メニュー4</li>
<li>メニュー5</li>
</ul>
</div>

■CSS

div.menu {
position:relative;
overflow:hidden;
}
div.menu ul {
position:relative;
left:50%;
float:left;
}
div.menu li {
position:relative;
left:-50%;
float:left;
}

多くのサーバでは、URLのサブドメイン「www」はあってもなくても表示結果は同じだったりします(例:「http://example.com」と「http://www.example.com」)。もちろんサーバの設定に依るのですが。

ただ、出来ればどちらかに統一してしまう方が、何かと都合が良いです。
そもそも最初からどちらか片方の記述のみを使うのが一番ですが、横着をするのであれば.htaccessファイルで301リダイレクトを指定するのも手っ取り早いです。

「wwwあり」に統一する場合

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

「wwwなし」に統一する場合

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example\.com
RewriteRule ^(.*)$ http://exsample.com/$1 [R=301,L]

「www」ありなしどちらで統一するかは、お好みでお選びください。
技術的にはどちらでも差し支えないので、ブランドサイトの場合はwwwなしでブランド名を強調、企業サイトの場合はwwwありで何となく堅調な感じに、などなどケースバイケースですね。

特定カテゴリの記事一覧などを表示させる際、

<?php query_posts('cat=8'); ?>
<?php while (have_posts()) : the_post(); ?>
//ほげほげ
<?php endwhile;?>

という風にquery_posts()を使って表示させると、条件分岐タグ(is_home()、is_category()など)の動作に影響を与えてしまいます。例えば「カテゴリID3のカテゴリページ」のサイドバーで、query_posts()を使ってカテゴリID8の記事一覧を表示させると、その行以降はis_category(‘8’)に対してtrueが返ってきてしまいます。

それは困る、という場合は、

1.get_posts()を使ったマルチループを使う

<?php $myposts = get_posts('category=8'); ?>
<?php foreach($myposts as $post): ?>
<?php setup_postdata($post); ?>
//ほげほげ
<?php endforeach; ?>

あるいは、

2.新たにクエリを発行する

<?php $my_query = new WP_Query('cat=8'); ?>
<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
//ほげほげ
<?php endwhile;?>

という書き方をすれば大丈夫です。

たとえば拡張子が.htmlのファイルでPHPを使用したい場合は、.htaccessファイルで設定変更することで実現できます。ただし、サーバーに負荷がかかるのでアクセスの多いサイトではあまり勧められません。

.htaccessファイルに下記1行を追加します。

AddType application/x-httpd-php .htm .html

尚、サーバで上記の設定変更が許可されていない場合は Internal Server Error になります。たぶん。