web-dev-qa-db-ja.com

カスタムフィールドでget_usersを並べ替える

私は 'label'というカスタムUSER分類法に 'sort_order'というカスタムフィールドもあります - ラベル分類法を持つユーザのリストを返し、次にこのリストをsort_orderフィールドでソートしようとしています。

これまでのところ私は.....

<?php
$users = get_users(
array(
    'meta_key' => 'sort_order',
    'fields' => 'all_with_meta'
)
);

function wpse98580_sort_order( $a, $b )
{  
    if ( $a->sort_order === $b->sort_order ) {  
    return 0;  
} elseif ( $a->sort_order > $b->sort_order ) {
    return -1;
}
return 1;  
}  
usort( $users, 'wpse98580_sort_order' );

/* Iterate over the sorted array */

foreach( $users as $user )
{
echo '<h4>' . $user_info-> user_firstname . ' ' . $user_info-> user_lastname . '</h4>';
}
?>

これはうまくいきません、 'sort_order'メタキーは実際には分類法のカスタムフィールドであるため、取得できないと考えています。通常、sort_orderにアクセスするには次のコードを使用します。

$product_terms = wp_get_object_terms($user->ID, 'label');
                    if(!empty($product_terms)){
                    if(!is_wp_error( $product_terms )){
                        foreach($product_terms as $term){

                        $t_ID = $term->term_id;
                        $label_custom_fields = get_option("taxonomy_term_$t_ID");
                        echo $label_custom_fields['sort_order'];

                        }
                        }
                    }

誰も手伝ってくれる?

3
fightstarr20

これを使用すると、sort_orderカスタムフィールドの昇順で結果を取得できます。

$users = get_users(
   array(
   'meta_key'=> 'sort_order',
   'orderby' => 'meta_value_num',
   'order'   => 'ASC'
   )
);

foreach( $users as $user )
{
   echo '<h4>' . $user_info-> user_firstname . ' ' . $user_info-> user_lastname . '</h4>';
}
3
kamleshpal

get_usersはこれをサポートしていないことに気付きました。

残念ながら、ポスト関連コンパニオンのように、orderbyパラメーターの値としてmeta_valueまたはmeta_value_numは使用されません。

しかし、meta_key sort_orderセットの値を持つものだけを取得するように指定できます。

$users = get_users(
    array(
        'meta_key' => 'sort_order',
        'fields' => 'all_with_meta'
    )
);

get_users()はユーザーオブジェクト( WP_User クラスのインスタンス)の配列を返します。
[ - 。] これらのオブジェクトのうちの1つのvar_dumpはそれを明らかにしませんが 、ユーザーのメタデータはクラスの魔法のメソッドのおかげでプロパティとしてアクセス可能です。

そのため、テストされていませんが、次のようにしてユーザーを希望どおりに並べ替える必要があります。

function wpse98580_sort_order( $a, $b )
{  
    if ( $a->sort_order === $b->sort_order ) {  
        return 0;  
    } elseif ( $a->sort_order > $b->sort_order ) {
        return -1;
    }
    return 1;  
}  
usort( $users, 'wpse98580_sort_order' );

/* Iterate over the sorted array */

参考として、 usort を参照してください。

0
Johannes Pille

これを行うべき行動があります。あまり文書化されていないようですが、 pre_user_queryはsource に現れます。

function alter_user_search($qry) {
  global $wpdb;
  $key = $qry->get('meta_key');
  if (isset($key)) {
//    $qry->query_orderby = preg_replace('/ORDER BY (.*) (ASC|DESC)/',"ORDER BY {$wpdb->usermeta}.meta_value ".$qry->get('order') ,$qry->query_orderby);
    $qry->query_orderby = preg_replace('/ORDER BY (.*) (ASC|DESC)/',"ORDER BY CAST({$wpdb->usermeta}.meta_value AS UNSIGNED) ".$qry->get('order') ,$qry->query_orderby);
  }
//   var_dump($qry); die;
}
add_action( 'pre_user_query', 'alter_user_search' );

キーが設定されていると、メタキーに対するクエリがソートされます。これはおそらく積極的すぎる可能性がありますが、条件を追加することもできます。これは私のデータベースの値で最低限テストされていますが、うまくいくようです(かなり確実)。そのクエリには2つのバージョンがあります。二つ目はあなたのmeta_valueCASTINTEGERするので、あなたは適当な数値ソートを得るべきです。

ほとんどテストされていません。おそらくバグがあります。警告警告。返金なし。

0
s_ha_dum