Request auf Ausführung im WordPress-Backend prüfen

Es ist gar nicht so einfach zu überprüfen, ob ein Request im Backend ausgeführt wurde oder nicht. Hier zeige ich eine Lösung, die ich mir dafür kürzlich zusammengebaut habe.

Das Problem mit is_admin()

Für das Plugin Lazy Loading Responsive Images muss geprüft werden, ob ein Request im Backend stattfindet, um nur das Markup von Bildern im Frontend anzupassen. Durch die Funktion is_admin() kann geprüft werden, ob ein Request an eine Backend-Datei gemacht wurde – diese Lösung wurde zunächst in dem Plugin verwendet. Dann kam allerdings heraus, dass die Prüfung auch für AJAX-Requests true zurückgibt, weil der AJAX-Request an die wp-admin/admin-ajax.php geht. Das bedeutet, wenn ein Plugin im Frontend Inhalte über AJAX nachlädt, dann wird auf diese Inhalte das Plugin nicht angewendet, da is_admin() den Wert true ergibt.

Die Lösung

Die Lösung muss also auch eine Prüfung auf AJAX-Requests enthalten. Der erste Versuch einer Funktion, die die is_admin()-Aufrufe ersetzen sollte, sah so aus (freundlicherweise gleich vom User zitrusblau bei der Problem-Meldung mitgeliefert):

<?php
function is_admin_request() {
	if ( function_exists( 'wp_doing_ajax' ) ) {
		return is_admin() && ! wp_doing_ajax();
	} else {
		return is_admin() && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX );
	}
}

Das hat für das Frontend auch funktioniert, allerdings hat derselbe User dann ein neues Problem festgestellt: Das Plugin hat nun auch die Beitragsbild-Funktion im Backend bearbeitet. Dadurch wurde ein Beitragsbild nach der Auswahl nicht direkt in der Meta-Box angezeigt, sondern erst nach Speichern des Beitrags.

Die aktuelle Lösung sieht nun so aus:

<?php
/**
 * Check if this is a request at the backend.
 *
 * @return bool true if is admin request, otherwise false.
 */
function is_admin_request() {
	/**
	 * Get current URL.
	 *
	 * @link https://wordpress.stackexchange.com/a/126534
	 */
	$current_url = home_url( add_query_arg( null, null ) );

	/**
	 * Get admin URL and referrer.
	 *
	 * @link https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/pluggable.php#L1076
	 */
	$admin_url = strtolower( admin_url() );
	$referrer  = strtolower( wp_get_referer() );

	/**
	 * Check if this is a admin request. If true, it
	 * could also be a AJAX request from the frontend.
	 */
	if ( 0 === strpos( $current_url, $admin_url ) ) {
		/**
		 * Check if the user comes from a admin page.
		 */
		if ( 0 === strpos( $referrer, $admin_url ) ) {
			return true;
		} else {
			/**
			 * Check for AJAX requests.
			 *
			 * @link https://gist.github.com/zitrusblau/58124d4b2c56d06b070573a99f33b9ed#file-lazy-load-responsive-images-php-L193
			 */
			if ( function_exists( 'wp_doing_ajax' ) ) {
				return ! wp_doing_ajax();
			} else {
				return ! ( defined( 'DOING_AJAX' ) && DOING_AJAX );
			}
		}
	} else {
		return false;
	}
}

Wer eine einfachere Lösung für das Problem hat, gerne her damit 🙂

Das könnte auch interessant sein

Schreib einen Kommentar

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