web-dev-qa-db-fra.com

Trier les get_users par champ personnalisé

J'ai une taxonomie USER personnalisée appelée 'label' qui comporte également un champ personnalisé 'sort_order'. J'essaie de renvoyer une liste d'utilisateurs qui ont la taxonomie label, puis de trier cette liste par le champ sort_order.

Jusqu'ici j'ai .....

<?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>';
}
?>

Cela ne fonctionne pas, je suppose que c'est parce que la méta-clé 'sort_order' est en fait un champ personnalisé de la taxonomie, elle ne peut donc pas la récupérer. D'habitude, j'utilise le code suivant pour accéder à 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'];

                        }
                        }
                    }

Quelqu'un peut-il aider?

3
fightstarr20

En utilisant cela, vous pouvez obtenir votre résultat en ordre croissant pour le champ personnalisé 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

Je remarque que get_users ne supporte pas cela.

Malheureusement, meta_value ou meta_value_num n'est pas pris comme valeur pour le paramètre orderby, contrairement à ses compagnons post-related.

Mais nous pouvons spécifier de ne saisir que ceux qui ont une valeur pour le méta_key sort_order set:

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

get_users() renvoie un tableau d'objets utilisateur (instances de WP_User class).
Bien que un var_dump de l'un de ces objets ne le révèle pas , les métadonnées de l'utilisateur sont accessibles en tant que propriété grâce aux méthodes magiques de la classe.

Par conséquent, même s’ils n’ont pas été testés, les éléments suivants doivent classer les utilisateurs comme vous le souhaitez:

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 */

Pour référence, voir usort .

0
Johannes Pille

Il y a une action qui devrait faire cela. Cela ne semble pas très documenté mais pre_user_query apparaît dans le code 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' );

Cela va trier la requête sur la clé méta si la clé est définie, ce qui est probablement trop agressif mais vous pouvez ajouter plus de conditions. Ceci est minimalement testé avec des valeurs dans ma base de données mais cela semble fonctionner (assez sûr). Il existe deux versions de cette requête. La seconde va CAST votre meta_value à une INTEGER et vous devriez donc avoir un tri numérique correct.

À peine testé. Peut-être un buggy. Caveat emptor . Pas de remboursement.

0
s_ha_dum