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
}
}
Stimmt! Das mit dem Coding ist immer so eine Sache! Die meisten Sachen laden einfach zu lange und die Seite wird dadurch immer langsamer - bis die ganzen Plugins geladen sind. Schön das es noch jemanden gibt der auch daran denkt
Die Ladezeiten vom WordPress sind seit jeher so eine Sache. Danke also für diesen nützlichen Beitrag
Das stimmt. Ich habe mich schon mehrfach über die Ladezeiten geärgert und bin deshalb sehr dankbar für deinen Tipp!
wunderbare Erläuterung, genau danach habe ich gesucht!
Hallo, ich habe jetzt vor, ein kleines Formular in einem WB-Artikel einzurichten.
Da sollen 2 Werte ausgegeben werden und im gleichen Artikel wieder angezeigt werden.
Meine Versuche mit $PHP_SELF sind kläglich gescheitert.
Danke für den Lösungsansatz, der hier beschrieben wurde. Der hilft mir endlich weiter.
Das Beitrag hat mir echt sehr geholfen, vielen dank!