Zur Suche springen Zur Navigation springen Zum Hauptinhalt springen Zum Footer springen

Die REST-API von WordPress stellt die Inhalte einer Website über eine spezifische Adresse in strukturierter Form (JSON) öffentlich zur Verfügung. Mit kurzen Code-Beispielen zeigen wir euch, wie ihr die Bereitstellung der Websiteinhalte auf diesem Wege deaktivieren, nach euren Wünschen modifizieren oder vollständig individualisieren könnt.

Schulungen von kulturbanause

Intensive Trainings mit hohem Praxisbezug.

Wozu dient die WP-REST-API?

Die REST-API von WordPress ist u.a. dann hilfreich, wenn die Inhalte einer WP-Installation an eine andere Website oder Anwendung übergeben werden sollen. Bei der Umsetzung der Website für das Theater Thikwa in Berlin, haben wir beispielsweise die Möglichkeiten der WP-REST-API genutzt, um den Theater-Spielplan automatisiert an die Plattform Berlin Bühnen zu übertragen.

WP-REST-API vollständig deaktivieren

Sollen externe Zugriffe auf die Inhalte einer Website grundsätzlich nicht möglich sein, z. B. um Inhaltsdiebstahl vorzubeugen oder das Angriffsrisiko durch Verschleierung möglicher Einfallstore zu vermindern, kann die API einfach deaktiviert werden. Wenn ihr euch sicher seid, dass ihr die REST-API nicht benötigt, könnt ihr das Feature einfach mittels zweier Filter vollständig abschalten.

add_filter('rest_enabled', '_return_false');
add_filter('rest_jsonp_enabled', '_return_false');

Für aktuelle WordPress-Installationen ist dieses Vorgehen jedoch nicht immer ratsam. Der Block-Editor (Gutenberg) von WordPress ist von der Schnittstelle abhängig und benötigt deshalb unbedingt Zugriff auf diese. Ohne die REST-API funktioniert der WordPress-Editor nicht mehr. Aus diesem Grund solltet ihr sicher stellen, dass die API im Redaktionsbereich funktioniert und nur für externe Besucher im Frontend deaktiviert ist. Dafür könnt ihr diesen Filter verwenden:

add_filter('rest_authentication_errors', function($result) {
  if (!is_user_logged_in()) {
    return new WP_Error('rest_API_cannot_access', array( 'status' => rest_authorization_required_code()));
    return $result;
  }
});

Einzelne Endpoints deaktivieren

Standardmäßig werden alle Inhalte einer WordPress-Standard-Installation in der API verfügbar gemacht. In manchen Fällen ist es sinnvoll, nicht die ganze API von WordPress zu deaktivieren, sondern nur einzelne Endpunkte. So kann man zum Beispiel die Inhalte von Posts, Pages und Comments in der API belassen, aber, etwa in in Hinblick auf Sicherheit der Website, die Infos zu den Website-Einstellungen sowie allen registrierten Benutzer aus dieser entfernen. Das funktioniert über den Filter rest_endpoints.

Das folgende Beispiel deaktiviert die API-Endpunkte für Benutzernamen und Einstellungen. Diese Informationen sind folglich nicht mehr in der API zu finden.

add_filter('rest_endpoints', function ($endpoints) {
  $endpoints_to_remove = array(
    'users',
    'settings'
  );

  foreach ($endpoints_to_remove as $endpoint) {
    $base_endpoint = "/wp/v2/{$endpoint}";
    foreach ($endpoints as $maybe_endpoint => $object) {
      if (strpos($maybe_endpoint, $base_endpoint) !== false) {
        unset($endpoints[$maybe_endpoint]);
      }
    }
  }

  return $endpoints;
});

URL-Prefix ändern

Ein weitere Möglichkeit, die API den eigenen Bedürfnissen anzupassen, ist die Änderung des Standard-Präfixes wp-json in einen beliebigen Präfix. Das ermöglicht die Individualierung der API-Route und sorgt nebenbei dafür, dass die Standardroute dann keine Inhalte mehr liefert, was unerwünschte Zugriffe von außen zumindest erschwert. Über den Filter rest_url_prefix ist die Anpassung leicht gemacht.

add_filter('rest_url_prefix', function () {
  return 'data';
});

Die Standardroute für API-Anfragen wird damit von https://example.com/wp-json/wp/v2/ in https://example.com/data/wp/v2/ geändert.

Eigene Routes und Endpoints definieren

Wenn ihr andere oder anders strukturierte Informationen aus der Website über die Schnittstelle zur Verfügung stellen wollt, müssen eigene Endpoints dafür angelegt werden sowie eine Callback-Funktion, die die Daten zur Verfügung stellt. Das kann zum Beispiel notwendig sein, wenn Daten der eigenen Website in ein externes System übertragen werden sollen, dessen eigene API die Daten in einer spezifischen Struktur übermittelt bekommen möchte.

Über den oben bereits erwähnten Filter rest_endpoints fügt ihr der API eine neue Route hinzu, der dann über die Action rest_api_init ein neuer Endpunkt angehängt wird.

add_filter('rest_endpoints', function ($endpoints) {
  $custom_route = 'custom'; // allowed custom route

  foreach ($endpoints as $endpoint => $details) {
    if (!fnmatch('/' . $custom_route . '/*', $endpoint, FNM_CASEFOLD)) {
      unset($endpoints[$endpoint]);
    }
  }
  return $endpoints;
});

add_action('rest_api_init', function () {
  register_rest_route('custom', 'endpoint', array(
    'methods' => 'GET',
    'callback' => 'custom_endpoint'
  ));
});

Wenn zuvor der REST-URL-Prefix, wie oben beschrieben, in data geändert wurde, steht euch euer Endpoint nun unter https://example.com/data/custom/endpoint/ zur Verfügung. Daten sind unter der Adresse so aber noch nicht zu sehen. Dafür benötigt ihr einen Callback, der die gewünschten Informationen aus der Datenbank holt und in der gewünschten Form aus gibt.

function custom_endpoint() {
  $endpoint = new stdClass;

  $endpoint->query = new WP_Query(array(
    'post_type' => 'page',
    'posts_per_page' => -1,
    'orderby' => 'title',
    'order' => 'ASC',
  ));

  if ($endpoint->query->have_posts()) {
    while ($endpoint->query->have_posts()) {
      $endpoint->query->the_post();
      $endpoint->output[] = array(
        'id' => get_the_ID(),
        'title' => get_the_title(),
        'excerpt' => get_the_excerpt(),
        'url' => get_the_permalink()
      );
    }
  }

  return rest_ensure_response($endpoint->output);
}

In dem Beispiel werden alle Pages aus der Datenbank abgefragt und deren ID, Titel, Auszug sowie URL in einem verschachtelten Array hinterlegt. Mit der Funktion rest_ensure_response() werden die Informationen in dem Array dann in JSON gewandelt. In dieser Form stehen die Daten dann am zuvor definierten Endpunkt https://example.com/data/custom/endpoint/ zur Verfügung.

Auf diese Weise kann die API-Antwort beliebig angepasst werden und bietet vielfältige Möglichkeiten bei der Bereitstellung von öffentlichen Daten einer WordPress-Instanz.

Alle in diesem Beitrag verwendeten Code-Beispiele müssen in die functions.php-Datei eures Themes integriert oder in Plugins auslagert werden.

Geschrieben von Konstantin Hanke

thumb

Konstantin arbeitet als Webentwickler bei kulturbanause®. Seine Aufgabe ist die technische Umsetzung von klaren, soliden und effizienten Webauftritten und Website-Komponenten. Darüber hinaus kümmert er sich um die Wartung, Optimierung und Weiterentwicklung von bestehenden Websites. Sein besonderes Interesse gilt der Idee von freier Software.

Feedback & Ergänzungen – 2 Kommentare

  1. Anton
    schrieb am 26.07.2020 um 10:12 Uhr:

    Hallo,
    danke für den Artikel. Ich bin noch neu bei WordPress, deshalb folgende Frage: In welcher wp Datei kann ich denn die oben genannten Funktionen implementieren?
    Viele Grüße

    Antworten
    • Konstantin Hanke (Autor)
      schrieb am 27.07.2020 um 15:51 Uhr:

      Hallo Anton, du kannst die Code-Beispiele in die functions.php-Datei deines Themes integrieren oder in Plugins auslagern. Der Artikel wurde entsprechend ergänzt. Vielen Dank und beste Grüße

      Antworten

Kommentar zu dieser Seite

Wir freuen uns über Anregungen, Ergänzungen oder Hinweise zu Fehlern. Wir lesen jeden Eintrag, veröffentlichen aber nur, was den Inhalt sinnvoll ergänzt.

WordPress-Projekte mit kulturbanause

Wir wissen wovon wir reden. Wir setzen WordPress seit über 10 Jahren erfolgreich ein und realisieren maßgeschneiderte Websites auf Basis dieses großartigen CMS.

WordPress-Leistungsangebot →

Schulungen von kulturbanause

Wir bieten Seminare und Workshops zu den Themen Konzept, Design und Development. Immer up-to-date, praxisnah, kurzweilig und mit dem notwendigen Blick über den Tellerrand.

Übersicht Schulungsthemen →

Unsere Agentur in Berlin realisiert vom durchgestylten One-Pager bis zur funktionalen Konzern-Website Projekte mit sehr unterschiedlichem Umfang. Wir haben u.a. mit folgenden Kunden erfolgreich zusammengearbeitet: