So erhalten Sie benutzerdefinierte Post-Meta mithilfe der REST-API

9

Ich versuche, eine REST-API für meine WordPress-Website zu erstellen, die für die Auflistung von Einrichtungen mithilfe des WordPress-Jobmanager-Plugins verwendet wird.

Ich habe meinen benutzerdefinierten Beitrag Taxonomien in \ plugins \ rest-api \ plugin.php registriert.

Die folgende API gibt mir alle Einträge mit Standardantwort.

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

Ich wollte Post-Meta in die JSON-Antwort mit dem folgenden Code einfügen.

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

Mit dem obigen Code kann ich "Telefon" als REST-Antwort hinzufügen, aber ich erhalte immer die Antwort "Telefon = falsch". Es werden nicht die korrekten Daten aus der Tabelle wp_postmeta angezeigt.

Ich bin den unten genannten Links als Referenz gefolgt.

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

Details einstecken. 1. WP Job Manager 2. Rest-API

Jede Hilfe wird wirklich hilfreich sein.

Hari Soni
quelle
wo siehst du das "falsche"? Haben Sie mit den Netzwerk-Tools des Browsers überprüft, was tatsächlich auf dem "Kabel" läuft?
Mark Kaplun
Hallo, ich bekomme JSON als Antwort.
Hari Soni
Ich benutze Chrome Plugin Postman, um den Dienst zu treffen. Ich verwende keine Authentifizierung. Es ist eine einfache API-Anfrage ohne Daten im Anfragetext.
Hari Soni
Woher wissen Sie dann, dass Sie tatsächlich den richtigen Beitrag auslösen? Kommst du überhaupt zu diesem Rückruf?
Mark Kaplun
Ich bin neu in PHP und WordPress. Ich arbeite seit langer Zeit mit JAVA. Könnten Sie mir bitte mitteilen, wie ich überprüfen kann, ob meine Funktion aufgerufen wird oder nicht? Ich habe versucht, das Post-Objekt zu drucken, konnte aber den Wert nicht sehen.
Hari Soni

Antworten:

5

$postIn der Rückruffunktion ist ein Array kein Objekt. Sie können also nicht verwenden $post->id. Ändern Sie es in $post['id']und es sollte funktionieren:

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

Ich empfehle, _phonezu phone_numberoder etwas anderem ohne Unterstrich zu wechseln . Weil _oft mit privaten Metaschlüsseln verwendet wird. Versuchen Sie, ein benutzerdefiniertes Feld mit einem Metaschlüssel mit _Präfix direkt zu Ihrem Beitrag hinzuzufügen. Sie werden sehen, was ich gemeint habe.

MinhTri
quelle
16

Die WP-API verfügt über einen rest_prepare_postFilter (oder rest_prepare_CPTwenn Sie mit benutzerdefinierten Posts arbeiten), mit dem Sie die JSON-Antwort ändern können. In deinem Fall wird es sein 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 );

Mit demselben Filter können Sie auch Felder / Daten aus der Antwort entfernen und die Daten manipulieren.

Boris Kuzmanov
quelle
+1, da dies wahrscheinlich ein besserer Weg ist, als zu versuchen, jede Information in verschiedenen Anfragen abzurufen, wie es das OP zu tun scheint.
Mark Kaplun
Diese Lösung funktionierte perfekt für mich
Asif
2

Fügen Sie diese Methoden einfach zu function.php hinzu

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
quelle
0

Hier ist ein OOP-Beispiel:

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
quelle