やっぱりWebが好き

WordPressのちょっとしたテクニック備忘録

ここ最近、Writing Modeの構築をはじめとするプライベートワークやら、「自分で全部作っちゃえ」的な小規模コーポレートサイトのお仕事などがいくつかあって、久しぶりにWordPressを本格的に弄っています。いい機会なので、これまでに蓄積したWordPressのちょっとしたテクニックをまとめておくことにします。Writing Modeでは初めて、そしてHiGash.Netのエントリーを振り 返ってみてもお久しぶりのWordPressネタ。

WordPressを使いはじめて、もう5年以上。この間、いろいろWordPressサイトを作ってきて、毎回必ず使う定番テクニックもあれば、いまだに「お。こんなタグあったんだ?」みたいな思わぬ発見に出くわすことも珍しくありません。
今日はこれまでに蓄積してきたWordPressのちょっとしたテクニックを、自分のための備忘録を兼ねてまとめてご紹介。

wp-contentフォルダはWordPress本体とは切り離す

デフォルトでは、wordpressフォルダ内にwp-contentフォルダがありますが、wp-contentはwordpressフォルダとは切り離して運用したほうが管理が楽な気がします。
ちなみにwordpressもwp-contentもフォルダ名を変えることができ、wp-config.phpでこれらの名前やパスを指定することができます。

僕はだいたいいつも下記のようにwp-config.phpでURLを設定しています。

/**
 * URL設定
 */
global $WpUrl;
$WpUrl = 'http://writing-mode.com'; // URL
define('WP_HOME', $WpUrl); // ブログURL
define('WP_SITEURL', $WpUrl . '/webapps'); // WordPressのURL
define('WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] . '/content' ); // wp-contentのパス
define('WP_CONTENT_URL', $WpUrl . '/content'); // wp-contentのURL
define('WP_PLUGIN_DIR', $_SERVER['DOCUMENT_ROOT'] . '/content/plugins' ); // pluginsのパス
define('WP_PLUGIN_URL', $WpUrl . '/content/plugins'); // pluginsのURL
define('LANGDIR', $_SERVER['DOCUMENT_ROOT'] . '/content/languages'); // languagesのパス

公開用のURLはグローバル変数として定義しておけば、テーマ側で呼び出して使うこともできます。
たとえば、ステージング環境では本番環境と少し表示を変えたいときは、URLを判別して表示を切り分けるなんてこともできるでしょう。

少し注意しなければいけないのは、wp-content内にファイルがあることを前提にしてしまっているプラグインが少なからず存在すること。
その場合はプラグインのファイルに記述してあるパスを修正する必要があります。

functions.phpに書いておくと便利なこと

まずfunctions.phpに必ず書くのは、不要なヘッダ情報の削除とwpautopの無効化です。

/* 不要なヘッダ情報を削除 */
remove_action('wp_head', 'wp_generator'); // metaのgenerator表示を削除
remove_action('wp_head', 'rsd_link'); // リモート投稿用のタグ(RSD)
remove_action('wp_head', 'wlwmanifest_link'); // リモート投稿用のタグ(Windows Live Writer)

/* wpautopを無効に */
remove_filter ('the_content','wpautop'); // the_contentタグ中のwpautopを無効に
remove_filter ('the_excerpt','wpautop'); // the_excerptタグ中のwpautopを無効に

WordPressのwp_headタグは要らないタグをいっぱい吐き出します。なくても困らないものは消すに越したことはないです。
あとは記事の自動整形を行うwpautopはHTMLエディタで記事を書く場合は無用なので、無効にしておきます。

そして、WordPressには記事の自動保存機能が備わっていますが、これは便利なようで非常におせっかい。この機能によって、post_idが知らない間にどんどん増えていってしまうからです。
特に現在の最新版であるWordPress 3.4.2は、ダッシュボードのクイック投稿を表示した瞬間にpost_idがひとつ増えるというワケのわからない仕様なので、僕はダッシュボードのクイック投稿は無効化しています。

// ダッシュボードのクイック投稿を無効化
function disable_quick_press() {
  remove_meta_box('dashboard_quick_press', 'dashboard', 'side');
}
add_action('wp_dashboard_setup', 'disable_quick_press');

投稿の自動保存やリビジョン管理自体を無効化する場合は以下のコードを。僕はたいてい自動保存とリビジョン管理は無効化しています。

// 投稿の自動保存を無効化
function disable_autosave() {
  wp_deregister_script('autosave');
}
add_action('wp_print_scripts', 'disable_autosave');

// 投稿のリビジョン管理を無効化
remove_action('pre_post_update', 'wp_save_post_revision');

あとは<title>タグやパンくずリストを自動で吐き出したりなんてのも、最近はプラグインではなくfunctions.phpでやっちゃってますが、これは作るサイトによってコードが変わってくるので今回は割愛。

特定の投稿にだけCSSを読み込む

ブログの場合、特定の記事にだけCSSを読み込みたいことがあると思います。
Writing Modeでは以下のコードをheader.phpに書いて、投稿画面のカスタムフィールドで個別のCSSファイルを読み込めるようにしています。

<?php /* 投稿ページの個別CSS */ if(is_single()) { if (have_posts()) : while ( have_posts() ) : the_post();
  $field = get_post_meta($post->ID, 'css', true); $Y_id = date('Y',get_post_time()); $m_id = date('m',get_post_time());
  if($field != '') { echo '<link rel="stylesheet" media="all" href="/content/uploads/' . $Y_id . '/' . $m_id . '/' . get_page($page_id)->post_name . '.css" />'; };
endwhile; endif; } ?>

これでカスタムフィールドの「名前」には「css」と、「値」には何か適当に文字列を入力することで、当該の投稿記事のみにCSSファイル(投稿スラッグ名.css)を読み込むことができるようになります。画像と同じようにWordPressの管理画面からCSSファイルをアップロードすることで、自動的にそのCSSファイルが読み込まれる仕様です。
もちろん応用すれば、個別のJSファイルやそれ以外のファイルの読み込みだって可能です。

本番環境にだけ読み込むファイルの管理

最近知ったのですが、locate_templateというテンプレートタグがあります。
これはテンプレートファイルがあるかどうかを確認するためのタグです。このタグを使えば、ステージング環境と本番環境でソースコードを変えることが容易になります。

たとえば、Writing Modeでは以下のような記述でローカルの開発環境と本番環境でソースコードを出し分けています。

<?php if (locate_template(array( 'production.php'))) { ?>
  <?php /* 本番環境のみ読み込むCSS/JS */ load_template( TEMPLATEPATH.'/production.php' ); ?>
<?php } else { ?>
  <?php /* ローカルのみ読み込むCSS/JS */ load_template( TEMPLATEPATH.'/development.php' ); ?>
<?php } ?>

これで本番サーバーのテンプレートディレクトリのみにproduction.phpを置き、ローカルのテンプレートディレクトリのみにdevelopment.phpを置きます。

Writing Modeの場合、production.phpでは圧縮されたJSファイル、TypeSquareとGoogle AnalyticsのJS読み込みを行っています。

管理画面のカスタマイズ

クライアントワークでWordPressサイトを構築する場合、管理画面から余計なメニューは除去してしまったほうがよいと思います。
CMSの弱点ですが、高機能化すればするほど管理画面も複雑になってしまう。せっかく「簡単に更新できる」という理由でWordPressサイトを構築して納品しても、管理画面にメニューがいっぱい並んでいては全然簡単に見えない。左メニューをスッキリさせるだけでだいぶ見た目は変わるはずです。

/* 左メニューから不要な項目を除去 */
function remove_menu() {
  remove_submenu_page('index.php', 'update-core.php'); // ダッシュボード -> 更新
  remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=category'); // 投稿 -> カテゴリー
  remove_submenu_page('edit.php', 'edit-tags.php?taxonomy=post_tag'); // 投稿 -> タグ
  remove_menu_page('link-manager.php'); // リンク
  remove_menu_page('edit-comments.php'); // コメント
  remove_menu_page('themes.php'); // 外観
  remove_menu_page('plugins.php'); // プラグイン
  remove_menu_page('users.php'); // ユーザー
  remove_menu_page('tools.php'); // ツール
  remove_menu_page('options-general.php'); // 設定
}
add_action('admin_menu', 'remove_menu');

クライアントワークの場合、外観やプラグイン、設定などの項目は下手に弄られても困るので、いっそのこと表示しないほうがいいでしょう。
また、WordPressの更新通知を表示しないように、あわせて以下のコードも記述しておくことをおすすめします。

add_filter('pre_site_transient_update_core', create_function('$a', "return null;"));

以上、WordPressのちょっとしたテクニック備忘録でした。

Comment / Trackback (5)

  1. @solaio

    “WordPressのちょっとしたテクニック備忘録 - やっぱりWebが好き - Writing Mode” http://t.co/Q6NpCjbt

    Twitter

  2. tree

    初めまして。
    HiGashの頃から閲覧させていただいております。
    片田舎のWebデザイナーです。

    WordPressは本体側のバージョンアップもそれなりにあるため、まだまだPHP駆け出しの私では正直なところ運用中の保守対応には限界があります。
    何よりも管理が楽にこしたことはないのですが、どのような点でwp-contentをWordpress本体と切り離すメリットがあるのでしょうか。
    非常に込み入った質問で恐縮ですが、気になりましたのでぜひ。

    Comment

  3. Takayuki Higashi

    > treeさん
    初めまして。
    前身ブログからご覧いただいているということで、どうもありがとうございます。
    さて、僕がwp-contentをwordpressフォルダから外に出してしまう理由ですが、
    バージョンアップの際にwordpressフォルダだけ(wp-config.phpだけは残します)を
    入れ替えれば済むのでラクというのが僕にとっては大きな理由です。
    wordpressのコアファイルは基本的にまったく弄らないので、
    ファイルのバージョン管理をするときもwp-contentだけを見ればよくて、
    触るフォルダと触らないフォルダを完全に分離したいなというのもあります。
    単純に、よく触るフォルダの階層をひとつでも上に上げたいというのもありますし、
    wp-contentとかいう、いかにも「WordPress使ってます」っていう名前のフォルダが
    何となくカッコ悪いから変えたいというのもあったりして。。。
    どれもほんの些細なところですが、僕にとっては分けて管理したいな、と。
    結局、好みの問題ですね。

    Comment

  4. tree

    >Takayuki Higashi様
    お返事ありがとうございます。
    なるほど。確かにそれなら管理が楽そうです。

    納品してからの管理を考えると、デフォルトでいくのも考えものですね。
    まだまだ、ディレクトリを弄るほどは知識不足ですから勉強しないと。

    Comment

  5. @mmf32

    wp-contentフォルダをWordPress本体とは切り離す http://t.co/Ccysg2bl1c

    Twitter

Leave A Comment

Address never made public