web-dev-qa-db-fra.com

Trier WP_User_Query par la valeur meta_key avec pre_user_query

J'essaie de commander mes utilisateurs par leur numéro de membre - qui est une méta-valeur personnalisée. Il semble que je ne puisse pas facilement commander avec un meta_value. J'ai lu quelques solutions de contournement, mais je n'arrive pas à comprendre. C'est mon code jusqu'à présent ...

function sort_by_member_number( $vars ) {
    if ( isset( $vars->query_vars['orderby'] ) && 'member-number' == $vars->query_vars['orderby'] ) {
        $vars = array_merge(
            $vars->query_vars, array(
                'meta_key' => 'arcc_member_number'
            )
        );
    }
    return $vars;
}
add_filter( 'pre_user_query', 'sort_by_member_number' );

arcc_member_number est une valeur numérique - comment puis-je l'étendre pour trier par cette valeur?

1
deadlyhifi

Comme écrit, il est peu probable que cela fasse quoi que ce soit. Si vous ajoutez quelques var_dump comme ceci:

function sort_by_member_number( $vars ) {
  var_dump($vars);
  if ( isset( $vars->query_vars['orderby'] ) && 'member-number' == $vars->query_vars['orderby'] ) {
      $vars = array_merge(
          $vars->query_vars, array(
              'meta_key' => 'arcc_member_number'
          )
      );
  }
  var_dump($vars);
  return $vars;
}
add_filter( 'pre_user_query', 'sort_by_member_number' );

Vous remarquerez que rien n'a changé avant et après votre code, et vous ne trouverez nulle part votre valeur arrc_member_number. Et, si vous regardez les données vidées, vous remarquerez que la requête a déjà été construite (exemple de requête uniquement):

["query_fields"]=>
  string(30) "SQL_CALC_FOUND_ROWS wp_users.*"
["query_from"]=>
  string(13) "FROM wp_users"
["query_where"]=>
  string(9) "WHERE 1=1"
["query_orderby"]=>
  string(28) "ORDER BY user_registered ASC"
["query_limit"]=>
  NULL

Et si vous recherchez dans la source le lieu où la requête est exécutée, ce sont les propriétés utilisées.

En d'autres termes, pre_user_query ne fonctionne pas comme pre_get_posts. Vous devrez en fait analyser ces valeurs query_*, ce qui peut être délicat et vous obliger à maîtriser le langage SQL. Si vous pouvez écrire votre requête d'utilisateur pour être quelque chose comme ça ...

$user_query = new WP_User_Query( 
  array ( 
    'orderby' => 'arcc_member_number',
    'meta_query' => array(
        array(
            'key'     => 'arcc_member_number',
            'compare' => 'EXISTS'
        ),
    )
  ) 
);

... cela vous aidera à démarrer, mais vous devez toujours modifier query_orderby car il existe des limites codées en dur pour ce que vous pouvez commander.

function sort_by_member_number( $vars ) {
  if ( isset( $vars->query_vars['orderby'] ) && 'arcc_member_number' == $vars->query_vars['orderby'] ) {
    $vars->query_orderby = 'ORDER BY arcc_member_number ASC';
  }
  return $vars;
}
add_filter( 'pre_user_query', 'sort_by_member_number' );

Vous ne pouvez qu'obtenir que les utilisateurs quiont/ le arcc_member_number meta_key avec cela. Si vous avez besoin de tous les utilisateurs, il vous suffit de trier les requêtes en fonction de cette clé.

1
s_ha_dum