Seiten-Erkennung im WordPress-Backend

Beim Arbeiten mit WordPress und Plugins ist es wichtig, dass man Inhalte nur lädt, wenn sie benötigt werden. Am Beispiel der Custom Post Types möchte ich zeigen, wie man über Variablen von WP dafür sorgt, dass nur inkludiert wird, wenn man sich auf den entsprechenden Seiten des Backend von WP befindet.

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 7 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

Wer Erweiterungen für WordPress schreibt und auf sauberes Coding achtet, dem ist unter anderem wichtig, dass Scripte, Stylesheets und anderes nur dann geladen wird, wenn man es benötigt. Nicht immer gibt es dafür einen Hook und WordPress stellt einige Variablen bereit, um zu erkennen, wo man sich innerhalb das Backends befindet. Auf Basis dieser Variablen habe ich einige kleine Code-Schnipsel zusammen getragen, die ich dafür nutze und die erst ab WordPress Version 3.0 genutzt werden sollten. Im Vorfeld wurde in WordPress mehr über die Variable $pagenow gearbeitet, die aber seit der Umstellung auf die Post Typen weniger zielführend ist. Die aufgezeigten Möglichkeiten sind insbesondere dann interessant, wenn man mit Custom Post Types arbeitet. Aber auch die Seiten- und Artikel-Seiten des Backend lassen schön darüber abfragen.

Im ersten Beispiel wird die Variable $post_type genutzt, die ausgelesen wird. Diese kann auch genutzt werden, wenn man mit Custom Post Types arbeitet und die zugehörigen Scripte nur dann laden, wenn diese Variable den richtigen Wert zurück gibt.


$post_type = 'my_example_post_type';
if ( get_query_var('post_type') === $post_type ) {
	// tue was, wenn wahr
}

Im weiteren ein etwas komplexeres Beispiel, wo ich mehrer Auswahlmöglichkeiten anbiete und damit abgleiche. Die Scripte werden nur geladen, wenn der Wert von $pagehook in $pages und $post_type korrekt sind.


/**
 * Include my scripts
 *
 * $pagehook for check, if this the right page
 * $post_type for check, if this the right post type
 */
function fb_post_type_script($pagehook) {
	global $post_type;
	
	$pages = array( 'edit.php', 'post.php', 'post-new.php' );
	if ( in_array( $pagehook, $pages ) && $post_type == 'my_post_type' ) {
		wp_enqueue_script( 'my_script_example_key', plugins_url( 'js/my_example_script.js', __FILE__ ), array( 'jquery', 'my_other_example_script_key' ), '1.0.0' );
	}
}
add_action( 'admin_enqueue_scripts', 'fb_post_type_script' );

Als Alternative kann man auch eine eigene Funktion im Plugin erstellen, die sich um das zurückgeben von Werten kümmert und so nur aufgerufen wird und der Rückgabewert dient als Prüfung für das Inkludieren auf den entsprechenden Seiten des Backends.
Die Methode get_post_type() ist Bestandteil der Klasse des Plugins und wird im Anschluss in den weiteren Methoden genutzt, ein Beispiel im Anschluss dazu.
Den Custom Post Type definiere in eingangs und frage so immer nur die Konstante FB_POST_TYPE_1 dazu ab.


/**
 * Return post type
 * 
 * @return string $post_type
 */
private function get_post_type() {
	
	if ( !function_exists('get_post_type_object') )
		return NULL;
		
	if ( isset($_GET['post']) )
		$post_id = (int) $_GET['post'];
	elseif ( isset($_POST['post_ID']) )
		$post_id = (int) $_POST['post_ID'];
	else
		$post_id = 0;
	
	$post = NULL;
	$post_type_object = NULL;
	$post_type = NULL;
	if ( $post_id ) {
		$post = get_post($post_id);
		if ( $post ) {
		$post_type_object = get_post_type_object($post->post_type);
			if ( $post_type_object ) {
				$post_type = $post->post_type;
				$current_screen->post_type = $post->post_type;
				$current_screen->id = $current_screen->post_type;
			}
		}
	} elseif ( isset($_POST['post_type']) ) {
		$post_type_object = get_post_type_object($_POST['post_type']);
		if ( $post_type_object ) {
			$post_type = $post_type_object->name;
			$current_screen->post_type = $post_type;
			$current_screen->id = $current_screen->post_type;
		}
	} elseif ( isset($_SERVER['QUERY_STRING']) ) {
		$post_type = esc_attr( $_SERVER['QUERY_STRING'] );
		$post_type = str_replace( 'post_type=', '', $post_type );
	}
	
	return $post_type;
}

public function example() {
	$post_type = $this->get_post_type();  
	
	// FB_POST_TYPE_1 is defined with my post type
	if ( FB_POST_TYPE_1 == $post_type ) {
		// tue etwas, wenn wahr
	}
}

Kommentare sind geschlossen.