it-swarm.com.de

Es wurde versucht, benutzerdefinierte Post-Metas über die Jetpack-JSON-API abzurufen

Ich verwende das Jetpack für Wordpress, um eine JSON-API für meinen Events benutzerdefinierten Beitragstyp zu erstellen, was gut funktioniert:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100

Dieses CPT enthält jedoch auch einige Post-Meta-Felder, die von Benutzerdefinierten Meta-Boxen und Feldern für Wordpress generiert wurden. Diese Felder umfassen Dinge wie:

  • _ecmb_supporting_bands
  • _ecmb_tickets_avail
  • _ecmb_event_agelim

Und standardmäßig werden diese Felder nicht von der JSON-API zurückgegeben ... Ich habe versucht, Abfragen wie die folgenden auszuführen:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key='_ecmb_supporting_bands'

Oder ohne Anführungszeichen um den Metaschlüssel: https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=_ecmb_supporting_bands

Das funktioniert leider nicht. Weiß jemand, wie ich diese benutzerdefinierten Metafelder in meiner JSON-Antwort zurückgeben kann?

4
Jody Heavener

Aus der Dokumentation:

Gemäß den JetPack JSON API-Dokumenten :

Standardmäßig sind alle Metadatenschlüssel in der API zulässig, sofern es sich nicht um geschützte Schlüssel handelt. Jeder Metadatenschlüssel, der mit _ beginnt, ist standardmäßig geschützt. Geschützte Metadatenschlüssel können jedoch von Benutzern mit den Funktionen edit_post_meta (zum Bearbeiten und Anzeigen verwendet), add_post_meta und delete_post_meta je nach Vorgang aufgerufen und bearbeitet werden. Wir haben außerdem einen Filter "rest_api_allowed_public_metadata" hinzugefügt, mit dem Sie bestimmte Metadatenschlüssel, auf die jeder Benutzer zugreifen kann, auf eine bestimmte Whitelist setzen können, auch wenn dieser Schlüssel geschützt ist.

der rest_api_allowed_public_metadata-Filter ist also genau das, wonach Sie suchen.

Aus dem Quellcode:

Wenn Sie den Quellcode des JetPack überprüfen, finden Sie diesen Teil:

    function is_metadata_public( $key ) {
            if ( empty( $key ) )
                    return false;

            // whitelist of post types that can be accessed
            if ( in_array( $key, apply_filters( 'rest_api_allowed_public_metadata', array() ) ) )
                    return true;

            return false;
    }

in der Datei class.json-api-endpoints.php.

Sie können auch die allow_bbpress_public_metadata() -Funktion hier überprüfen, um zu sehen, wie dieser rest_api_allowed_public_metadata -Filter implementiert wird.

Beispiel:

Hier ist ein ähnliches Beispiel für Ihren Fall:

/**
 * Whitelist protected meta keys
 *
 * @param array $allowed_meta_keys 
 * @return array $allowed_meta_keys 
 */
function custom_rest_api_allowed_public_metadata( $allowed_meta_keys )
{
    // only run for REST API requests
    if ( ! defined( 'REST_API_REQUEST' ) || ! REST_API_REQUEST )
        return $allowed_meta_keys;

    $allowed_meta_keys[] = '_ecmb_supporting_bands';
    $allowed_meta_keys[] = '_ecmb_tickets_avail';
    $allowed_meta_keys[] = '_ecmb_event_agelim';

    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

mit der JSON-Ausgabe ähnlich der folgenden:

"metadata":[{"id":"196711","key":"_ecmb_event_agelim","value":"18"},
            {"id":"196709","key":"_ecmb_supporting_bands","value":"The Rolling Stones"}, 
            {"id":"196710","key":"_ecmb_tickets_avail","value":"5500"}]
3
birgire

Zusätzlich zur Antwort von @birgire kann es schwierig sein, den Filtercode irgendwo zu platzieren:

  • Wenn Sie es in die Datei "functions.php" Ihres Themes einfügen, kann ein Theme-Update Ihren Code überschreiben
  • Das Schreiben eines Plugins für das Hinzufügen eines Filters ist eine Menge Unordnung

Aus diesem Grund habe ich das folgende Plugin verwendet, mit dem Sie Ihre benutzerdefinierten Aktionen und Filter in das Wordpress-Administrationsfenster schreiben können, ohne sich Sorgen machen zu müssen, dass Sie es verlieren. http://wordpress.org/plugins/add-actions-and-filters/ .

Ich hatte das gleiche Problem wie Sie und nach dem Einfügen des Filters funktioniert es jetzt wie ein Zauber.