Posts Tagged ‘WordPress’

WordPress を高速化するには WP Super Cache を入れよう

WP Super Cache の存在は前々から知っていたんですが、最近になって WordPress が重くなってきて困っていたので使ってみました。
WordPress › WP Super Cache « WordPress Plugins

最近の WP Super Cache は日本語化されてて設定は簡単です。
それにしても、なぜ重くなったんでしょうか。考えられる原因は以下です。

  • 最近密度の濃い記事を投稿するようになった
  • 最近サーバーを Serverman@VPS に移転した
  • 最近アクセスが増加した
  • 何か処理に時間のかかるプラグインを導入した

まぁサーバー移転が原因でしょうが…。でも VPS 最高なので止められない!
でもこの程度で重くなる WordPress も結構重い CMS だと思います。前々から少し重いなと思っていたので良い機会です。
ちなみにこの記事は WP Super Cache のテストのために投稿しました…。

WordPress のカスタムフィールドの値で記事をソートする方法

WordPress のカスタムフィールドの値で記事をソートすることが可能です。

例えばまず参考に、最近記事の一覧にして出力するコードがあります。

1
2
3
4
5
6
$recent = new wp_query();
$recent->query('post_type=post&showpost=10');
while($recent->have_posts()) {
	$recent->the_post();
	echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}

これに手を加えて説明しましょう。優先度の高い記事上位10件を表示する一覧を作ります。
カスタムフィールドでキーを priority とし、優先度 000~100 で全ての記事に入力したとします。

その記事を取り出すコードが以下になります。

1
2
3
4
5
6
$recent = new wp_query();
$recent->query('post_type=post&showpost=10&orderby=meta_value&meta_key=priority&order=DESC')');
while($recent->have_posts()) {
	$recent->the_post();
	echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}

もちろん WordPress 3.0 から使えるようになったカスタム投稿タイプでも使えます。
プロジェクトというカスタム投稿タイプを作り、カスタムフィールドで progress というキーに 000~100 で進捗状況を入力します。
そして、以下のコードで進捗状況が高いものほど上に表示されるようになります。

1
2
3
4
5
6
7
8
9
10
$loop = new wp_query();
$loop->query('post_type=project&orderby=meta_value&meta_key=progress&order=DESC');
while($loop->have_posts()) {
	$loop->the_post();
	$progress = get_post_custom_values('progress');
		echo '<h3>' . get_the_title() . '</h3>';
		echo apply_filters('the_content', get_the_content());
		echo '<div class="progress">' . abs($progress[0]) . '%</div>';
	}
}

このブログの右側進捗状況はこのコードを応用して作っています。
ソートについて調べる機会があったのでメモしておきます。

ちなみに今回参考にさせていただいた記事は以下です。
WordPress › フォーラム » 投稿をカスタムフィールド値でソートし、更に時系列に並べる
query_postsで指定できるパラメーター | WordPress | understandard.net

WordPress 3.0 のカスタム投稿タイプの設定とカスタム投稿の出力例

WordPress 3.0 からはカスタム投稿タイプというものが実装されました。
扱いは詳しく説明されている方のおかげでとても簡単です。以下のページが参考になりました。今回はカスタム投稿タイプの設定方法を改めて、成功事例ということで紹介しておきます。
カスタム投稿タイプ(Custom Post Type)の導入と使い方 [WordPress 3.0] | Odysseygate.com
WordPress 3.0のカスタム投稿タイプ機能(その1) – The blog of H.Fujimoto

投稿タイプの追加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function custom_post_type() {
  $labels = array(
    'name' => _x('プロジェクト', 'post type general name'),
    'singular_name' => _x('テスト(議事録)', 'post type singular name'),
    'add_new' => _x('プロジェクトを追加', 'book'),
    'add_new_item' => __('新しいプロジェクトを追加'),
    'edit_item' => __('プロジェクトを編集'),
    'new_item' => __('新しいプロジェクト'),
    'view_item' => __('プロジェクトを編集'),
    'search_items' => __('プロジェクトを探す'),
    'not_found' =>  __('プロジェクトはありません'),
    'not_found_in_trash' => __('ゴミ箱にプロジェクトはありません'),
    'parent_item_colon' => ''
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => 2,
    'supports' => array('title','editor', 'custom-fields')
  );
  register_post_type('project',$args);
}
 
add_action('init', 'custom_post_type');

たったこれだけで投稿タイプを増設できます。
ちなみに私のこのブログの右側プロジェクトは以上のコードで設定しています。

追加した投稿タイプを読み込み

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$loop = new wp_query();
$loop->query('post_type=project&orderby=meta_value&meta_key=progress&order=DESC&showpost=100');
while($loop->have_posts()) {
	$loop->the_post();
	$progress = get_post_custom_values('progress');
	if($progress[0] < 100) {
		echo '<section>';
		echo '<h3>' . get_the_title() . '</h3>';
		echo apply_filters('the_content', get_the_content());
		echo '<div class="progressbar">';
		echo '<div class="value" style="width:' . abs($progress[0]) . '%;">';
		echo '<div class="text">' . abs($progress[0]) . '%</div>';
		echo '</div>';
		echo '</div>';
		echo '</section>';
	}
}

私のブログ右側の読み込み部分です。読み込み時にカスタムフィールドの値でソートをしています。

ただ読み込むだけであれば、実際はもっと簡略化することができますが、ただノーマルなコードを紹介しても意味がありませんので、カスタムフィールドを駆使した応用例を紹介しておきます。

静的ファイルで構成されたサイトを WordPress で構築しリニューアルする際にスムーズに切り替える方法とか作法

静的ファイルで構成された古いサイトをリニューアルしましょうと言ってリニューアルすることは最近よくあることですね。
ですが、古いコンテンツから新しいコンテンツに切り替える、つまり静的ファイルから WordPress に切り替える場合に、静的ファイルを全て削除してから、そこに WordPress をインストールするという力技、もしくは、静的ファイルが入っているところに WordPress のファイルぶち込んで、index.html を優先にして、少しずつ作業をしていくなんていう野蛮なことはやっていませんか。

今回は先程書いた13時になったら Web サイトをカチっとリニューアルする作法とか方法の発展形として、静的ファイルで構築された古い Web サイトを、滞りなく WordPress で構築されたサイトに切り替える方法をご紹介しますよ。

.htaccess を設置する

といっても、先程書いた記事でほとんど説明していますので、原理についてはそちらを参照してください。ここではいきなりラストスパートです。
以下の .htaccess を設置してください。

1
2
3
4
5
6
7
8
9
10
11
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123.456.789.01
RewriteCond %{REQUEST_URI} !^/hoge/
RewriteRule (.*) /before/$1 [L]
# for WordPress
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

ちょっと、ここは私もなんとなくでやってるので、解釈間違ってるかもしれませんが、仕組みとしては、最初の RewriteRule で通常の人は /before/ のファイルにアクセスしようとするので、その後の WordPress 用の RewriteRule は適用されないけど、最初の RewriteRule をくぐり抜けた我々などは、WordPress の RewriteRule が効きますので、WordPress でのサイトが閲覧可能です。

リニューアル後に切り替えは、WordPress 部分以外削除します。例として以下のような感じにします。

1
2
3
4
5
6
7
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

これで全ての人が WordPress で構築されたサイトを閲覧できますね。

WordPress で RSS 2.0 を取得して一覧にするコード

WordPress でポートフェリオサイト作って、例えば MT でやってるブログの最新記事一覧を公開したい際に RSS を使ってなんとかしようと思うと思います。そんな時に役に立つコードです!

使い方

1
<dl><?php rssList('url') ?></dl>

引数に RSS 2.0 の URL を入れると定義型リストとして、dt に日付、dd にリンク付き記事名を入れて出力しますので、全体を dl で括ってあげましょう。

ちなみに、第2引数には表示したい件数をいれると件数を制御することも可能です。

1
<dl><?php rssList('url', 10) ?></dl>

この例だと10件を表示して終了します。

コード

function.php などに入れておくと便利かと思います。

1
2
3
4
5
6
7
8
9
10
11
12
13
function rssList($str, $num = null) {
	include_once(ABSPATH . WPINC . '/rss.php');
	$rss = fetch_rss($str);
	$i = 0;
	foreach ( $rss->items as $value ) {
		$i++;
		echo '<dt>' . date('Y-m-d', strtotime($value['pubdate'])) . '</dt>';
		echo '<dd><a href="' . $value['link'] . '">' . $value['title'] . '</a></dd>';
		if(isset($num)) {
			if($i >= $num) break;
		}
	}
}

ちなみに、定義型リストではなく、普通にリストとして出力したいという場合はコードの中を弄っていただければと思います。
ちなみに、こんな形で出力したいってのがあれば言ってくれれば、気が向いたときにでも作ります。

WordPress で特定のカテゴリの場合のみに任意の文字列を出力するコード

WordPress でサイト構築していると、カテゴリによって何か変化を与えたい場合ありますよね。例えば、お花のカテゴリの記事の場合は背景をお花にし、ホラーのカテゴリではドクロの背景にしたいなど。そんな願いを一瞬で叶えるのがこのコードです。自分で書かずにコピーして早く退社しましょう。

使い方

1
<?php catEcho('horror', 'hoge'); ?>

第1引数にカテゴリスラッグを入れます。コンマで区切ればいくつでも指定可能です。
第2引数にカテゴリスラッグに該当した場合に出力する文字列を入れます。

コード

function.php に入れるだけで使えるようになりますですよー。

1
2
3
4
5
6
7
8
9
10
11
12
13
function catEcho($catslug, $text) {
	$cat = get_the_category();
	$slugs = explode(',', $catslug);
	if(is_array($slugs)) {
		foreach($slugs as $slug) {
			if($cat[0]->slug == $slug && is_category()) {
				echo $text;
				return true;
			}
		}
	}
	return false;
}

※カテゴリ内でしか動作しません。中に is_category() って書いてあります。

仕事が終わればそれでいい。早く帰ることこそ正義。

WordPress のページで特定のスラッグの場合のみ任意の文字列を出力するコード

WordPress でサイト構築していると、ページによってヘッダ画像を変えたり、現在のページに合わせてメニューボタンを on にしたり off にしたりする必要がありますよね。そんな願いを私が書いたこのコードで一瞬で解決できます。

使い方

1
<?php pageEcho('about,company', 'hoge'); ?>

第1引数にページスラッグを入れます。コンマで区切ればいくつでも指定可能です。
第2引数にページスラッグに該当した場合に出力する文字列を入れます。

コード

function.php に入れるだけで使えるようになりますよー。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function pageEcho($pageslug, $text) {
	global $post;
	$page = get_page_uri($post->ID);
	$slugs = explode(',', $pageslug);
	if(is_array($slugs)) {
		foreach($slugs as $slug) {
			if($page == $slug && is_page()) {
				echo $text;
				return true;
			}
		}
	}
	return false;
}

※ページ内でしか動作しません。中に is_page() って書いてあります。

まぁコードの質に付いて考えるとどうなのか知りませんが、仕事が早く終わるならそれで良いです。技術は後から着いてくると思う!

WordPress の $post の中身・内容を調べてみよう

WordPress の $post はループ内で使用できる変数だそうで。
中に何が入っているのか気になるので、分解してみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
stdClass Object
(
    [ID] => 4025
    [post_author] => 2
    [post_date] => 2010-04-24 18:07:14
    [post_date_gmt] => 2010-04-24 09:07:14
    [post_content] => WordPress ではページ毎にテンプレートを用意することが可能...
    [post_title] => WordPress のページテンプレートの情報を取得する方法
    [post_category] => 0
    [post_excerpt] => 
    [post_status] => publish
    [comment_status] => open
    [ping_status] => open
    [post_password] => 
    [post_name] => wordpress-pagetemplate-meta
    [to_ping] => 
    [pinged] => 
http://animal-taste.com/wordpress-tips/2008/12/1044.html
    [post_modified] => 2010-04-24 18:09:54
    [post_modified_gmt] => 2010-04-24 09:09:54
    [post_content_filtered] => 
    [post_parent] => 0
    [guid] => http://kezy.org/?p=4025
    [menu_order] => 0
    [post_type] => post
    [post_mime_type] => 
    [comment_count] => 0
    [filter] => raw
)

便利ですね。今後に使えそうです。

WordPress のページテンプレートの情報を取得する方法

WordPress ではページ毎にテンプレートを用意することが可能です。
そのページテンプレートで何を利用しているのか取得するには以下のコードで OK です。

1
get_post_meta($post->ID, '_wp_page_template', true);

返ってくる値はテンプレートのファイル名になります。
page.php とか、original.php みたいな感じですね。

これらについては以下のページが役に立ちました。
[覚書] ページで使用中のテンプレートを調べる方法

WordPress でカテゴリのタイトルやスラッグを取得する方法

WordPress でカテゴリの情報を取得するには get_the_category() を使います。
例えば、カテゴリ名やカテゴリスラッグを取得するなら以下のコードで十分です。

1
2
3
$cat = get_the_category();
echo $cat[0]->name;
echo $cat[0]->slug;

カテゴリ名やカテゴリスラッグ以外にも取得できるものはたくさんあります。親カテゴリやカテゴリに登録されている記事数などを取得することもあるのではないでしょうか。今後のために、$cat[0] の中身を見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stdClass Object (
	[term_id] => 7
	[name] => 新着情報
	[slug] => news
	[term_group] => 0
	[term_taxonomy_id] => 7
	[taxonomy] => category
	[description] =>
	[parent] => 0
	[count] => 1
	[object_id] => 95
	[cat_ID] => 7
	[category_count] => 1
	[category_description] =>
	[cat_name] => 新着情報
	[category_nicename] => news
	[category_parent] => 0
)

いろいろ応用ができそうですね。

Page 1 of 612345...Last »