Eigener Wordpress Rest API Endpoint mit Static Class

Manchmal ist es nötig für AJAX Requests eine Custom Rest-Route zu erstellen ohne Plugin. Mit diesem Code Snippet kann man eine Route in WP registrieren und eine JSON Antwort senden. In diesem Beispiel wird eine Route als GET und als POST zur Verfügung gestellt.

Alle Daten, egal ob GET POST oder PUT etc werden im WP_REST_Request Objekt fest gehalten. Das ist wichtig. Denn $_POST & $_GET funktionieren nicht im REST-API-Endpoint!

Hinweis: Die Antwort von der Route sollte immer ein Array sein. Das Array wird durch Wordpress automatisch in ein JSON Format encoded.

<?php
namespace theme\wp_rest;
use WP_REST_Request;
 
/**=============================================
 * REST API ENDPOINT
 * =============================================
 * 
 * Eigener Rest-Endpoint damit eine komplett 
 * eigene JSON Ausgabe erzeugt werden kann
 * 
 * Dokumentation:
 * @link https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/
 */
add_action( 'rest_api_init', [ 'theme\wp_rest\RestAPIContactForm', 'register_route' ] );
final class RestAPIContactForm
{
	/*
		POST|GET /wp-json/theme/v1/contact-form
	*/
	public static $rest_namespace       = 'theme/v1';
	public static $rest_route           = 'contact-form/';
	public static $send_methods         = [ 'POST', 'GET'];
	public static $rest_callback        = [ 'theme\wp_rest\RestAPIContactForm', 'rest_response' ];
 
	private static $flush_rewrite_rules = true; // Zum Debuggen
 
 
	/**---------------------------------------------
	 * Register Rest Route
	 * ---------------------------------------------
	 * 
	 * Fügt die neue Route
	 * 
	 * @return void
	 */
	public static function register_route()
	{
		$route_args = [
			'methods'             => self::$send_methods,
			'callback'            => self::$rest_callback,
			'permission_callback' => '__return_true',
		];
		register_rest_route( self::$rest_namespace, self::$rest_route, $route_args );
 
		if( self::$flush_rewrite_rules ){ self::flush_rewrite_rules(); }
	}
 
 
	/**---------------------------------------------
	 * Render Response
	 * ---------------------------------------------
	 * 
	 * Handled den Request und gibt eine Ausgabe
	 * zurück. Ausgabe sollte ein Array sein.
	 * Das Array wird automatisch von WP in ein
	 * JSON umgewandelt.
	 * 
	 * @return void
	 */
	public static function rest_response( WP_REST_Request $request ):array
	{
		return [
			'message' => 'funktioniert',
			'request' => $request,
		];
	}
 
 
	/**---------------------------------------------
	 * Flush aller Rewrite Rules
	 * ---------------------------------------------
	 * 
	 * Sollte nur in Dev gemacht werden zum Testen.
	 * In Produktion nicht mehr ausführen.
	 * 
	 * @return void
	 */
	private static function flush_rewrite_rules()
	{
		$hard_flush = true;
		flush_rewrite_rules( $hard_flush );
	}
}