kulturbanause Blog

Responsive Design, WordPress, Konzeption, HTML, CSS, JS & UX/UI …

WordPress REST-API – Schnittstelle deaktivieren, anpassen und individualisieren

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.

Workshops & Schulungen von kulturbanause

Intensive Trainings mit hohem Praxisbezug.

Online-Schulungen (remote per Video)

Inhouse-Schulungen

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.

Jetzt bist du gefragt!

Hast du Anregungen, Ergänzungen, einen Fehler gefunden oder ist dieser Beitrag nicht mehr aktuell? Dann freuen wir uns auf deinen Kommentar.

Du kannst diesen Beitrag natürlich auch weiterempfehlen. Wir sind dir für jede Unterstützung dankbar!

Unterstützung bei WordPress-Projekten

Unsere WordPress Agentur ist auf die Entwicklung maßgeschneiderter WordPress-Themes und -Websites spezialisiert. Wenn du Unterstützung bei der Planung, Gestaltung und Entwicklung eines Projekts benötigst, helfen wir gerne weiter.
WordPress-Leistungsangebot →

Das könnte dich auch interessieren

2 Kommentare

  1. Anton

    Verfasst am 26. Juli 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

    • Konstantin Hanke

      Verfasst am 27. Juli 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

Kommentar verfassen

Dieser Blog lebt vom Feedback der Besucher! Also los, mach mit!
Bitte habe Verständnis dafür, dass Kommentare die mit dem Inhalt dieses Beitrags nichts zu tun haben, gelöscht werden.