Cum să obții datele meta ale unui articol personalizat folosind REST API

23 mai 2016, 05:58:16
Vizualizări: 31.5K
Voturi: 11

Încerc să creez API-uri REST pentru site-ul meu WordPress care este folosit pentru listarea facilităților folosind plugin-ul WordPress Job Manager.

Mi-am înregistrat articolul personalizat și taxonomiile în \plugins\rest-api\plugin.php.

API-ul de mai jos îmi oferă toate listările cu răspunsul implicit.

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

Am vrut să adaug meta date în răspunsul JSON folosind codul de mai jos.

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' );
    }
}

Folosind codul de mai sus pot adăuga "phone" ca răspuns REST, dar primesc întotdeauna phone = false în răspuns. Nu afișează datele corecte din tabelul wp_postmeta.

Am urmat linkurile menționate mai jos pentru referință.

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

Detalii plugin-uri: 1. WP Job Manager 2. REST API

Orice ajutor va fi foarte util.

6
Comentarii

unde vezi "false"? Ai verificat ce se întâmplă de fapt pe "fir" cu instrumentele de rețea ale browserului?

Mark Kaplun Mark Kaplun
23 mai 2016 06:32:29

Salut, primesc răspunsul în format JSON.

Hari Soni Hari Soni
23 mai 2016 06:33:31

Folosesc extensia Postman pentru Chrome pentru a accesa serviciul. Nu folosesc niciun fel de autentificare. Este o simplă cerere API fără date în corpul cererii.

Hari Soni Hari Soni
23 mai 2016 06:52:00

atunci cum știi că declanșezi postarea corectă? ajungi măcar la acel callback?.

Mark Kaplun Mark Kaplun
23 mai 2016 06:56:12

Sunt nou în PHP și WordPress. Lucrez de mult timp cu JAVA. Poți să-mi spui te rog cum pot verifica dacă funcția mea este apelată sau nu? Am încercat să afișez obiectul post dar nu reușesc să văd valoarea..

Hari Soni Hari Soni
23 mai 2016 07:38:45

primitiv, dar modul în care îmi place să fac asta, este să folosesc var_dump pe o variabilă și apoi die. Instrumente mai bune precum phpstrom probabil îți permit să setezi breakpoint-uri. poate și eclipse.

Mark Kaplun Mark Kaplun
23 mai 2016 08:27:16
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 5
2
20

API-ul WP are un filtru rest_prepare_post (sau rest_prepare_CPT dacă lucrezi cu postări personalizate) pe care îl poți folosi pentru a modifica răspunsul JSON. În cazul tău, acesta va fi 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 );

Folosind același filtru, poți elimina câmpuri/date din răspuns și poți face orice manipulare a datelor.

23 mai 2016 09:59:04
Comentarii

+1 deoarece este probabil o metodă mai bună decât încercarea de a obține fiecare informație prin cereri separate, așa cum pare să facă OP.

Mark Kaplun Mark Kaplun
23 mai 2016 19:50:06

Această soluție a funcționat perfect pentru mine

Asif Asif
23 sept. 2017 21:40:17
0

$post în funcția callback este un array, nu un obiect. De aceea nu poți folosi $post->id. Schimbă-l în $post['id'] și ar trebui să funcționeze:

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

Recomand să schimbi _phone în phone_number sau altceva fără prefixul underscore. Pentru că _ este adesea folosit cu chei meta private. Încearcă să adaugi un câmp personalizat care are cheia meta cu prefixul _ direct la postarea ta și vei înțelege la ce mă refer.

23 mai 2016 09:23:39
0

Adaugă aceste metode în fișierul functions.php

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'tipul-postului', 'numele-campului-de-retur', array-de-callbackuri-si-schema() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 //obține ID-ul din array-ul obiectului post
 $post_id = $object['id'];

 //returnează metadatele postului
 return get_post_meta( $post_id );
}
14 nov. 2017 10:43:10
0

Iată un exemplu de OOP:

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'),

                //Ar trebui să ai o autorizare mai bună, altfel acest endpoint va fi expus
                'permission_callback'   => function(){return TRUE;}
            )
        );
    }

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

$MetaDetaFetcher = New MetaDataFetcher;
$MetaDetaFetcher->enableAPIroute();
3 dec. 2019 21:48:07
0

Am testat și folosit ceea ce mi se pare o metodă mai ușoară, după ce înregistrezi tipul de postare personalizată, poți înregistra și metadatele personalizate și să le faci disponibile în API-ul REST.

Vezi register_meta()

register_post_type( 'job_listing', $args ); // în $args poți face tipul de postare disponibil în API-ul REST
register_meta(
    'post', '_phone', [
    'object_subtype' => 'job_listing',
        'show_in_rest' => true
    ]
   );
29 mai 2020 13:02:24