Displaying Posts Using a Custom Select Query
投稿記事の表示順序を自由自在に変えるテクニックです。
投稿記事はデフォルトでは、日付順に新しいものから古いものへ順に並ぶようになっていますが、例えばある特定カテゴリーの投稿記事を表示する場合は、逆に古いものから順に並ばせたいといった場合があります。
このサイトでも使っているWP-PostvVewsプラグインなども、記事の閲覧者数をカスタムフィールドに登録して大きい順に表示したりしています。
こういったテクニックについて、簡単に紹介します。
最も簡単なのは、それ用のプラグイン Custom Query String Reloaded を使うことです。これは、カスタムフィールドには対応していませんが、カテゴリー別に記事のソート順序などをかえることができるようになっています。
今回紹介する方法はより汎用性がある方法で、WordPress から SQL を発行して必要な記事を表示する方法です。MySQLの知識が必要になりますが、それを習得すれば、投稿記事をいかようにも抽出し、かつ並べ変えも可能になるでしょう。
スクリプトのコアな部分は以下のとおりです。
このケースの場合は、見て分かるように、投稿日が現時点より前、投稿タイプが’post’、公開されている、かつパスワード保護されていない投稿記事を10件、更新日の新しい順に並べ替えて配列$pageposts に取得しています。
それをsetup_postdata()で整形化しています。
<?php
$querystr = "
SELECT $wpdb->posts.*
FROM $wpdb->posts
WHERE post_date < '".current_time('mysql')."'
AND post_type = 'post'
AND post_status = 'publish'
AND post_password = ''
ORDER BY post_modified DESC LIMIT 10
";
$pageposts = $wpdb->get_results($querystr, OBJECT);
?>
<?php if ($pageposts): ?>
<?php foreach ($pageposts as $post): ?>
<?php setup_postdata($post); ?>
<div>この間にコンテント表示のスクリプトを書く</div>
<?php endforeach; ?>
<?php else : ?>
<?php endif; ?>
WordPressのデータベース構造とMySQLのSELECT文の文法について理解できれば、
$querystr を必要な条件で書き換えればOKです。
次の例は、WP-PostsViewsプラグインによるカスタムフィールドの値(閲覧数)で大きい順にソートして表示するケースです。前の例は、実はこのテクニックを使わなくてもWPの関数を使えばできるのですが、カスタムフィールドを使って投稿記事をソートするのは、この方法でしかできないと思います。
$querystr 以外のスクリプトは上の例とまったく同じです。
$querystr = "
SELECT DISTINCT $wpdb->posts.*, (meta_value+0) AS views
FROM $wpdb->posts LEFT JOIN $wpdb->postmeta ON $wpdb->postmeta.post_id = $wpdb->posts.ID
WHERE post_date < '".current_time('mysql')."'
AND post_type = 'post'
AND post_status = 'publish'
AND meta_key = 'views'
AND post_password = ''
ORDER BY views DESC LIMIT 10
";このケースを応用すれば、カテゴリーごとに閲覧数が多い順に投稿記事を表示したりすることもできますね。
参考文献はこれです。