WordPress REST-API deaktivieren

WordPress Logo
Diese Methode ist mittlerweile nicht mehr zu empfehlen, da viele Plugins ebenfalls auf die REST-API setzen und dann teilweise nicht mehr funktionieren. Hier gehts zur neuen Methode: WordPress REST-API deaktivieren reloaded

Die WordPress REST-API ist ein spannendes Thema. Grundsätzlich soll die API eine einfach zu erweiternde Schnittstelle für die Kommunikation mit anderen Programmen bereitstellen. Mit WordPress Version 4.4 wurde die grundlegende REST-API-Infrastruktur in den WordPress-Core integriert. Die gestern veröffentlichte Version 4.7 integriert sogenannte Inhalts-Endpunkte, welche bisher nur über ein separates Plugin vorhanden waren. Durch die Endpoints können andere Programme mit WordPress interagieren und bestimmte Informationen ein- oder auslesen.

Die REST-API ist unter der URL “http://www.meine-seite.de/wp-json/” erreichbar. Das Auslesen der Artikel ist beispielsweise folgendermaßen möglich: “https://www.meine-seite.de/wp-json/wp/v2/posts”.

Wer eine Webseite mit WordPress betreibt und die REST-API nicht nutzt, möchte die API vielleicht lieber deaktivieren. Die API komplett zu deaktivieren ist keine gute Idee, da mittlerweile immer mehr Funktionen im Backend die REST-API benötigen. Allerdings lässt sich die API so umbiegen, dass sie nur von angemeldeten Benutzern verwendet werden kann. Dies ist relativ einfach möglich und erfordert nur ein paar Zeilen Code, die in der “functions.php” eures Themes bzw. Child-Themes eingefügt werden müssen.

/* ------------------------------------------------------------------------- *
* Returning an authentication error if a user who is not logged in tries to query the REST API
/* ------------------------------------------------------------------------- */
function only_allow_logged_in_rest_access( $access ) {
    if( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_API_cannot_access', 'Only authenticated users can access the REST API.', array( 'status' => rest_authorization_required_code() ) );
    }
    return $access;
}
add_filter( 'rest_authentication_errors', 'only_allow_logged_in_rest_access' );

remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
remove_action( 'template_redirect', 'rest_output_link_header', 11 );
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );

Die unteren drei Zeilen sorgen dafür, dass der Ausgangspunkt der REST-API nicht im Quellcode, Header und unter der XMLRPC-Schnittstelle publiziert wird.

In den Kommentaren wurde ich darauf hingewiesen, dass Contact Form 7 ab Version 4.8 bei deaktivierter REST-API nicht mehr richtig funktioniert. In diesem Fall kann aber auf das Plugin “Disable REST API” zurückgegriffen werden, welches das Whitelisting bestimmter Routen erlaubt. Damit können dann die für Contact Form 7 benötigten Routen erlaubt werden, während alles andere deaktiviert ist.

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

4 Antworten

  1. Chris sagt:

    Hi Tobi,

    dein Code spuckt bei mir für Zeile 6 aus:

    syntax error, unexpected ‘=’, expecting ‘)’

    Das ist die Zeile beginnend mit “return new WP_Error”.

  2. Ben Uzar sagt:

    Bei mir funktionierte anschließend das Plugin Contact Form 7 https://de.wordpress.org/plugins/contact-form-7/ nicht mehr. Das Plugin benötigt die REST-API offensichtlich. Wer Kontakt per Kontaktformular aufnehmen möchte, ist natürlich nicht eingeloggt.

    • Tobi sagt:

      Danke für die interessante Info, habe ich noch nicht gewusst. Das Problem tritt erst ab Version 4.8 des Plugins auf. Wer also bei Version 4.7 bleibt hat keine Probleme.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert