Wie füge ich META-Felder in WordPress API Post ein?

Lesezeit: 5 Minuten

Benutzeravatar von Peter Foti
Peter Foti

Ich verwende WordPress Version 5.2.1, was bedeutet, dass ich kein Plugin für die WP-API verwende. Ich habe funktionierenden Code, der einen neuen Beitrag (unter Verwendung eines benutzerdefinierten Beitragstyps) auf meiner WP-Site erstellt, alles gut dort. Das Problem ist, dass ich benutzerdefinierte Felder mit ACF erstellt habe, aber sie erscheinen nicht im neu erstellten Beitrag. Das Folgende ist ein Beispiel dafür, was ich an WP sende über: /wp-json/wp/v2/experience.

Notiz: experience ist mein benutzerdefinierter Beitragstyp.

{'title': 'test', 'content': 'testing from python', 'status': 'draft', 'author': 1, 'meta': {'location': 'NYC', 'date': 'never', 'event_url': 'http://google.com'}, 'featured_media': 1221}

Dies erstellt einen Beitrag, aber die Felder innerhalb von meta werden komplett ignoriert. Mein Ziel ist es, die Felder zu haben, die ich in angegeben habe meta in meinen neu erstellten Beitrag aufgenommen werden.

Ich habe die unter den folgenden URLs aufgeführten Lösungen ausprobiert und nichts hat funktioniert.

https://gist.github.com/rileypaulsen/9b4505cdd0ac88d5ef51

WordPress Rest API – Benutzerdefinierte Felder

https://jeffreyeverhart.com/2017/06/14/adding-custom-fields-wordpress-json-api/

Was vermisse ich?

  • Haben Sie gesehen, dass die Felder im Dashboard ignoriert wurden (ACF zeigt keine benutzerdefinierten Felder an), oder haben Sie auch die wp_postmeta-Tabelle überprüft? Es kann sein, dass ACF Probleme hat, es anzuzeigen, anstatt dass die WP-API die Metawerte speichert.

    – Siavas

    8. Juni 2019 um 0:43 Uhr


Benutzeravatar von Sagar Bahadur Tamang
Sagar Bahadur Tamang

Zunächst müssen Sie die einstellen 'show_in_rest' Eigentum zu true und ‘supports‘ Eigenschaft sollte enthalten 'custom-fields' wenn Sie einen neuen Beitragstyp registrieren. Sie müssen „benutzerdefinierte Felder“ unterstützen, wenn Sie die Metafelder einschließen möchten.

Beachten Sie, dass für Metafelder, die in benutzerdefinierten Beitragstypen registriert sind, der Beitragstyp benutzerdefinierte Felder unterstützen muss. Andernfalls werden die Metafelder nicht in der REST-API angezeigt. https://developer.wordpress.org/rest-api/extending-the-rest-api/modifying-responses/

function cptui_register_my_cpts() {

    /**
     * Post Type: Experiences.
     */

    $labels = array(
        "name" => __( "Experiences", "twentynineteen" ),
        "singular_name" => __( "Experience", "twentynineteen" ),
    );

    $args = array(
        "label" => __( "Experiences", "twentynineteen" ),
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "publicly_queryable" => true,
        "show_ui" => true,
        "delete_with_user" => false,
        "show_in_rest" => true,
        "rest_base" => "",
        "rest_controller_class" => "WP_REST_Posts_Controller",
        "has_archive" => false,
        "show_in_menu" => true,
        "show_in_nav_menus" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "experience", "with_front" => true ),
        "query_var" => true,
        "supports" => array( "title", "editor", "thumbnail", "custom-fields" ),
    );

    register_post_type( "experience", $args );
}

add_action( 'init', 'cptui_register_my_cpts' );

Jetzt müssen Sie die Metafelder mit der registrieren register_meta().

add_action( 'rest_api_init', 'register_experience_meta_fields');
function register_experience_meta_fields(){

    register_meta( 'post', 'location', array(
        'type' => 'string',
        'description' => 'event location',
        'single' => true,
        'show_in_rest' => true
    ));

    register_meta( 'post', 'date', array(
        'type' => 'string',
        'description' => 'event location',
        'single' => true,
        'show_in_rest' => true
    ));

    register_meta( 'post', 'event_url', array(
        'type' => 'string',
        'description' => 'event location',
        'single' => true,
        'show_in_rest' => true
    ));

}

Hinweis: Die Metafelder müssen eindeutig sein. Setzen Sie Ihren Feldern in ACF ein Präfix, um sie eindeutig zu machen.

JSON verwendet keine einfachen Anführungszeichen, um eine Zeichenfolge zu umschließen. Es verwendet doppelte Anführungszeichen. Sie senden ungültiges JSON.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie nun einen Erfahrungsbeitragstyp erstellen möchten. Verwenden Sie einen JSON-Linter, um Ihren JSON zu validieren. https://jsonlint.com/

Machen Sie eine POST-Anfrage an http://paathsala-plugin.test/wp-json/wp/v2/experiencemit den Feldern

{
    "title": "test",
    "content": "testingfrompython",
    "status": "draft",
    "author": 1,
    "meta": {
        "location": "NYC",
        "date": "never",
        "event_url": "http: //google.com"
    },
    "featured_media": 1221
}

Geben Sie hier die Bildbeschreibung ein

Mit WordPress können Sie keine Ressourcen direkt erstellen. Sie müssen Ihre REST-Anfrage authentifizieren. Ich verwende die Basic Auth zur Authentifizierung der WordPress REST API. Sie müssen ein Plugin installieren. Schnapp es dir hier: https://github.com/WP-API/Basic-Auth

Ich habe den folgenden Python-Code getestet.

import base64
import json
import requests;

# Data to be send
data = {
    "title": "test",
    "content": "testingfrompython",
    "status": "draft",
    "author": 1,
    "meta": {
        "location": "NYC",
        "date": "never",
        "event_url": "http: //google.com"
    },
    "featured_media": 1221
}

# I am using basic auth plugin to for WP API authenticaiton
username="admin"
password = 'blood9807'

# Encode the username and password using base64
creds = base64.b64encode(username + ':' + password)

# Create headers to be send
headers = {
    'Authorization': 'Basic ' + creds,
    'Content-type': 'application/json', 
    'Accept': 'text/plain'
}

# Convert the python dictionary to JSON
data_json = json.dumps(data)

# Create a post
r = requests.post('http://paathsala-plugin.test/wp-json/wp/v2/experience', data = data_json, headers = headers )

print(r)

  • Ich benutze CPTUI und hatte das vorher nicht supports -> custom-fields, ich habe es hinzugefügt. Nachdem ich das hinzugefügt habe, erhalte ich jedoch die folgende Fehlermeldung, wenn ich eine Anfrage mache (nachdem ich den von Ihnen geposteten Registrierungscode kopiert habe). {'code': 'rest_invalid_param', 'message': 'Invalid parameter(s): meta', 'data': {'status': 400, 'params': {'meta': 'Invalid parameter.'}}}

    – Peter Foti

    8. Juni 2019 um 20:38 Uhr

  • Betreff: Ungültiges JSON, ich verwende die Bibliothek für Python-Anforderungen, damit sie korrekt formatiert wird. Es wird anders formatiert, wenn es auf der Konsole gedruckt wird.

    – Peter Foti

    8. Juni 2019 um 20:38 Uhr

  • @PeterFoti Ich habe die Antwort mit funktionierendem Python-Code aktualisiert. Hör zu.

    – Sagar Bahadur Tamang

    9. Juni 2019 um 1:32 Uhr

  • @SagarBahadurTamang Wenn ich das mache, bekomme ich diesen Fehler: { "code": "rest_cannot_update", "message": "Sorry, you are not allowed to edit the email custom field.", "data": { "key": "email", "status": 403 } }

    – Amjad

    9. September 2020 um 17:20 Uhr


  • es war eine Rollenfrage. Der Login wurde auf einen Abonnenten gesetzt.

    – Amjad

    11. September 2020 um 11:36 Uhr

@Peter Foti können Sie die folgende Funktion ausprobieren, um Metawerte in Ihrer API hinzuzufügen.

add_post_meta( <value>, <name>, $meta_value ,true );

Als Referenz siehe dies Verknüpfung

1394720cookie-checkWie füge ich META-Felder in WordPress API Post ein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy