カテゴリー: wordpress

【WordPress】実務で使える!おすすめプラグインをまとめてみました

WordPressでの開発を主に担当している、
フロントエンドエンジニアのトウヤマです。

後輩エンジニアのために、そろそろ「WordPress関連の情報をまとめてあげないとな」って考えていたら、
なぜか、それならいっそブログにまとめてしまおう!ということになってしまいました……

というわけで、今回は、
ここ最近で使ってみて、今後も実務で使い続けたい!便利な「WordPress おすすめプラグイン」を7つまとめてみましたのでご紹介します。

Advanced Custom Fields

Advanced Custom Fields

Advanced Custom Fields

弊社では有料版のProを使用。
とりあえず入れないと開発ができないくらいです。

Options PageFlexible Contentは多用しています。

Custom Post Type Permalinks



更新箇所が2つ以上ある場合に使用。

例えば、NEWSとブログという時にNEWSのURLは「ID」でいいけど、ブログはURLを自由に設定したい!というときに便利。
カスタム投稿タイプのページャーまで設定してくれるのもありがたい。

※Custom Post Type Permalinks 1.0.0以上で下記の設定には注意。
Custom Post Type Permalinks 1.0.0以上で発生する、カスタム投稿へのパーマリンクが404になってしまう現象について。

Category Order and Taxonomy Terms Order



Category Order and Taxonomy Terms Order

カテゴリが多い場合によく活躍します。

カテゴリ一覧の順番を「登録順ではなくその都度入れ替えたい!」という依頼がよくあります。そういうときには、このプラグインで対応することが多いです。

AJAX Thumbnail Rebuild



AJAX Thumbnail Rebuild

サムネイルを複数作成する場合。

開発途中でサムネイルを作成しなおすような場合に使います。

AddQuicktag



AddQuicktag

◎更新する方がHTMLを書けない場合。

独自で作ったスタイルを登録し、更新者はボタンを押してタグを押すだけで、
入力が可能になります。

MW WP Form



MW WP Form

コンタクトフォームを作成する場合。

確認画面付きのフォームが作成されるプラグイン。
バリデーションの種類も豊富です。

MW WP Formの注意点については、過去にブログで書いてます。こちらも合わせてどうぞ。
[article link=3530]

Any Mobile Theme Switcher



Any Mobile Theme Switcher

スマホ対応である場合。

ユーザーエージェントの判定でテンプレートの切り替えが可能になります。

まとめ

プラグインを入れたら、予期せぬバグが発生したり、ページが重たくなった!なんてことも発生します。

最低限必要なプラグインのみインストールして、シンプルで分かりやすいWordPressの設計を心がけたいですね。

MW WP Formを使って動かない時に確認したいこと

「Word Press」のコンタクトフォームと言えば「Contact Form 7」。
いつも迷うことなく利用し続けていました。
「Contact Form 7」といえば、海外で開発されているため、基本確認画面がありません
日本では確認画面が必要な案件が多く、「Contact Form 7」を使用するともれなく
カスタマイズしなければなりません。
そうなると手間がかかってしまったり、精度が落ちてしまうという問題点が….

そこで、新しく話題に上がった「MW WP Form」を試しに使ってみました!

管理画面からの設定が簡単で、とても使いやすい!
ですが、実装してみたところ動かない!?という問題にぶつかってしまいました・・・

いろいろ調べてみましたが、比較的新しいプラグインということもあり情報が少ないのが難点。
有力な情報がなく困ってしまいました。
試行錯誤した結果、なんとか解決することができたので、その際の注意点をまとめたいと思います。

1.ループの記述がない。


<p>タグが入るのが面倒で、独自テンプレートに $post->post_content; だけを記述していることが
私はよくあります。

これではショートコードは展開できないので、

[code]
if (have_posts()) :
while (have_posts()) :
the_post();
remove_filter( ‘the_content’, ‘wpautop’ );
remove_filter( ‘the_excerpt’, ‘wpautop’ );
the_content();
endwhile;
else:
<p>記事がありません</p>
endif;
[/code]

こんな感じで書くとショートコードも展開出来て、無駄な<p>タグも除去できます。

2.wp_head();とwp_footer();が足りていない。


これは、プラグインが動作しない大半の原因ですね。
独自テンプレートを作る際どうしても忘れてしまいがちなので要注意です。

3.<form></form>タグが作成したページに入っている


私は、これに一番躓いてしまいました。
フォームのページをコーディングし、WordPressに組み込む際に、管理画面にそのまま貼り付けていました。
その時に3.<form></form>が残ってしまっていたようです。

「MW WP Form」は自動でコードを挿入してくれるので、それよりも中に
<form></form>タグがあると動きません。
きちんとチェックしなくてから組み込まないといけませんね。反省。

まとめ

実装してみた感想として、基礎的なところを見落としていたことが悔やまれます。
動作さえすれば、使い勝手もよく優れたプラグインなので、今後カスタマイズなどの記事も
かけたらと思っています。

人気記事ランキングプラグイン「WordPress Popular Posts」と「WP-PostView」の機能比較

ブログサイトでは人気記事ランキング(アクセスランキング)を実装しているサイトがほとんどですよね。
そこでWordPressで人気記事ランキングを実装する際にお世話になるプラグインを2つ比較してみました!

WordPressを1から構築する人向けに拡張性という所を重視しています!
初心者は何も考えずに「WordPress Popular Posts」を使うのが無難です。

WordPress Popular Posts

デイリー・ウィークリー・総アクセスのアクセス数を表示できるのが魅力的。
タイトルとリンク、投稿日などの表示カスタマイズが可能。
拡張すれば、サムネイルも表示できます。

すごく便利なので、ある程度のサイトであれば「WordPress Popular Posts」を使っておけば間違いないかと思います。

デメリット
・カスタムフィールドの値やカテゴリ名などが取得できず拡張性が少ない。

上記が意外とデメリットとしては大きいです。
カテゴリなど入っている場合はデザインの変更をお願いすることがあるので、
もう少し拡張できればといつも思う所です。

WP-PostViews

カスタムフィールドの値やカテゴリ名が取得できるプラグインです。
アクセス数がカスタムフィールドの「views」に保存されるので
get_postsの取得が可能。

[code]<?php
$popular = get_posts(
array(
‘post_type’ => ‘post’,
‘meta_key’ => ‘views’,
‘orderby’ => ‘meta_value_num’,
‘order’ => ‘ASC’
)
); ?>

  • <a href=”<?php echo get_the_permalink($p->ID); ?>”><?php echo get_the_title($p->ID); ?>

[/code]

取得方法は上記みたいな感じです。

とても拡張性が高くサムネイルの表示などもwordpressを独自で組まれる方はとても扱いやすいプラグインです。

デメリット
・総アクセス数しかカウントできない

純粋なウィークリーじゃなければ
古い記事は表示されないという方法で代用策として下記の様なことも参考にできます。

WP-PostViewsとかJetpack Post Viewsで出力する記事を徹底的にカスタマイズしちゃう

結局よく使うのは「WordPress Popular Posts」

最初は総アクセスでよくても今後週間やデイリーに変更したいという要望がとても多いので回収のことを考えると
「WordPress Popular Posts」で実装します。

ブログサイトの場合は完全に「WordPress Popular Posts」
よくある質問をアクセス順で並べるという際は「WP-PostViews」を使用しています。

個人的にはWP-PostViewsが週間やデイリーに対応すれば完璧なのになと思うばかりです。

コメント欄をレビュー機能にカスタマイズ[WordPress]

やること

・★マークでユーザーが評価できる
・投稿されたレビューに参考になったかを評価できる

使用するプラグイン

Comment Rating Field Plugin
Like Button Voting & Rating

Comment Rating Field Plugin

★のマークで評価できる項目が自動挿入されます。
星の画像はカスタマイズ可能で無料のプラグインにしてはとても自由度が高いです。
有料も検討したくなります。

Like Button Voting & Rating

評価するボタンのテキストや、アイコンをWPの管理画面から編集可能。
また、デザインのバリエーションも豊富。

以上の二つのプラグインを入れただけで下の画像くらいにはなります。
この状態でも使えそう。

コメント欄に5段階評価のレビュー機能を追加出来るComment Rating Field Plugin
こちらの記事によると平均点なども実装できそうなので
今後、もっと工夫できそうです。

Advanced Custom Fieldsを使ってカテゴリーやカスタムタクソノミーに画像を登録する方法

Advanced Custom Fieldsを使ってカテゴリーやカスタムタクソノミーに画像を登録する方法

ニュースなどの記事のタイトル前にアイコンが挿入されているケース。
今後カテゴリを追加していく際CSS等を触ることなく
アイコンをWPから投稿できるようにしました。

【使用するプラグイン
「Advance Custom Fields」

Word Pressのカスタムフィールドプラグインは沢山ありますが、
「Advanced Custom Fields」はカテゴリにも画像を追加するカスタムフィールドを追加できます。

Advanced Custom Fieldsでカテゴリにカスタムフィールドを追加

Advanced Custom Fieldsでカテゴリにカスタムフィールドを追加

タクソノミーに画像のカスタムフィールドを追加する時に
返り値を「画像URL」に設定しておく

登録した画像を取得

こちら(カテゴリに画像のカスタムフィールドを追加する方法[WordPress])に丁寧に書かれているので参考にしながら、get_postsでループさせます。

<dl>
<?php

$posts = get_posts(
array(
'post_type' => 'post'
)
);


foreach($posts as $p){ ?>

<dt>
<?php
echo get_the_date('Y.m.d',$p->ID);
$cat = get_the_category($p->ID);
$cat_id = $cat[0]->cat_ID;
$cat_name = $cat[0]->cat_name;
?>
<img src="<?php the_field('フィールド名','category_'.$cat_id); ?>" alt="<?php echo $cat_name; ?>">
</dt>

<dd>
<a href="<?php echo get_the_permalink($p->ID); ?>">

<?php echo get_the_title($p->ID); ?>
</a>
</dd>

<?php } ?>

</dl>

カスタムタクソノミーの場合

ポストタイプ名:news
タクソノミー名:news_cat
フィールド名:cat_img

カスタムタクソノミーを追加してそのまま使っても上手く挙動するわけもなく、
調べると、
Advanced Custom Fields でカテゴリーのアイコンや背景色を設定
にかかれていました。

「category」と設定していた所を「news_cat」みたいな形にしないといけないとのこと。
先ほどのページを参考にしながら、下記に変更。

<dl>
<?php

$posts = get_posts(
array(
'post_type' => 'news'
)
);


foreach($posts as $p){ ?>

<dt>
<?php
echo get_the_date('Y.m.d',$p->ID);
$terms = wp_get_object_terms( $p->ID, 'news_cat' );
$term_id = $terms[0]->term_id;
$term_name = $terms[0]->name;
?>
<img src="<?php the_field('cat_img','news_cat_'.$term_id); ?>" alt="<?php echo $term_name; ?>">
</dt>

<dd>
<a href="<?php echo get_the_permalink($p->ID); ?>">

<?php echo get_the_title($p->ID); ?>
</a>
</dd>

<?php } ?>

</dl>

マルチサイトを利用し、別ブログで呼び出したい場合

マルチサイトで別ブログからタクソノミーを呼び出したい場合につまずいたのでメモ。
いくらswitch to blogをして別ブログから呼びだそうとしてもタイトルと日付は取れるのに、
どうもうまく、タクソノミーが取れずに彷徨っていると。
switch to blogしてもタクソノミーの情報は取ってこれないことが判明。

以下を参考にfunctionにありがたくコピペ
参考:[WordPress]マルチサイトで別ブログの記事が属するカスタムタクソノミーを取得

function.php

function get_taxonomies_by_blog_post($taxonomy, $blog_id, $post_id) {
// ブログを切り替える
switch_to_blog($blog_id);
global $wpdb;
// クエリ作成
$query = ”
SELECT *
FROM $wpdb->term_relationships
LEFT JOIN $wpdb->term_taxonomy
ON $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
LEFT JOIN $wpdb->terms
ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
WHERE $wpdb->term_relationships.object_id = %d
AND $wpdb->term_taxonomy.taxonomy = %s
“;
// プレースホルダ
$args = array($post_id, $taxonomy);
// データを取得
$taxonomies = $wpdb->get_results( $wpdb->prepare( $query, $args ) );
// ブログを戻す
restore_current_blog();
return $taxonomies;
}

これで別ブログのタクソノミーも取得できるようになったので
呼び出したい場所に下記の修正したコードを書く

ポストタイプ名:news
タクソノミー名:news_cat
ブログID:2
フィールド名:cat_img

上記の場合

取得したい場所に(例:home.php)

<dl>
<?php

switch_to_blog(2);
$posts = get_posts(
array(
'post_type' => 'news'
)
);


foreach($posts as $p){ ?>

<dt>
<?php
echo get_the_date('Y.m.d',$p->ID);
$terms = get_taxonomies_by_blog_post('news_cat', '2', $p->ID);
$term_id = $terms[0]->term_id;
$term_name = $terms[0]->name;
?>
<img src="<?php the_field('cat_img','news_cat_'.$term_id); ?>" alt="<?php echo $term_name; ?>">
</dt>

<dd>
<a href="<?php echo get_the_permalink($p->ID); ?>">

<?php echo get_the_title($p->ID); ?>
</a>
</dd>

<?php } ?>

</dl>
<?php restore_current_blog(); ?>

これでなんとかカテゴリに画像を追加して運用できるかなと。
別ブログでタクソノミー取得できないのは以外とハマってしまって大変でした。

複数ブログ機能(マルチサイト)利用時のサーバー移行手順

複数ブログ機能(マルチサイト)利用時のサーバー移行手順

基本的には普通の移行と同じで、wp-configのマルチサイト設定を編集するかどうかなだけです。

環境

旧サーバー

ドメイン demo.hogehoge.com
ドキュメントルート /var/www/demo

新サーバー

ドメイン www.hogehoge.com
ドキュメントルート /var/www/www

上の新サーバーに移行する手順を例とします。
基本的にはwordpressのインポート/エクスポート機能は使用しません。

1.旧サーバーのMySQLのデータベースをダン

phpMyAdmin等が使えればログインし、wordpressが使用しているDBを選択したのちエクスポートタブを選択します。
「ファイルを保存する」にチェックを入れて実行するとdemodb.sqlみたいなファイルがダウンロードできます。
SSHログインができてmysqlコマンドが実行できるなら以下のコマンドでも。

mysqldump -uユーザ名 -pパスワード --databases DB名 &gt; demodb.sql

2.取得したダンプファイルを一括置換

とってきたdemodb.sqlを一括置換します。
テキストエディタとかで開いて置換すればOKです

demo.hogehoge.com を www.hogehoge.com に一括置換
/var/www/demo を /var/www/www に一括置換
旧DB名 を 新DB名 に一括置換

WordPressで作成した記事内容の中も置換されるのである程度の確認はいるかもしれませんが基本的には全部置換して問題ないでしょう。
マルチサイトを使用していない場合や、サブディレクトリ形式のマルチサイトであれば上記でOKですが、
サブドメイン形式のマルチサイトであればそれらもすべて置換を行います。

blog1.hogehoge.com を blog1.hogehoge.com に一括置換
blog2.hogehoge.com を blog2.hogehoge.com に一括置換
...

3.旧サーバーのファイルをすべて新サーバーにコピー

FTPなどで旧サーバーのファイルをすべてコピーします。
wordpressディレクトリとかもそのままごっそりと。

4.新サーバーのMySQLのデータベースを作成してリストア

新サーバーにデータベースを作成します。
phpMyAdmin等が使えればログインし、「新規データベースを作成する」から作成すればOKです。

データベースの作成ができたら、先ほど置換したファイルをリストアします。

phpMyAdminが使えればログインし「インポート」メニューからファイルを選択する事ができますが、PHPで許可されている最大容量までしかアップロードできないので、容量制限の問題でアップロードできない場合はphp.iniや.htaccessでアップロード可能な最大サイズを変更する必要があります。

また、コマンドが使用できるのであれば以下のようなコマンドでリストア可能です。

mysql -u ユーザ名 -pパスワード DB名 &lt; demodb.dump

5.新サーバーのwp-config.php.htaccessの修正

wp-config.phpをのDB設定を変更します

/** WordPress のためのデータベース名 */
define('DB_NAME', '新DB名');
/** MySQL データベースのユーザー名 */
define('DB_USER', '新ユーザー名');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', '新パスワード');
/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

複数ブログ機能を使用している場合は以下の項目もあるはずなので
ドメイン名を編集します。

define('WP_ALLOW_MULTISITE', true);
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false );
$base = '/';
define( 'DOMAIN_CURRENT_SITE', '新ドメイン名' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

5.確認

あとは動作確認を行えばOKです。

アカウントadminへの不正ログイン攻撃

最近、WordPressの不正ログイン被害が多く発生しているそうです。

WordPressは何も考えずインストールすると、管理ユーザー名は「admin」となってしまいます。
今回の不正ログインでは管理ユーザー名の「admin」に対して、さまざまなパスワードにて
ログインを試みる、いわゆるブルートフォースアタックと呼ばれるものです。

簡単なパスワードにしていると高確率でログインされてしまい「フィッシングサイト」に利用されたり「情報漏えい」したりとんでもないことになってしまいます。

そんな事になる前に対策を行っておきましょう

管理画面へのログインをIP制限

・特定のIPアドレスからしか編集を行わない
・サーバーが.htaccessを使用できる
上記の場合はそもそも管理画面にログインできるIPを制限してしまったら安心です。

.htaccess
[code]
<Files “wp-login.php“>
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
</Files>
[/code]

上記のように記述した.htaccessをwp-login.phpと同階層に置けば特定のIP以外からのログイン画面への接続を制限する事が出来ます。

インストール時に作るIDをadminではなく別のものに

最新のwordpressではインストール時に作成するIDを任意に決定できます。
こちらでadmin以外のユーザー名を指定して下さい。

すでにインストールされたWordPressのIDを変更する

すでにadminユーザーとしてインストールされたWordPressの場合はすこし手間がかかります。
手順としては以下の通り

1.adminユーザーで別のIDの管理ユーザーを作成

ユーザー > 新規作成 で新規のユーザーを作成します。
権限を管理者にするのを忘れずに

2.adminユーザーをログアウトして新規のユーザーでログインします

するとadminユーザーが削除できるようになってますので削除。

マルチサイトWordPressのIDを変更する

すでにadminユーザーとしてインストールされたマルチサイト用のWordPressの場合はさらに手間がかかります。
手順としては以下の通り

1.サイトネットワークの新規ユーザー作成

参加サイト > サイトネットワーク管理者 > ユーザー > 新規追加 にて新規ユーザーを追加します。

2.作った新規ユーザーに「特権管理者権限」を与える

参加サイト > サイトネットワーク管理者 > ユーザー > 一覧 にて作成した新規ユーザを編集し、
「このユーザーにネットワーク特権管理者権限を与える」にチェックを入れて更新します。

3.各サイトにサイトネットワーク管理者のユーザーを追加する

各サイトのユーザー > 新規作成 で新規のユーザーを作成します。
マルチサイトの場合は既存のユーザーをメールアドレスから追加します。
この作業を全サイトぶん繰り返します。

4.adminユーザーの権限を削除する

adminユーザーをログアウトし、新規作成したユーザーでログインします。
新規作成したユーザーでadminユーザーの権限を削除します。
各サイトのユーザー > adminユーザーの編集を行い、権限を「このサイトでの権限なし」に変更します。
この作業を全サイトぶん繰り返します。

この作業が完了するとネットワーク管理者一覧でのadminユーザーの「サイト」に何も表示がなくなります。

この状態を確認したらadminユーザーの管理者権限をはずし

後はサイトネットワーク管理者からadminを削除して完了です。

パーマリンクをpostnameにて自動採番

WordPressの採番について。

記事のURLがランダムな数字であれば問題ないという場合、
記事ごとのパーマリンクの設定を%post_id%とする事は多いと思います。

しかし、この%post_id%はたしかに記事固有IDなのですがいろいろな問題があります。
ひとまず直面した問題は以下の通り

・特定の記事のURLを変えたい時があったとしても変更ができない
・サーバー移転時にパーマリンクが変わる

その為、%postname%を使用しつつ、新規投稿時のみ%post_id%が入る形ができるように頑張ってみました。

パーマリンクの修正

WordPress管理画面の
設定 -> パーマリンク設定
から%post_id%としていた部分を %postname% に変更します。

meta-boxes.phpの修正

wp-admin/includes/meta-boxes.php の post_slug_meta_box関数を編集します。
おそらく500~510行目あたりです。

[code]
function post_slug_meta_box($post) {
?>
<label class=”screen-reader-text” for=”post_name”><?php _e(‘Slug’) ?></label><input name=”post_name” type=”text” size=”13″ id=”post_name” value=”<?php echo esc_attr( $post->post_name ); ?>” />
<?php
}
[/code]

こちらを以下のように修正します。

[code]
function post_slug_meta_box($post) {
?>
<label class=”screen-reader-text” for=”post_name”><?php _e(‘Slug’) ?></label><input name=”post_name” type=”text” size=”13″ id=”post_name” value=”<?php
if(get_post_status() == ‘publish’ || get_post_status() == ‘future’ || get_post_status() == ‘draft’ ){
echo esc_attr( $post->post_name );
} else {
echo $post->ID;}
?>” />
<?php
}
[/code]

変更点はvalueの部分ですが、少し解説です。
まず条件分岐している部分ですが、get_post_status() で現在のpostの状態を取得できます。
このpost状態が「公開」「予約投稿」「下書き」の場合とそれ以外の場合で条件分岐させています。
なぜこんな条件分岐を入れているかと言うと、
すでに投稿された記事以外はあらたな番号を採番する必要がないからです。
この条件分岐がなければ、記事を更新する度に記事のパーマリンクが変更されてしまう事となります。

つまり、すでに投稿されていれば、入力されているスラッグを表示、
新規の投稿であれば自動採番 といった形です。

以上でpostnameでの自動採番は完了です

(おまけ)自動連番

試してないのですが、googleで検索したサイトなどを確認したら
get_usernumposts で そのユーザーの投稿数を+1する方法が多く見つかりました。
ただget_usernumpostsは今は非推奨、との事なのでcount_user_postsをつかう方がよさそう。
連番にしたい場合は上記のソースのecho $post->ID を echo count_user_posts(1) + 1 に変更すればOKだと思われます。
おそらく記事を完全に削除したりするとIDが狂いそうな気もしますが、、

未検証です。
[code]
function post_slug_meta_box($post) {
?>
<label class=”screen-reader-text” for=”post_name”><?php _e(‘Slug’) ?></label><input name=”post_name” type=”text” size=”13″ id=”post_name” value=”<?php
if(get_post_status() == ‘publish’ || get_post_status() == ‘future’ || get_post_status() == ‘draft’ ){
echo esc_attr( $post->post_name );
} else {
echo count_user_posts(1) + 1;}
?>” />
<?php
}
[/code]

複数のカスタムフィールドでソート

WordPressでの特殊なソート方法。

通常WordPressの記事取得は以下のような形で行えます。
以下の感じだとカスタム投稿タイプhogehogeの記事を取得してきます。

$args = array(
'post_type'      => 'hogehoge',
);
query_posts( $args );

ソート

WordPressの記事の取得はorderbyで指定した内容の並び順にする事ができます。
指定できる内容は以下の通り。

'ID' - post id 順
'author' - 投稿者順
'title' - タイトル順
'date' - 投稿日付順
'modified' - 最終更新日順
'parent' - 親記事のID順
'rand' - ランダムにする
'comment_count' - コメント数で並べ替え(バージョン 2.9 以降のみ)
'menu_order' - 記事のメニューオーダー順
'meta_value' - 指定したカスタムフィールド順
'meta_value_num' - カスタムフィールドの値を数値として扱ってソート(1と10とかのソートをちゃんとしてくれる)

記事の並びをタイトル順にしたいときは以下のようにします。

$args = array(
'post_type'      => 'hogehoge',
'orderby'        => 'title',
'order'          => 'DESC'
);
query_posts( $args );

このとき、「タイトルで並び替えた後に日付順で並び替えたい」という時はこんな感じにスペース区切りで複数指定すればOKです。

$args = array(
'post_type'      => 'hogehoge',
'orderby'        => 'title date',
'order'          => 'DESC'
);
query_posts( $args );

さらにカスタムフィールドの値でもソート可能です。meta_keyでカスタムフィールドを指定し、orderbyでmeta_valueを選択します。
以下の例だと、カスタムフィールド「地域」の値でソートを行います。

$args = array(
'post_type'      => 'hogehoge',
'meta_key'       => '地域',
'orderby'        => 'meta_value',
'order'          => 'DESC'
);
query_posts( $args );

複数のカスタムフィールドでソート

ここで記事タイトルにもある、複数のカスタムフィールドでのソート方法。
特定のWordPressで上記のことを実現する必要が出てきたので調べてみましたが、
query_postsでは複数のカスタムフィールドでソートする方法はないようです。

途方にくれてたところWordPressにはadd filterというDBや出力前に関数をフックする機能があり、
さらにプラグイン API/フィルターフック一覧にSQLクエリのORDER BYやJOINにフックさせるAPIが用意されておりこの機能を使って実現する事が出来ました。

たとえば「国」というカスタムフィールドの値でソートした後に、「町」というカスタムフィールドでソートしたい場合。

function.phpにて以下のような関数を作成します。
これは単純に動作させたいSQL文を作っているだけです。

//function.php
function custom_posts_join( $join, $query ) {
global $wpdb;
$join .= " INNER JOIN $wpdb-&gt;postmeta AS m1 ON m1.post_id = $wpdb-&gt;posts.ID AND m1.meta_key = '国'";
$join .= " INNER JOIN $wpdb-&gt;postmeta AS m2 ON m2.post_id = $wpdb-&gt;posts.ID AND m2.meta_key = '町'";
return $join;
}
function custom_posts_orderby( $orderby, $query ) {
$orderby = 'm1.meta_value ASC, m2.meta_value ASC';
return $orderby;
}

実際のテンプレート内では以下のように使用します。
add_filterやremove_filterの第一引数はフィルターフックの指定で、第二引数が上記で作成した関数を指定します。
第三引数はプライオリティで第四引数は関数が受け取る引数の数となります。

//template
add_filter( 'posts_join', 'custom_posts_join', 10, 2 );
add_filter( 'posts_orderby','custom_posts_orderby', 10, 2 );
$args = array(
'post_type'      => 'hogehoge',
);
query_posts( $args );
if(have_posts()): while(have_posts()): the_post();
~
HTMLをかいて出力させる
~
endwhile; endif;
remove_filter( 'posts_join', 'custom_posts_join', 10, 2 );
remove_filter( 'posts_orderby','custom_posts_orderby', 10, 2 );

結構実現まで時間がかかりました・・・。

© SEEDS Co.,Ltd.