WordPress REST API: Endpunkte hinzufügen

Mit der WordPress REST API kann man einige tolle Dinge anstellen. Häufig wird die REST API dafür verwendet, um mit Beiträgen oder Seiten zu arbeiten. Was macht man denn, wenn man mal eigene Dinge zur Verfügung stellen möchte, um bspw. die Anzahl der Seitenaufrufe die man in einer separaten Datenbank-Tabelle gespeichert hat, anzuzeigen? Dafür gibt es die Möglichkeit, eigene Endpunkte in der REST API hinzuzufügen.

Endpunkt anlegen

Grundsätzlich lässt sich ein Endpunkt mit wenigen Zeilen Code anlegen. Ein vollständiges Beispiel für einen Endpunkt der das aktuelle Datum ausgibt, findest du hier:

/**
 * Hiermit registrieren wir unseren Endpunkt
 * für die WordPress REST API.
 * @return void
 */
add_action('rest_api_init', function () {
    $options = [
        'methods' => 'GET',
        'callback' => 'pixelbart_heute_als_datum',
        'permission_callback' => 'pixelbart_nutzer_ist_administrator',
    ];

    // https://pixelbart.de/wp-json/pixelbart/heute/
    register_rest_route('pixelbart', '/heute/', $options);
});

/**
 * Gibt das aktuelle Datum zurück.
 * @return string
 */
function pixelbart_heute_als_datum($data)
{
    // https://pixelbart.de/wp-json/pixelbart/heute?wann=gestern
    if ('gestern' === $data['wann']) {
        return date_i18n('d.m.Y', strtotime('-1 days'));
    }

    return date_i18n('d.m.Y');
}

/**
 * Prüft ob der aktuelle Benutzer ein Administrator ist.
 * @return bool
 */
function pixelbart_nutzer_ist_administrator()
{
    // Alternativ, um jeden angemeldet Nutzer zu erlauben:
    // return '';

    if (is_user_logged_in()) {
        $user = wp_get_current_user();

        /**
         * Hier legen wir fest, dass man den Endpunkt
         * nur mit Adminrechten aufrufen kann.
         */
        if (in_array('administrator', $user->roles)) {
            return true;
        }
    }

    return false;
}Code-Sprache: PHP (php)

Wenn du jetzt deine Website folgendermaßen aufrufst, kannst du dir deinen Endpunkt und das Datum ansehen. Beachte, dass die REST API grundsätzlich JSON ausgibt. Wenn du also einen Array übergibst, wird daraus automatisch ein JSON-Object, den du dann auch in JavaScript verwenden kannst.

  • https://meine-domain.de/wp-json/pixelbart/heute/

Hier siehst du nur etwas, wenn du angemeldet bist, oder deine Authentifizierungsdaten in deinem Request hinterlegt hast. Du kannst das gut testen, in dem du den Link im privaten Fenster deines Browsers öffnest.

Anwendungspasswörter hinzufügen

Seit WordPress Version 5.6 brauchst du das Plugin Application Passwords nicht mehr, um Passwörter für deine Authentifizierung anzulegen. Außerdem ist eine Authentifizierung seit dieser Version auch Pflicht, wenn du sie nicht explizit mit dem permission_callback deaktiviert hast.

Um ein Anwendungspasswort anzulegen, musst du zuerst in deinem WordPress Admin, dein Benutzerprofil besuchen. Dort, ziemlich weit unten, findest du dann deine Anwendungspasswörter. Deine Anwendungspasswörter sind immer mit deinem Benutzerkonto verknüpft, weshalb du bei der Authentifizierung auch deinen Benutzernamen als Benutzernamen für die Authentifizierung hinterlegen musst.

Anwendungspasswort hinzufügen

Wenn du jetzt dein Anwendungspasswort gespeichert hast, können wir mit dem nächsten Schritt fortfahren.

Einen Request ausführen und den Endpunkt ansprechen

Jetzt wo wir unsere Zugangsdaten und den registrierten Endpunkt haben, können wir ihn mit einem Request aufrufen. Innerhalb von WordPress kannst du das mit wp_remote_post() oder wp_remote_get() ausführen. Hier findest du ein vollständiges Beispiel für den von uns angelegten Endpunkt:

/**
 * Hier trägst du deinen Benutzernamen
 * und das Anwendungspasswort ein.
 */
$username = 'dein_benutzername';
$password = 'dein_anwendungspasswort';

/**
 * Hier legen wir die Header für den Request fest
 * und setzen unsere Authentifizierung.
 */
$headers = [
    'Authorization' => 'Basic ' . base64_encode($username . ':' . $password),
    'cache-control' => 'no-cache',
];

/**
 * Hier legen wir die Argumente für unseren Request fest.
 * Für unser Beispiel reichen eigentlich die $headers.
 */
$args = [
    'headers' => $headers,
    'body' => [], // URL-Parameter
    'method' => 'GET',
    'timeout' => 45,
    'redirection' => 5,
    'httpversion' => '1.0',
    'blocking' => true,
    'cookies' => [],
];

/**
 * Hier legen wir die URL für unseren Request fest.
 */
$url = 'https://pixelbart.de/wp-json/pixelbart/heute/';

/**
 * Unser eigentlicher Request. Du kannst eins von beiden verwenden.
 * Da wird die Methode für den Request in unseren Argumenten
 * festgelegt haben, ist es egal was du nimmst.
 */
$response = wp_remote_post($url, $args);
$response = wp_remote_get($url, $args);

/**
 * Gibt bei einem Fehler die Fehlermeldung zurück, oder
 * bei Erfolg unser Datum.
 */
if (is_wp_error($response)) {
    print_r($response->get_error_message());
} else {
    echo wp_remote_retrieve_body($response);
}Code-Sprache: PHP (php)

Du kannst den Request auch mit anderen Techniken ausführen und erhältst immer das gleiche Ergebnis. So kannst du auch Daten in deinen Apps oder Anwendungen abrufen, die eigentlich in WordPress gespeichert werden.


Wenn du wissen möchtest, wie man einen Beitrag mit der WordPress REST API veröffentlicht, solltest du hier vorbeischauen:

In der WordPress Dokumentation auf WordPress.org findest du noch weitere Optionen und Einstellmöglichkeiten für deine Endpunkte. Sieh am besten dort nach, wenn du noch weiter ins Detail gehen möchtest.