WordPressで質問です。

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

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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/10/21 17:34:51
  • 終了:2011/10/28 17:35:02

回答(1件)

id:rouge_2008 No.1

rouge_2008回答回数593ベストアンサー獲得回数3502011/10/22 03:41:17

ポイント100pt

「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";

id:rouge_2008

カテゴリ名が必要な場合のSQL文を追記しました。

2011/10/22 12:03:54
id: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";

2011/10/23 07:33:25

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません