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