2017-10-31 7 views
3

私はチームがorderbyの合計得点となるべきワードプレスプラグインと、テーブルの乱数に最も近い第2パラメータに取り組んでいます。WordPressの順番で合計得点と最も近い数字

したがって、類似の合計得点を持つ3つのチームがあり、実際に誰がそのラウンドで最善を尽くしたかを知る必要があります。だから、最初のラウンドみんなは、乱数、例えば:301020.

  • チームのために推測1推測:300000離れて正解から1020
  • チーム2は推測:28000離れて正解から273020
  • チーム3は推測しました:302000。正しい答えから980離れた

チーム3は正解に最も近いので、上にする必要があります。

これは私が現在持っているものです。

new WP_Query(array(
     'post_type'  => 'team', 
     'posts_per_page' => -1, 
     'order'   => 'DESC', 
     'meta_key'  => 'total_score', 
     'meta_query'  => array(
     'relation'  => 'AND', 
     array(
      'key'  => 'total_score', 
      'value'  => '0', 
      'compare' => '>', 
      'type'  => 'numeric' 
     ), 
     'entry_round' => array(
      'relation' => 'OR', 
      array(
       'key'  => 'round_entry', 
       'value'  => 301020, 
       'type'  => 'numeric', 
       'compare' => '>=' 
      ), 
      array(
       'key'  => 'round_entry', 
       'value'  => 301020, 
       'type'  => 'numeric', 
       'compare' => '<=' 
      ) 
     ), 
    ), 
     'orderby'   => array(
     'entry_round' => 'DESC' 
    ) 
    )); 
+0

現在のコード出力は何ですか?もしそうでなければ、どちらの鍵が正しい鍵かを知ることは難しいでしょう。あなたの意図した出力ははっきりしていますが、現時点で何が実際に出ていますか? – BarryMode

答えて

2

は、私はあなたが目指しているものを理解すると思うと、それだけで引数の配列を持つWP_Queryを使用してはできません。

WPでは、WP_Queryが投稿を見つけるために使用する自動生成SQLを操作するフィルタを提供しています。

これは私が信じて、動作するはずです:

$randomNumber = 301020; 
function orderby_closest($orderby) { 
    global $randomNumber; 
    return "wp_postmeta.meta_value DESC, ABS(mt1.meta_value - $randomNumber) ASC"; 
} 

add_filter("posts_orderby", "orderby_closest", 10, 1); 

$info = new WP_Query(array(
    'post_type'  => 'team', 
    'posts_per_page' => -1, 
    'meta_query'  => array(
     'relation'  => 'AND', 
     array(
      'key'  => 'total_score', 
      'value'  => '0', 
      'compare' => '>', 
      'type'  => 'numeric' 
     ), 
     array(
      'key'  => 'round_entry', 
      'compare' => 'EXISTS' 
     ), 
    ), 
)); 
remove_filter("posts_orderby", "orderby_closest"); 

print $info->request; 

私は、彼らが問題ではありませんので、私達はちょうど起こるようにそのフィールドの参加必要があります(ので、我々はそれを使用することができ、round_entry上の条件を削除しました私たちのORDER BY式)、それを実施するにはcompareに "EXISTS"を使用します。 orderorderbyが削除されました。この魔法は、orderby_closestという機能で行われます。これは、データベースに送信される前にSQLを変更したい場合などに使用される、posts_orderbyフィルタに組み込まれています。 orderby_closestの戻り値については

、それは非常に単純です:total_scoreによって 一次、そしてABSはそれがだ、我々の目的のために(基本的にsubstractionの結果から数学的な記号を除去、数値の絶対値を返します。推測と乱数との間の距離)。 mt1.meta_valueは、メタフィールドround_entryの値です(meta_queryエンティティの順序を変更する場合は、これを変更する必要があります)。乱数との差が最も小さいものを先頭にしたいので、昇順でソートします。

print $info->request

SELECT wp_posts.* FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) WHERE 1=1 AND ((wp_postmeta.meta_key = 'total_score' AND CAST(wp_postmeta.meta_value AS SIGNED) > '0') AND mt1.meta_key = 'round_entry') AND wp_posts.post_type = 'team' AND (wp_posts.post_status = 'publish') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC, ABS(mt1.meta_value - 301020) ASC 

出来上がりのEtのようなものになります生成されたSQLを、出力し、我々は幸運勝者(または受賞者を)持っています。