Comment obtenir une méta-publication personnalisée à l'aide de l'API REST

9

J'essaie de créer une API REST pour mon site Web wordpress qui est utilisée pour la liste des installations à l'aide du plugin Wordpress Job Manager.

J'ai enregistré ma publication personnalisée, taxonomies dans \ plugins \ rest-api \ plugin.php.

ci-dessous l'API me donne toutes les listes avec une réponse par défaut.

http: // localhost / sports / wp-json / wp / v2 / joblisting /

Je voulais ajouter une méta post dans la réponse JSON en utilisant le code ci-dessous.

function slug_register_phone_number() {
            register_rest_field( 'job_listing',
                'phone',
            array(
                'get_callback' => 'slug_get_phone_number',
                'update_callback' => null,
                'schema' => null,
            )
        );
    }

    function slug_get_phone_number($post, $field_name, $request) {
        return get_post_meta($post->id, '_phone' );
    }
}

En utilisant le code ci-dessus, je peux ajouter "téléphone" comme réponse REST mais je reçois toujours phone = false en réponse. Il n'affiche pas les données correctes de la table wp_postmeta.

J'ai suivi les liens mentionnés ci-dessous pour référence.

http://v2.wp-api.org/extending/modifying/

Branchez les détails. 1. WP Job manager 2. rest-api

Toute aide sera vraiment utile.

Hari Soni
la source
où voyez-vous le "faux"? Avez-vous vérifié ce qui se passe réellement sur le «fil» avec les outils réseau du navigateur?
Mark Kaplun
Salut, je reçois en JSON comme réponse.
Hari Soni
J'utilise le plugin chrome postman pour accéder au service. Je n'utilise aucune sorte d'authentification. C'est une simple demande d'API sans aucune donnée dans le corps de la demande.
Hari Soni
alors comment savez-vous que vous déclenchez réellement le bon message? obtenez-vous même à ce rappel?.
Mark Kaplun
Je suis nouveau sur PHP et wordpress. Je travaille avec JAVA depuis longtemps. Pourriez-vous s'il vous plaît me faire savoir comment je peux vérifier si ma fonction est appelée ou non? J'ai essayé d'imprimer l'objet de publication mais je n'ai pas pu voir la valeur ..
Hari Soni

Réponses:

5

$postdans la fonction de rappel est un tableau, pas un objet. Vous ne pouvez donc pas utiliser $post->id. Changez-le en $post['id']et cela devrait fonctionner:

function slug_get_phone_number($post, $field_name, $request)
{
    return get_post_meta($post['id'], '_phone', true);
}

Je recommande de passer _phoneà phone_numberou autre chose sans préfixe de soulignement. Parce qu'il _est souvent utilisé avec des méta-clés privées. Essayez d'ajouter un champ personnalisé qui a une clé méta avec _préfixe directement à votre message, vous verrez ce que je voulais dire.

SarahCoding
la source
16

L'API WP dispose d'un rest_prepare_postfiltre (ou rest_prepare_CPTsi vous travaillez avec des publications personnalisées) que vous pouvez utiliser pour modifier la réponse JSON. Dans votre cas, ça le sera rest_prepare_joblisting.

function filter_joblisting_json( $data, $post, $context ) {
$phone = get_post_meta( $post->ID, '_phone', true );

if( $phone ) {
    $data->data['phone'] = $phone;
}

return $data;
}
add_filter( 'rest_prepare_joblisting', 'filter_joblisting_json', 10, 3 );

En utilisant le même filtre, vous pouvez également supprimer des champs / données de la réponse et effectuer toute manipulation des données.

Boris Kuzmanov
la source
+1 car c'est probablement un meilleur moyen que d'essayer d'obtenir chaque information dans des demandes différentes comme l'OP semble le faire.
Mark Kaplun
Cette solution a parfaitement fonctionné pour moi
Asif
2

Ajoutez simplement ces méthodes à function.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'name-of-post-type', 'name-of-field-to-return', array-of-callbacks-and-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //get the id of the post object array
 $post_id = $object['id'];

 //return the post meta
 return get_post_meta( $post_id );
}
Nuwan
la source
0

Voici un exemple de POO:

class MetaDataFetcher{

    public function enableAPIroute(){
        add_action ('rest_api_init', array($this, 'doRegisterRoutes'));
    }

    public function doRegisterRoutes(){
        register_rest_route(
            'yournamespace/vXX',
            'fetch-post-meta',
            array(
                'methods'               => array('GET','POST'),
                'callback'              => array($this, 'returnMetaData'),

                //You should have a better auth, or this endpoint will be exposed
                permission_callback'   => function(){return TRUE;}
        );
    }

    public function returnMetaData(){
        if (!(isset($_REQUEST['post-id']))){
            return "ERROR: No post ID";
        }
        $postID = $_REQUEST['post-id'];
        $meta = get_post_meta($postID);
        $meta = json_encode($meta);
        return $meta;
    }
}

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
John Dee
la source