WordPress備忘録(バージョン3.4.2対応)

WordPressを使用する際、私が行っている設定などを紹介しています。私の環境(一人で管理/自作テーマ使用/メール投稿・ユーザー登録・コメント・トラックバック・Hello Dolly・Akismet・メディアアップロード機能未使用)を基準に書いていますので、参考にする場合は適宜読み替えてください。

導入する前に

WordPressを使う上で必要だと思うもの

まず、本当にブログを導入する必要があるのかよく考えてください。周りが使っているから、流行っているから何となく――というのであれば利用をお勧めしません。私は2004年頃からWordPressに触れていますが、このツールは本体の管理が面倒です。次々行われるアップグレードについていけず古いバージョン(危険!)を使い続けている管理人を何人も見てきました。エラー(主にデータベース関係の)が出ても対応できずブログごと破棄してしまった管理人も何人も見てきました。

ブラウザからサーバに各種ファイルをアップロードしたり、ページを作成/削除できるツールは安全だと思いますか? 動的生成のブログを使うことはつまり、あなたのサイトに弱点を増やすことであることも意識してください。WordPressはセキュリティ上のトラブルも多いです。何か問題が起こった時困らないようまめにデータベースのバックアップを取る必要がありますし、新しいバージョンが出た時は必ずアップグレードしなければいけません。面倒臭がりな人はWordPressに不向きです。

ブログもウェブサイトの一種です。ブログだからといって手書きサイトと比べて特別楽に運営できるわけではありません。サイト制作の基礎であるHTMLとCSSの知識は必須です。サーバにブログツールをインストールするのですからWordPress本体を管理する知識と技術も必要です。当然サイト運営上生じた問題にも対応していかなければなりません。

と言っても、WordPressに興味を持った時が使い始めるチャンスなので、気になる方は触ってみるといいでしょう。ただ、いきなり公開するのはやめておいた方がいいです。WordPressの扱いに慣れて、使い続ける覚悟(と言うと大げさですが)ができてから公開するといいと思います。いきなり勉強するのも疲れるでしょうから、少しずつ学んでください。

ブログの設定など

主にセキュリティの強化です。と言っても劇的に変わるわけではなく、気休め程度です。

データベースのテーブル接頭辞(prefix)を変更する

デフォルトではwp-config.phpに$table_prefix = 'wp_';という設定項目がありますが、そのままだとセキュリティ的によくないのでwpの部分を変更します。パスワードのようなランダムな文字列がいいです。

他にデータベースを使うツールを設置している場合はデータベースも分けた方がいいです。

不要なフォルダとファイルを削除する

ブログをインストールしたからといってそれに備わっている全ての機能を使うとは限りません。なので、未使用の機能に関わるフォルダ及びファイルはサーバーにアップロードしないようにしています。使わないファイルを上げてセキュリティホールを作る必要はありません。私が削除しているファイルとフォルダは以下の通りです。

テーマによっては管理画面にリンクを張っているものがありますが、管理人以外が管理画面にアクセスできる状況は好ましくないので削除しましょう。管理画面へはブックマークからアクセスすることをお勧めします。

【重要】インストーラを使用した場合はwp-config.phpのパーミッションと所有者を変更する

インストーラを使うとwp-config.phpのパーミッションと所有者が変更されるのできちんと元に戻しておきましょう。変更の仕方が分からない場合は、一度wp-config.phpをローカルにダウンロードして、サーバ上のwp-config.phpを削除し、ローカルのwp-config.phpをサーバ上にアップロードすれば大丈夫です。私はパーミッションを404にしています。

変更を怠った場合、WordPress のインストーラによって wp-config.php を生成した場合、ウェブサーバーによる書き込み権限が残っています。したがって、悪意あるプラグイン/テーマを実行すると、wp-config.php に悪いコードを入れられる可能性はあります。引用元)とのことです。

wp-config.phpのセキュリティキーを設定する

セキュリティキーツール 1.1でランダムなキーが生成されるのでコピー&ペーストします。

WordPress本体へのアクセス制限

直接アクセスする必要のないフォルダ・ファイルに対してアクセス制限します。

管理画面(/wp-admin)
ブログ管理人以外が/wp-adminにアクセスできないようBasic認証を使ってアクセス制限します。【参考】「.htaccess」設定 - Just-size.networks
/wp-content及び/wp-includes
テーマなどでJavaScriptやCSSファイルを読み込んで使用している場合、全てを拒否するとページの表示がおかしくなります。よって以下のように必要なファイルは表示できるようにします。ただし、ファイルアップロード機能を使っている方はデフォルトのアップロード場所がwp-content/uploadsになっているので、場合によってはファイルの閲覧に支障が出るのでご注意ください。
Order allow,deny
Deny from all
<FilesMatch "\.(css|jpeg|jpg|png|gif|js)$">
Allow from all
</FilesMatch>

wp-config.php
<FilesMatch "^wp-config\.php$">
deny from all
</FilesMatch>

データベースエラーでフルパスを表示させないようにする

ServerSignature Off
php_flag display_errors Off
php_flag display_startup_errors Off

設定を確認する

一般設定→「メンバーシップ」「新規ユーザーのデフォルト権限」
一人で使う場合は不要ですので「誰でもユーザー登録ができるようにする」のチェックが外れているか、デフォルト権限が「購読者」になっているか確認します。
ディスカッション
私はコメント・トラックバックを使っていないので、これらが無効になっているか確認します。
ユーザー
「ビジュアルエディタを使用する」オフ、ニックネーム設定&ブログ上の表示名をニックネームにし、パスワード変更。
投稿設定
「:-) や :-P のような顔文字を画像に変換して表示する」、「不正にネスト化した XHTML を自動的に修正する」の両方をオフにします。
表示設定
テーマ側でトップページに表示されるのは最新の5件固定にしているので、月別&カテゴリー別アーカイブページで表示される件数を指定します。大体100くらい。
パーマリンク構造
/%year%/%monthnum%/%day%/%postname%
ディレクトリを削ると月別、年別のアーカイブになるところが好きなのでこういうURL設計です。post_idの場合、記事やページを削除すると欠番になる、WP本体からデータをインポート・エクスポートすると投稿IDがずれる、ナビゲーションリンクやアーカイブページで不都合が出るなど色々問題があるのでpostnameを使った方がいいです。
投稿時→抜粋
手製要約はフィードで表示される文章になるので、毎回入力しています。WP Multibyte Patch使用中に手製要約を書かなかった場合、文頭の110文字が抜粋文として出力されます。

テーマ

自作する際参考にさせていただいたもの。

テーマの作成 -- WordPress Codex 日本語版
基本。テーマを自作するなら最初に読んだ方がいいです。
wp.Vicuna -- WordPress テーマ
利用者が多い国産テーマ。シンプルで読みやすいので一時期使いたいと思っていました。
WPテーマ配布 -- der Gegenwart
ごくシンプルなテーマ。スタイルは指定されていないので自分でCSSを書く必要があります。

カスタマイズ

テーマに加えている変更など。何でもプラグインに頼るのはよくないのでテーマで解決できることはこちらを使った方がいいです。

自動で挿入されるバージョン情報などを削除する

WordPress 2.8にしてからhead要素内に無駄な要素が増えてウザい件について(der Gegenwart)参照。例えば以下のコードをfunctions.phpに書き加えると、ヘッダに自動挿入されるバージョン情報・wlwmanifest.xml・rsd へのリンクが削除されます。

remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');

勝手に挿入されるJavascriptやCSSが嫌なので<?php wp_head(); ?>自体の使用を止め、必要なものだけ個別に呼び出すようにしました。私のように<?php wp_head(); ?>を取り除く場合はプラグインが正常に動かなくなるので注意してください。

Custom Query String Reloadedを使わずに表示件数を調節する

テンプレートタグ/query posts(WordPress Codex 日本語版)参考。1ページに表示する投稿数はデフォルトだと一括指定されてしまうので、ページ種類別に表示件数を変えます。例えばメインページに5件表示させたい場合はindex.phpループの前に、

<?php query_posts(array('posts_per_page'=>5, 'paged'=>$paged)); ?>

WP-Pagenaviを使わずにページナビゲーションを表示(der Gegenwart)参照。プラグインを使わず実現できるのならその方がいいと思うので。

以下のコードをfunctions.phpに貼りつけてページナビゲーションを表示させたいところに<?php page_navigation(); ?>を挿入します。

function page_navigation() {
    global $wp_rewrite;
    global $wp_query;
    global $paged;
    $paginate_base = get_pagenum_link(1);
    if(($wp_query->max_num_pages) > 1):
            if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
                    $paginate_format = '';
                    $paginate_base = add_query_arg('paged', '%#%');
            } else {
                    $paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
                    user_trailingslashit('page/%#%/', 'paged');;
                    $paginate_base .= '%_%';
            }
            $result = paginate_links( array(
                    'base' => $paginate_base,
                    'format' => $paginate_format,
                    'total' => $wp_query->max_num_pages,
                    'mid_size' => 3,
                    'current' => ($paged ? $paged : 1),
            ));
            echo '<p class="local-navigation">'."\n".$result."</p>\n";
    endif;
}

テンプレートタグ/previous post link(WordPress Codex 日本語版)参照。single.phpで使用。デフォルトでは時系列順の前後リンクになるところを、同一カテゴリー内で移動できるようにします。複数カテゴリーを選択した場合はカテゴリーIDが小さいものが優先されます。多分。

<p class="local-navigation">
<?php previous_post_link('&laquo; %link', '%title', 'true') ?>
<?php the_category(',') ?>
<?php next_post_link('%link &raquo;', '%title', 'true') ?>
</p>

http://www.rusica.net/meta_link.txtより。

以下のコードをfunctions.phpに書き加え、header.php<?php meta_link(); ?> を挿入します。

function meta_link(){
    if(is_single()) {
        global $wpdb, $wp_query;
        $post = $wp_query->post;

        $prev_post = get_previous_post('true','');
        if($prev_post) {
            $prev_title = strip_tags(str_replace('"', '', $prev_post->post_title));
            echo '<link rel="prev" href="' . get_permalink($prev_post->ID) . '" title="' . $prev_title. '" />' . "n";
        }

        $next_post = get_next_post('true','');
        if($next_post) {
            $next_title = strip_tags(str_replace('"', '', $next_post->post_title));
            echo '<link rel="next" href="' . get_permalink($next_post->ID) . '" title="' . $next_title. '" />' . "n";
        }
    }
}

こんなことをしなくても、head 内に前後の投稿への関連リンク要素(link rel="prev"/"next")を出力する新規関数 (get_adjacent_post_rel_link()/enおよびadjacent_post_rel_link()/en)を追加引用元)があるらしいのですが、よく分かりません。

パンくずリスト

使っていませんが、一応。

<p class="topicPath"><a href="<?php bloginfo('home'); ?>"><?php bloginfo('name'); ?> index</a> > <?php the_category(' &gt; ', 'multiple'); ?> > <strong><?php the_title(); ?></strong></p>

他にはWordpressでプラグインなしの一番簡単なパンくず表示方法(Re:very)というやり方もあります。

各種自動整形を無効にする

WP clean excerptというプラグインを作りました。カスタマイズの項目で各種自動整形無効化のやり方も載せています。

特定のカテゴリーのRSS配信を除外する

Excluding Posts from Your Wordpress Feed ?(Jangro.com)より。例えばカテゴリーIDが「5」のものを除外したい場合は以下の通り。

function exclude_rss($query)
    {
    if ($query->is_feed)
        {
        $query->set('cat','-5');
        }
    return $query;
    }
add_filter('pre_get_posts','exclude_rss');

複数カテゴリーを指定したい場合は$query->set('cat','-5,-10,-15');とします。

自動下書き・自動保存・クイック投稿を無効化する

wp-congig.phpに以下のコードを追加すれば自動下書き・自動保存を停止できます。

// ★☆★☆★ リビジョン停止 ★☆★☆★
define('WP_POST_REVISIONS', false);

// ★☆★☆★ 自動保存停止 ★☆★☆★
function disable_autosave()
    {
    wp_deregister_script('autosave');
    }

また、WordPress 3.4.2の時点でログインすると勝手にpost idを消費します(クイック投稿が原因。非表示にしてもやはりpost idを消費する…)。wp-congig.phpのrequire_once(ABSPATH . 'wp-settings.php');の後に以下のコードを追加すると、「クイック投稿」そのものを無効にできます。

// ★☆★☆★ クイック設定を無効化 ★☆★☆★
function disable_quick_press()
    {
    remove_meta_box('dashboard_quick_press', 'dashboard', 'side');
    }
    add_action('wp_dashboard_setup', 'disable_quick_press');
参考

プラグイン

入れるものは必要最小限にしましょう。

WP Multibyte Patch
インストール時に初めから入っているプラグイン。
WP No Category Base
カテゴリーアーカイブURIの「category」部分を削除します(例: http://az-store.nrym.org/note/category/web → http://az-store.nrym.org/note/web )。
WP Super Cache
ページをキャッシュし表示を早くします。要PHP5。ソースに出力されるコメントは、/wp-super-cache/wp-cache-phase2.phpの\n<!-- Dynamic page generated in $duration seconds. -->\n\n<!-- Page not cached by WP Super Cache. Could not get mutex lock. -->\n<!-- Cached page generated by WP-Super-Cache on " . gmdate('Y-m-d H:i:s', (time() + ( $wp_cache_gmt_offset * 3600))) . " -->\nの部分を削除すれば表示されなくなります。
【転載】WP-HnConvert
見出しレベルを調整します。うちのブログは記事一覧(h1はブログ名)と個別記事(h1は記事名)で見出しレベルが違うので必須。プラグイン有効後、テーマの<?php the_content(); ?><?php the_hn_converted_content(1); ?>というふうに書き換えます。正の引数であれば見出しレベルに足され、不の引数であれば引かれます。

バックアップ(phpMyAdmin)

定期的にバックアップを取ることをお勧めします。特に新しいプラグインをインストールする時やWordPress本体のアップグレードを行う時は必ずバックアップを取るようにしましょう。詳しくはデータベースのバックアップ - WordPress Codex 日本語版en)を参考にしてください。

  1. 左側(メニューフレーム)のデータベース名をクリック。
  2. ページ下部の「すべてチェックする」をクリックし、「テーブルを最適化する」。
  3. 最適化し終わったらページ上部の「エクスポート」をクリックする。
  4. バックアップを取りたいテーブルを選択する。
  5. 「SQL」ラジオボタンにチェックを入れる(デフォルト)。
  6. 【ファイルに保存する】外枠の「ファイルに保存する」をチェック。「圧縮」はなしでいい。
  7. 「実行する」を選択する。

アップグレード

WordPress のアップグレード(WordPress Codex 日本語版)を参考にしつつ、私のアップグレード手順を書きます。自動アップグレード機能は使っていません。メンテナンスの時は503エラーを返すのがいいらしいのですが、面倒なのでしていません。

  1. データベースのバックアップを取る。
  2. サーバ上のWordPressファイルのバックアップを取る(特に/wp-config.php、/.htaccess、/index.php、/wp-content/plugins、/wp-content/themes)。
  3. 「メンテナンス中」と書いたindex.phpをアップロードする。
  4. プラグインを全て無効にする。
  5. テーマをデフォルトのものに戻す。
  6. /wp-config.php、/.htaccess、/index.php、/wp-content/plugins、/wp-content/themes以外のフォルダ・ファイルを削除する。
  7. 新しいバージョンのWordPressをアップロードする。
  8. 管理画面にアクセスする。
  9. プラグインを全て有効にする。
  10. テーマをいつも使っているものに戻す。
  11. WordPress用index.phpをアップロードする。
  12. ブログの設定を確認し、いらないファイルをアップロードしていないか、アクセス制限がきちんとできているか調べる。

【自分用】表示確認

参考書籍・リンク

Webにも有益な情報はたくさんありますが、やはり書籍が手許にあると心強いです。 ここでは私が参考にした書籍・webページを紹介しています。

WordPress 3 サイト構築スタイルブック(エ・ビスコム・テック・ラボ) WordPress レッスンブック 3.x対応(エビスコム) PHPによるWordPressカスタマイズブック―3.x対応(ソシム)

リンク

SAKATORI Kihiro www@nrym.org
Published: 2008-09-12 Last modified: 2012-09-19