Je crée une application mobile avec Phonegap et j'utilise Wordpress comme backend. J'utilise Advanced Custom Fields avec un champ de publication Google Maps qui renvoie un objet PHP à l'application à l'aide de l'API JSON. Mon backend Wordpress envoie un objet JSON normal à l'application, mais à l'intérieur de cet objet se trouve un objet PHP stringifié.

J'ai besoin de convertir l'objet PHP en un objet JSON en quelque sorte du côté client (l'application qui n'est pas dans Wordpress). J'ai regardé d'autres réponses qui disent d'utiliser json_encode pour cela, mais mon problème est que l'application est juste HTML / Javascript et pas PHP. Existe-t-il un moyen d'utiliser du code PHP au milieu d'une fonction Javascript pour ce faire? Ou serait-il préférable de changer le backend pour qu'il retourne un objet JSON au lieu d'un objet PHP en premier lieu? Si oui, comment dois-je procéder?

Mon expérience en PHP est encore quelque peu limitée, donc toute aide est appréciée.

Edit: Pour clarifier un peu plus, j'utilise Wordpress sur un domaine distinct de mon application Phonegap et j'utilise uniquement le plugin API JSON à la fin de Wordpress. J'utilise ensuite des appels jQuery Ajax pour récupérer des données à partir du backend Wordpress.

De plus, l'objet PHP retourné ressemble à ceci: a:3:{s:7:\"address\";s:48:\"8915 W 159th St, Orland Hills, IL, United States\";s:3:\"lat\";s:17:\"41.60111599999999\";s:3:\"lng\";s:11:\"-87.8364575\";}

Une autre façon à laquelle je viens de penser aussi, serait-il possible de le laisser simplement comme un objet PHP et de toujours en lire les valeurs? Je N'AI PAS BESOIN que ce soit un tableau JSON, j'ai juste besoin d'un moyen de lire les éléments individuels du tableau d'une manière ou d'une autre.

Voici également un petit extrait du JSON retourné pour clarifier ce dont je parle.

"custom_fields": { "location": [ "a:3:{s:7:\"address\";s:48:\"8915 W 159th St, Orland Hills, IL, United States\";s:3:\"lat\";s:17:\"41.60111599999999\";s:3:\"lng\";s:11:\"-87.8364575\";}" ] }

Bien sûr, ce n'est pas tout l'objet JSON, mais cela vous donne une idée de ce que je traite.

1
chrispytoes 7 mars 2016 à 01:51

3 réponses

Meilleure réponse

Je sais que vous avez une solution qui fonctionne sur le front-end, mais je pense toujours qu'il serait préférable de résoudre ce problème sur le serveur.

Sur la base de notre conversation dans les commentaires, j'ai examiné de plus près le code dans le forum WordPress. Le problème semble être que le champ location est un tableau de chaînes, pas seulement une chaîne. maybe_unserialize (et is_serialized, qu'il utilise) ne gère pas les tableaux. Voici le code mis à jour, que vous devriez pouvoir insérer dans le functions.php de votre thème. J'ai fait un test rapide, et cela fonctionne pour moi.

class unserialize_php_arrays_before_sending_json {
    function __construct() {
        add_action( 'json_api_import_wp_post',
            array( $this, 'json_api_import_wp_post' ),
            10,
            2 );
    }

    function json_api_import_wp_post( $JSON_API_Post, $wp_post ) {
        foreach ( $JSON_API_Post->custom_fields as $key => $custom_field ) {
            if (is_array($custom_field)) {
                $unserialized_array = array();
                foreach($custom_field as $field_key => $field_value) {
                    $unserialized_array[$field_key] = maybe_unserialize( $field_value );
                }
                $JSON_API_Post->custom_fields->$key = $unserialized_array;
            }
            else {
                $JSON_API_Post->custom_fields->$key = maybe_unserialize( $custom_field );
            }
        }
    }
}

new unserialize_php_arrays_before_sending_json();
1
Hobo 7 mars 2016 à 02:51

J'ai besoin de convertir l'objet PHP en un objet JSON en quelque sorte du côté client (l'application qui n'est pas dans Wordpress).

Ce morceau ici me laisse confus. Vous n'avez pas d'objets PHP côté client, PHP est une technologie back-end. Ce qui est retourné au client est une chaîne qui peut être HTML, XML, JSON, texte en clair sur toute autre forme d'encodage.

Cela dit, en disant que vous avez un objet $obj en PHP, vous pouvez le transmettre à votre application frontale en créant un point de terminaison retrieve_object.php et là-dedans:

echo json_encode($obj);

Tant que c'est la seule chose que vous produisez, votre application côté client peut faire une demande (par exemple: AJAX) pour récupérer object.php et obtenir l'objet json.

MAIS , ce qui est important (!) pour ce faire, vous sérialisez les propriétés des objets. Vous perdrez toute méthode d'objet PHP. Si une propriété d'objet est un objet lui-même (EG: une connexion DB), cela sera également perdu.

J'espère que cela t'aides!

0
MrD 6 mars 2016 à 23:35

Si vous utilisez une API JSON pour récupérer les données, alors pourquoi ne livrez-vous pas les données au format JSON à votre application? Sinon, vous semblez supprimer en grande partie l'intérêt d'utiliser une API en premier lieu ... Vous pouvez bien sûr analyser cette chaîne en JavaScript si vous le voulez vraiment, mais c'est une solution très moche et sujette aux erreurs.

Le plugin API JSON semble utiliser JSON:

https://wordpress.org/plugins/json-api/screenshots/

1
purpleninja 6 mars 2016 à 23:14