web-dev-qa-db-fra.com

Vérifiez si WP_User_Query 'include' est vide

Ceci est mon code:

$args = array (
    'order'      => 'DESC',
    'include'  => get_user_meta($author->ID, 'the_following_users', true)
);

$wp_user_query = new WP_User_Query( $args );

$users = $wp_user_query->get_results();

if ( ! empty( $users ) ) {
    foreach ( $users as $user ) {
        // Get users
    }
} else {
    echo 'Error.';
}

La méta utilisateur 'the_users' peut être vide. Si elle est vide, elle m'indique tous les utilisateurs enregistrés, sinon vide, elle imprime les utilisateurs dont j'ai besoin.

Le problème que if ( ! empty( $users ) ) { } ne lit pas si 'include' est vide ou non, je sais que je peux créer une variable et vérifier d'abord si la variable est vide ou non mais je n'ai pas besoin de cela. Je veux vérifier si 'include' est vide en utilisant '$ wp_user_query-> get_results ()'.

MODIFIER:

Comme Nicolai répond, nous pouvons remplacer true à false à partir du code get_user_meta et le problème sera résolu. Si l'inclinaison est vide, WP-User_Query renvoie une erreur false et print.

Le problème maintenant que si include n'est pas vide, le code doit fonctionner sans aucun problème mais que cela ne se produit pas, il ignore les utilisateurs qui ont stocké dans la méta utilisateur 'the_users' et n'impriment que l'utilisateur actuel.

Voici la valeur de la méta utilisateur 'the_users':

a:19:{i:0;s:2:"89";i:3;s:3:"105";i:4;s:2:"74";i:5;s:3:"111";i:6;s:3:"167";i:7;s:2:"83";i:8;s:2:"54";i:9;s:2:"87";i:10;s:2:"85";i:11;s:2:"77";i:13;s:2:"82";i:14;s:2:"60";i:15;s:3:"149";i:16;s:3:"160";i:17;s:2:"71";i:18;s:1:"3";i:19;s:1:"2";i:20;s:3:"121";i:21;s:2:"57";}

Voici comment j'ai stocké les métadonnées de l'utilisateur 'the_users':

$the_following_users = get_user_meta($the_follower, "the_following_users", true);

if(!in_array($user_follow_to, $the_following_users) && is_array($the_following_users)){
    $the_following_users[] = $user_follow_to;
} else {
    $the_following_users = array($user_follow_to);
}

update_user_meta($the_follower, "the_following_users", $the_following_users);
3
Michel

Je pense que le problème ici est que, en train de violer cette règle, vous avez créé de la confusion et des problèmes:

faire 1 chose par déclaration, 1 déclaration par ligne

Couplé à un autre problème:

Passage de tableaux aux API qui sont stockées en tant que sérialisé PHP (problème de sécurité)

Et un autre:

Toujours vérifier vos hypothèses

il ignore les utilisateurs qui ont stocké dans la méta utilisateur 'the_users' et n'impriment que l'utilisateur actuel.

Ce dernier est le tueur ici. Vous ne vérifiez jamais les valeurs d'erreur sur get_user_meta, ce qui entraîne des erreurs. Les utilisateurs ne commencent pas avec the_users méta, il faut l'ajouter.

Parcourez ce code dans votre esprit, par exemple:

$the_following_users = ''; //get_user_meta($the_follower, "the_following_users", true);

if(!in_array($user_follow_to, $the_following_users) && is_array($the_following_users)){
    $the_following_users[] = $user_follow_to;

Ici, il n'y a pas de contrôle sur $the_following_users, qui peut ne pas être du tout un tableau, mais une false ou une chaîne vide.

Alors corrigeons la sauvegarde:

$the_following_users = get_user_meta($the_follower, "the_following_users", true);
if ( empty( $the_following_users ) ) {
    $the_following_user = array();
}

Puis simplifions la partie suivante:

$the_following_users[] = $user_follow_to;

Et corrigez les économies afin qu’elles ne représentent pas un risque pour la sécurité:

$following = implode( ',', $the_following_users );
update_user_meta($the_follower, "the_following_users", $following );

Enfin, passons au frontend:

Premièrement, nous supposons que le get_user_meta fonctionne, mais nous ne vérifions jamais si cela est vrai:

$args = array (
    'order'      => 'DESC',
    'include'  => get_user_meta($author->ID, 'the_following_users', true)
);

Que se passe-t-il si l'utilisateur n'a jamais suivi quelqu'un auparavant? Et s'ils ne suivaient pas tout le monde? Cela casserait tout! Alors corrigeons cela et passons au format de liste séparé par des virgules:

$include = get_user_meta($author->ID, 'the_following_users', true);
if ( empty( $include ) ) {
    // the user follows nobody, or has not followed anybody yet!
} else {
    // turn the string into an array
    $include = explode( ',', $include );
    $args = array (
        'order'      => 'DESC',
        'include'  => $include
    );
    // etc...
}

Une note finale

Votre boucle ressemble à ceci:

foreach ( $users as $user ) {
    // Get users
}

Mais vous ne partagez jamais le code dans la boucle, ce qui pourrait expliquer pourquoi vous rencontrez des problèmes. Par exemple, the_author fait toujours référence à l'auteur du message en cours. Si vous souhaitez afficher des informations sur le $user, vous devez transmettre son ID ou utiliser les propriétés publiques, par exemple.

foreach ( $users as $user ) {
    // Get users
    echo esc_html( $user->first_name . ' ' . $user->last_name );
}
2
Tom J Nowell

Le paramètre include de WP_User_Query attend un tableau en tant qu'argument. Définissez donc le paramètre $single de get_user_meta sur false. Ou ne l'utilisez pas, car false est la valeur par défaut.

// USE
get_user_meta( $author->ID, 'the_users', false )
// OR
get_user_meta( $author->ID, 'the_users' )
4
Nicolai