web-dev-qa-db-fra.com

Utilisation de l'objet $ wpdb dans un widget

J'essaie de créer un widget très simple qui accède aux tables contenues dans la même instance de base de données que ma base de données Wordpress, mais ne sont pas des tables wordpress. J'utilise la classe wpdb conformément au codex . Je ne reçois aucune erreur, mais je n'obtiens également aucun résultat.

Est-ce que j'utilise l'objet de manière appropriée? Ou devrais-je lancer ma propre classe d'accès pour mes propres tables?

Voici le code du widget:

function widget ($args,$instance) 
{
        extract($args);

        global $wpdb;

        $title = $instance['title'];
        $catid = $instance['catid'];

        $current_user = wp_get_current_user();

        $sql = 'SELECT max(ID) as MaxID, status FROM Clients WHERE UserID = '.$current_user->ID;
        $clientRow = $wpdb->get_results($sql);

        $out = '<div style="text-align: center; border: solid 1px Navy; background-color: #E4E4E4">';
        $out .= '<span>Client status: '.$clientRow->status.'</span></div>';

        echo $before_widget;
        echo $before_title.$title.$after_title;
        echo $out;
        echo $after_widget;
}

Merci d'avance.

2
Honus Wagner

Si vous voulez vraiment juste une seule ligne, utilisez plutôt $wpdb->get_row($sql).

Mais votre requête a l'air drôle ... on dirait que vous essayez d'obtenir le dernier "statut du client" pour l'utilisateur, auquel cas votre requête devrait être:
'SELECT status FROM Clients WHERE UserID = '.$current_user->ID.' ORDER BY ID DESC LIMIT 1'.

Et si vous faites cela, vous pouvez même utiliser $status = $wpdb->get_var($sql);.

Enfin ... avez-vous envisagé d'utiliser add_user_meta/get_user_meta à la place? L'utilisation des tables et des fonctions natives présente de nombreux avantages, notamment le fait que les enregistrements sont nettoyés lorsque vous supprimez l'utilisateur et les likes.

1
wyrfel

$wpdb->get_results() renvoie plusieurs lignes sous la forme d'un tableau d'objets (ou d'un tableau de tableaux, selon le paramètre $output). Ce que vous voulez, c'est $wpdb->get_row() .

2
Jan Fabry

Vos résultats seront renvoyés sous la forme d'un tableau d'objets et non d'un objet singulier.

Cette ligne traite le résultat en tant qu'objet.

$clientRow->status

Quand en fait vous avez un tableau avec des objets, ceci référencerait le premier.

$clientRow[0]->status

Vous ne savez pas vraiment ce que vous attendez du résultat, alors espérons-nous que les informations ci-dessus sont suffisantes pour résoudre le problème?

Petite note, vous n'aurez peut-être pas besoin de ça ..

$current_user = wp_get_current_user();

Donner $current_user scope devrait suffire.

1
t31os