人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

WordPressで質問です。
公開日時順でソートしたデータを取ってきたいのですが
query_postsでは下記で表現が出来ました。

query_posts('&orderby=meta_value_num-Order by numeric meta value&meta_key=_edit_lock');

ただ、query_postsを使用せずに、単純なSQLでソートをかけたいのですが
その場合はどの様な記述にすれば良いでしょうか?

●質問者: makocan
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●100ポイント

「query_posts('orderby=date');」あるいは「query_posts('meta_key=_edit_lock');」とした場合と同じデータを取得したいのでしょうか?

※「query_posts('&orderby=meta_value_num-Order by numeric meta value&meta_key=_edit_lock');」は、正しくは「query_posts('orderby=meta_value_num&meta_key=_edit_lock');」ですが、ソートが日時順ではなくなってしまうので・・・

(「-Order by numeric meta value」の部分は、「orderby」に「meta_value_num」を指定した場合に何によるソートになるのかの説明です。解釈できないため指定が無効になって、デフォルトの投稿日時によるソートになっているのだと思います。)



投稿日時によりソートされたデータを取得したい場合のSQLは次のようになります。(※直接実行する場合)


SELECT * FROM (**データベーステーブルの接頭辞**)posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC

※「(**データベーステーブルの接頭辞**)」の部分は、データベースに合わせて変更してください。


以下はWPから実行する場合の記述です。

global $wpdb;

$sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC";
$results = $wpdb->get_results($sql);


カテゴリーを一緒に取得するには、SQL文を以下に替えてください。

$sql = "SELECT * FROM $wpdb->posts 
JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id 
WHERE post_type = 'post' AND post_status = 'publish' 
ORDER BY post_date DESC";


複数のカテゴリーに分類している場合は、以下のようにしてみてください。

$sql = "SELECT * , GROUP_CONCAT( term_taxonomy_id ) AS cat_ids FROM $wpdb->posts 
JOIN $wpdb->term_relationships ON $wpdb->posts.ID = $wpdb->term_relationships.object_id 
WHERE post_type = 'post' AND post_status = 'publish' 
GROUP BY ID ORDER BY post_date DESC";

※連結して「cat_ids」に入れています。(「cat_ids」は任意で変更して大丈夫です。)



【追記】


カテゴリーIDではなくカテゴリ名が必要な場合のSQL文を作ってみました。

$sql = "SELECT * FROM $wpdb->posts LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id) WHERE post_type = 'post' AND post_status = 'publish' GROUP BY ID ORDER BY post_date DESC";


1記事当りのカテゴリーが複数の場合は、以下のようになります。(※連結して「cat_name」に入れています。)

$sql = "SELECT *, GROUP_CONCAT(name) AS cat_name FROM $wpdb->posts LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id) WHERE post_type = 'post' AND post_status = 'publish' GROUP BY ID ORDER BY post_date DESC";


カテゴリーIDとカテゴリ名の両方が必要な場合は、以下のようにしてみてください。(※カテゴリーが複数の場合)

$sql = "SELECT *, GROUP_CONCAT(term_taxonomy_id) AS cat_ids, GROUP_CONCAT(name) AS cat_name FROM $wpdb->posts LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id) WHERE post_type = 'post' AND post_status = 'publish' GROUP BY ID ORDER BY post_date DESC";


rouge_2008さんのコメント
カテゴリ名が必要な場合のSQL文を追記しました。

rouge_2008さんのコメント
すみません。 追記したコードで「LEFT JOIN」になっている部分は、今回のケースではすべてただの「JOIN」で大丈夫です。(※以下だけでなく複数カテゴリの方も・・・) >|| $sql = "SELECT * FROM $wpdb->posts JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id) WHERE post_type = 'post' AND post_status = 'publish' GROUP BY ID ORDER BY post_date DESC"; ||<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ