カテゴリー別アーカイブ: WordPress

[WordPress] シェル + cron でデータベースをバックアップする

ロリポップのレンタルサーバを使って WordPress を運用している場合の例です。
以下のスクリプトを backup.sh などのファイル名で保存し、FTP ソフトでサーバにアップロードします。
レンタルサーバが提供している cron 機能でスクリプトを定期的に実行するようにします。(私は毎日1回実行させています。)


#!/bin/sh

# Mysqlユーザ名
mysql_user=xxxxxxxx

# Mysqlユーザパスワード
mysql_pw=xxxxxxxx

# ホスト名
host_name=xxxxxxxx

# バックアップ先
save_dir=~/web/xxxxxxxx/backup/

# バックアップファイル名
bak=`date +%Y_%m_%d`

# バックアップするDB
mysql_db_name=xxxxxxxx

# バックアップファイルを残す数
max_save_count=3

mysqldump --opt -u $mysql_user --password=$mysql_pw -h $host_name $mysql_db_name > $save_dir$bak.sql
chmod 644 $save_dir$bak.sql

zip $save_dir$bak.sql.zip $save_dir$bak.sql

rm -rf $save_dir$bak.sql

file_count=`ls -F1 $save_dir | grep -v / | wc -l`
if [ $file_count -gt $max_save_count ] ; then
rm -rf $save_dir`ls -F1tr $save_dir | grep -v / | head -n 1`
fi

私の場合は、バックアップ先を WordPress インストールディレクトリ内にすることで、ファイルのバックアップ時に一緒にデータベースのバックアップもダウンロードしています。

WordPressのバックアップと復元の手順書

バックアップと復元の手順書です。
(※レンタルサーバにロリポップを使った環境でテストをした方法を記載しています。)

<バックアップの方針>

  • 毎月1回と、WP 本体・プラグイン・テーマ等のバージョンアップ前にバックアップをとる。
  • バックアップは、過去3世代分をデスクトップとオンラインストレージに保管する。(長期スパンで過去のバックアップもいくつかとっておく。)
  • バックアップ後、テスト環境で復元テスト。

 

<バックアップと復元>

  • WordPress のバックアップ
    1. サイト全体(ファイル)のバックアップ
    2. データベース(投稿、コメント、リンク、サイト情報など)のバックアップ
    3. 復元テスト
    4. リビジョンを削除して DB を軽くする
  • WordPress の復元

※私の個人的な環境に基づいた手順書です。参考程度にしてください。

 

WordPress のバックアップ

1. サイト全体(ファイル)のバックアップ

FileZilla などの FTP ソフトで WP ディレクトリ全体をダウンロードします。
ダウンロードしたファイルを zip 形式で圧縮します。
圧縮した zip ファイルをデスクトップのバックアップ用ドライブに移動し、オンラインストレージ(google ドライブ)にも保存します。(3世代分のみ保管)

2. データベース(投稿、コメント、リンク、サイト情報など)のバックアップ

シェル + cron で、毎日 WP インストールディレクトリ内にデータベースのバックアップをとります。(3世代分のみ保管)
バックアップ場所は以下のディレクトリとします。

WPインストールディレクトリ/wp-content/cron-db-backup/

「シェル + cron」の設定ができていれば、常に新しいデータベースのバックアップがサーバ上保存されている状態となるため、「1. サイト全体(ファイル)のバックアップ」を行えば、データベースのバックアップも一緒にローカルやオンラインストレージにバックアップされることになります。
→ cron でバックアップするサンプルスクリプトはこちら

3. 復元テスト

テスト環境(別ドメイン)でバックアップファイルから復元ができるかテストします。
※予め作成してある、テスト用データベース(xxxx4test)、テスト用ドメイン(xxxx4test)、レンタルサーバ上のテスト用ディレクトリ(xxxx4test)でテストします。

WordPress Codex で手順を確認しながら行います。

<1>レンタルサーバ上のテスト用ディレクトリ(xxxx4test)にバックアップファイルをアップロードします。

<2>wp-config.php を修正します。
→ データベース名を修正。
→ define( ‘DOMAIN_CURRENT_SITE’, ‘xxxx4test.example.com’ );のように修正。

<3>テスト用データベース(xxxx4test)に、バックアップしたデータベースのsqlファイルをインポートします。

<4>データベース内のドメインを置換する。
<マルチサイトではない場合>
・(マルチドメインではない場合は)全データを安全に変更するため、「Database Search and Replace Script in PHP」を使う。使い方↓

  1. ダウロードファイルを解凍し、フォルダ(Search-Replace-DB-master)ごとテスト環境のインストールディレクトリ(wp-config.php があるディレクトリ)にアップロードする。
  2. ブラウザで「xxxx4test.example.com/Search-Replace-DB-master/」アクセスする。
  3. replace に本番ドメイン、with にテスト用ドメインを入力。database の name に間違いがないか確認し、all tables にチェックを入れて、live run をクリック。
  4. すぐに「Search-Replace-DB-master」フォルダを削除する。

<マルチサイトの場合>
「Database Search and Replace Script in PHP」を使わないで WordPress Codex(WordPress マルチサイトの移動)を参照してドメインの置換を行います。

<5>テスト用ドメイン(xxxx4test.example.com)にアクセスし、表示されるか確認します。

<6>復元テストが成功したら、テスト用データベース内の全テーブルを削除し、テスト用ディレクトリを空にします。

4. リビジョンを削除して DB を軽くする

プラグイン「Better Delete Revision」を使用し、次回バックアップのためにリビジョンを削除してDBを軽くしておきましょう。

WordPress の復元

1. データベースのインポート

バックアップしたサイト全体のデータの中にデータベースのバックアップが含まれています。
データベースのバックアップは以下のディレクトリにあります。

WPインストールディレクトリ/wp-content/cron-db-backup/

レンタルサーバの phpMyAdmin にアクセスし、データベースをインポートします。

2. バックアップのサイト全体ファイルをアップロード

FileZilla などの FTP ソフトでバックアップしたサイト全体をアップロードします。

[WordPress] テーマ編集画面で403(FORBIDDEN)

WordPressのテーマ編集画面でちょこちょこっといじって「ファイルを更新」ボタンを押すと403エラー(FORBIDDEN)。アク禁です。

えーーーーー!!

調べてみると使っているレンタルサーバーの問題でした(ロリポップ!)。

最近ロリポップ!に搭載された「WAF(ウェブアプリケーションファイアウォール)」機能!
不正アクセスによるサイトの改ざんや情報漏洩を防ぐ機能だそうです。 ロリポップ!では全プランでWAFを標準装備。

以前からあるドメイン(サブドメイン)では設定が無効になっているのですが、新規でサブドメインを作成するとWAFがデフォルトで有効になっているようです。これが問題だったか・・・。

設定場所は、
管理画面>WEBツール>WAF設定
です。
ドメイン(サブドメイン)毎に有効・無効の設定が可能です。

設定を「無効」にして・・・テーマ編集を試すと・・・

ええええ!まだエラー(403)出る!

なんでやねん!

あ・・・

「 設定変更後、反映に5~10分ほど時間を要します。」

焦った^^;

その後、無事エラーが出なくなる。

サイトの構築・修正がひと通り終わったらWAFを有効にしておけばいいのかな。

WordPressループの最大ループ数を変更したい

メインページやアーカイブページなどで投稿や固定ページを出力しますが、この出力はテンプレート内の「WordPressループ」で行われている。

WordPressループとはよくあるこんな感じのやつです。↓

<?php if(have_posts()): while(have_posts()): the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php the_content(); ?>
<?php endwhile; endif; ?>

このループの数を増やしたいけど、ちょっと調べても関数に渡す引数とかないしな~と思ってたら、このループ数はダッシュボードから設定できるみたい。(管理者が定数として設定するんですね。DBに登録される。)

ダッシュボード>設定>表示設定 の 「1ページに表示する最大投稿数」

で設定できます。

普通に使っていれば気付くのに、調子乗って自分でテーマの編集をしているとハマってしまったダサいパターンですw

 

WordPress のカスタムフィールドが消えた!?

WordPressで投稿をしようとしたら、あれ?いつもと違う・・・

カスタムフィールドがない!

カスタムフィールドが消えた!?

なんで?

誰も使わねーからバージョンアップでカスタムフィールドの機能が削除されたのか?とか無さそうな妄想をしながら色々調べてたら・・・画面右上の「表示オプション」というやつの仕業でした。

カスタムフィールドが消えた!?

いつの間にチェックが外れていたんだ?触った覚えもないのに。カスタムフィールドが表示されない!消えた!無くなった!という人は投稿画面で右上に注目!

レストランが作るこだわりの逸品から会議弁当やピザチェーンまで、出前・宅配の総合グルメサイト『ぐるなびデリバリー』

WordPressアップデートでデフォルトテーマの Twenty Ten が上書きされてしまった

WordPress 3.0 ~ のデフォルトテーマである「Twenty Ten」のテーマファイルを少しカスタマイズして使用していた。(style.cssやsingle.phpなど)

日本語版WordPressが 3.1.2 → 3.1.3 にバージョンアップできるようになったのでやった。

無事にアップデート完了。

と思ったら何だか表示が変わったような。。。

上書きされてる!!!

デフォルトテーマの「Twenty Ten」のテーマファイルが上書きされてる!

がーん。

しかーし、たまたま3日前にサーバ上の全ファイルバックアップしていた。

上書きされたテーマファイルとバックアップしていたテーマファイルのバージョンを調べてみるとどちらも「1.2」。つまりテーマファイルはバージョンアップされていなかったみたい。
ということでバックアップしていたカスタマイズ済みのテーマファイルをごっそりサーバにアップした。
(テーマファイル群のstyle.cssの上部にバージョンが記載されている)

表示は元に戻って一件落着。

しかし、今後WordPress本体のアップデートの度にこんな作業を繰り返してたら手間がかかってしょうがない。何か方法はないのだろうk・・・あるらしい!

「子テーマ」というものがあるらしい。
「子テーマ」は、別のテーマ(親テーマ)の機能を継承し、その機能にさらに機能を追加したりその機能を調整したりすることのできるテーマ。
親テーマがアップデートされても子テーマの変更は保持される。
↓詳しい解説や使い方はこちら
WordPress Codex 日本語版「子テーマ」

早速やってみます!

Really Simple CAPTCHA

コメントスパムやメールスパムの対策ができる。

元々コンタクフォームプラグインである「Contact Form 7」の為に作られた機能が独立したプラグイン。

私は、Contact Form 7 に画像認証機能を付けるために
このプラグインをインストールしました。

Contact Form 7

WordPressにコンタクトフォームをつけたいならコレ。

・柔軟にコンタクトフォームやメールフォームをデザインすることができる。
・複数のコンタクトフォームを管理することができる。

また、
・AJAXを使った送信
・CAPTCHAの実装
・Askimetスパムフィルタリングに対応
・ファイルアップロード
などをサポートしている。

カテゴリページを記事リスト表示にする

カテゴリーページを記事リスト表示にするには
テーマ編集>カテゴリーテンプレート(category.php)
に以下を挿入する。


<ul> <?php if ($posts) : foreach ($posts as $post) : start_wp(); ?> <li id="catpost-<?php the_ID(); ?>"> <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"> <?php the_title(); ?></a></li> <?php endforeach; else: ?> </ul> <p><?php _e('Sorry, no posts matched your criteria.'); ?></p> <?php endif; ?>

※挿入するたけじゃなく、不要になる部分を削除すること。

<a>タグにtarget属性を設定したり、cssで表示をカスタマイズすると良い!

[カスタム例]
投稿日時を表示するには、


<?php the_day('[Y/m/d]'); ?>

を挿入する。