web-dev-qa-db-fra.com

WP API renvoyant les résultats SQL sous forme de chaînes plutôt que de chiffres

J'ai ce code, mais ce que j'obtiens dans le navigateur, ce sont tous les champs - même ceux stockés sous les noms Int et Bool dans SQL - sous forme de chaînes.

add_action( 'rest_api_init', function () {
  register_rest_route( 'restos/v1', '/resto/(?P<qname>.*)', array(
    'methods' => 'GET',
    'callback' => 'handle_get',
    'permission_callback' => function () {
      return current_user_can( 'edit_others_posts' );
    }
  ) );
} );

function handle_get( $data ) {
    global $wpdb;
    $query = "SELECT * FROM `restaurants` WHERE `qname` = '".$data['qname']."' LIMIT 1";
    $res = $wpdb->get_results($query)[0];

    return $res;
}

J'ai essayé return json_encode($res) mais cela n'a pas aidé. Comment puis-je obtenir un objet avec des nombres et des booléens dans json.

4
Simon H

Le type de sortie de chaîne est attendu pour les résultats de la requête $wpdb, les types de données de la base de données ne sont pas mappés aux types de données PHP correspondants.

Vous devrez vous en occuper vous-même, comme:

$data = [
    'int'    => (int)    '123',
    'bool'   => (bool)   '1',
    'string' => (string) 'abc'
];

return rest_ensure_response( $data );

avec la réponse de repos:

{"int":123,"bool":true,"string":"abc"}

Voici une approche intéressante de Matthew Boynes, pour le gérer automatiquement dans wpdb avec un wrapper personnalisé.

Notez que vous pouvez utiliser wpdb::get_row pour obtenir une seule ligne.

2
birgire