Externe Skripte im Admin laden, aber NUR für einen bestimmten Posttyp?

Ich gehe also weiter auf dieses Problem ein und suche nach der besten und einfachsten Lösung, um dieses Problem zu lösen.

Ich bin gekommen, um benutzerdefinierte Post-Typen in vielen verschiedenen Projekten zu verwenden, und habe diese mit benutzerdefinierten Metaboxen erweitert, die ich dann durch das Hinzufügen von benutzerdefinierten Skripten wie jQuery-Ereigniskalender-Selektoren erweitert habe … All das funktioniert gut, abgesehen von einem Schlüsselproblem Ich möchte nicht, dass diese benutzerdefinierten jQuery-Skripts auf jeder Seite des Administrators geladen werden.

Ich bin im Wesentlichen nur auf der Suche nach einer Möglichkeit, nur diese benutzerdefinierten jquery Felder geladen zu haben, wenn ich auf der Seite “Post bearbeiten” für einen bestimmten Post-Typ bin.

Was ist die beste Lösung hier?


AKTUALISIEREN 1

Zunächst einmal vielen Dank.

Ich bin wirklich schockiert, dass Plug-in-Entwickler sich nicht um solche Dinge kümmern, denn wie ich feststelle, ist dies einer der Hauptgründe dafür, dass Probleme mit verschiedenen Plugins existieren.

Ich habe jedoch einige weitere Probleme damit. Beispielsweise…

Ich habe das Skript modifiziert, um die if-statement wie folgt aufzurufen:

if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events')

Wie Sie sehen können, versuche ich, Dinge so einzurichten, dass meine Skripte NUR aufgerufen werden, wenn ich einen Beitrag innerhalb des Post-Typs “Ereignisse” hinzufüge oder bearbeite.

Ich möchte nicht, dass das Skript auf einer anderen Seite geladen wird, und möchte auch nicht, dass es auf der Seitenliste innerhalb des Post-Typs “events” läuft, daher würde ich denken, dass die if-statement korrekt ist.

Das Problem scheint jedoch zu sein, dass das Skript nur geladen wird, wenn ich einen neuen Beitrag innerhalb dieses Post-Typs erstelle, aber es scheint nicht zu funktionieren, wenn ich einen bestehenden Beitrag bearbeite.

Könnten Sie das ausprobieren und mir vielleicht mitteilen, was ich falsch machen könnte?

Hier ist der genaue Code, den ich verwende … vielleicht gibt es einen besseren oder einfacheren Weg, dies zu tun?

 <?php // INCLUDE METABOX CUSTOM JQUERY DATEPICKER 2 add_action('admin_init','load_admin_datapicker_script'); function load_admin_datapicker_script() { global $pagenow, $typenow; if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') { $ss_url = get_bloginfo('stylesheet_directory'); wp_enqueue_script('jquery'); wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery')); wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery')); wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE); wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css"); wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css"); } } 

Außerdem … wenn ich drei Post-Typen hinzufügen und verschiedene JS-Skripte für jeden Post-Typ laden möchte, würde ich dann den Code einfach drei verschiedene Male duplizieren oder ist das kein guter Weg, dies zu tun? Zum Beispiel … wäre es besser, einfach zu rufen: global $ pagenow, $ typenow; An der Spitze meiner functionsdatei oder ist es wichtig oder kompliziert die Dinge, wenn ich es mehr als einmal dupliziere?

Auf ein anderes Problem mit dem gleichen … Ich verwende zum Beispiel das “gravity forms” -Plugin, aber ich habe bemerkt, dass ihre Skripte auf jeder Seite des Admins laufen, was Probleme mit anderen Plugins verursacht. Wie würde ich ihr Skript ändern, um sicherzustellen, dass die Skripte nur geladen werden, wenn ich sie brauche?


UPDATE 2

Ich habe meine functions.php-Datei mit dem von Mike bereitgestellten Code geändert (siehe unten), es scheint jedoch, dass das entsprechende JavaScript immer noch enthalten ist, wenn Sie einen neuen Post oder eine neue Seite erstellen. Dies bedeutet, dass Sie beim Erstellen eines neuen Posts oder einer Seite entweder einen neuen Standard-Wordpress-Post / eine neue Seite erstellen oder einen neuen Post / eine neue Seite erstellen, die auf einem Ihrer benutzerdefinierten Post-Typen basiert. Der von Mike IS vorgeschlagene Code arbeitet auf allen anderen Admin-Seiten und funktioniert, wenn Sie einen bestehenden Post / Seite oder benutzerdefinierten Post-Typ “bearbeiten”. Irgendwelche vorgeschlagenen Änderungen, um diese Arbeit richtig zu machen?

Hier ist mein aktueller Code:

 post_type; } if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') { $ss_url = get_bloginfo('stylesheet_directory'); wp_enqueue_script('jquery'); wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery')); wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery')); wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE); wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css"); wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css"); } } ?> 

Solutions Collecting From Web of "Externe Skripte im Admin laden, aber NUR für einen bestimmten Posttyp?"

Zuerst nehme ich an, dass Sie wp_enqueue_script() , um Ihre Skripte zu laden , oder?

Das heißt, wenn ich Ihre Frage verstehe, dann was Sie brauchen, ist etwas wie das Folgende . Sie müssen es natürlich für Ihre Details bearbeiten, aber es gibt Ihnen den allgemeinen Rahmen.

Wir admin_init mit der function load_my_script() um das globale $pagenow für eine Übereinstimmung mit der Admin-Seite edit.php , und das globale $typenow zu sehen, ob der Post-Typ der gewünschte ist.

Der Rest sind nur Details, über die Sie hier lesen können, wenn Sie mehr erfahren wollen:

 < ?php add_action('admin_init','load_my_script'); function load_my_script() { global $pagenow, $typenow; if ($pagenow=='edit.php' && $typenow=='my-custom-type') { $ss_url = get_bloginfo('stylesheet_directory'); wp_enqueue_script('jquery'); wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery')); } } 

AKTUALISIEREN

Ich antworte auf dein Update. Leider ( aus welchen Gründen auch immer ) $typenow hat keinen Wert während admin_init also müssen Sie den post_type indem Sie den Beitrag basierend auf dem URL-Parameter 'post' laden 'post' wie Sie im folgenden Beispiel sehen (Ich habe die Zeile kopiert Oben und unten von Ihrem Beispiel, so können Sie sehen, wo Sie es platzieren):

 < ?php global $pagenow, $typenow; if (empty($typenow) && !empty($_GET['post'])) { $post = get_post($_GET['post']); $typenow = $post->post_type; } if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events') { 

PS Wie für Ihre anderen Fragen, bitte posten Sie sie als neue Frage auf der Website für mich oder andere zu beantworten. Da wir so hart arbeiten, um Ihnen zu helfen, achten Sie bitte darauf, Ihrem Titel den bestmöglichen Titel zu geben, und bitte schreiben Sie Ihre Fragen so klar und prägnant wie möglich mit guter Formatierung und korrektem Englisch. Wenn Sie dies tun, wird es Ihnen helfen, bei den gleichen Problemen Ihre Frage als ähnlich zu erkennen, was sie brauchen, und es wird uns die Beantwortung Ihrer Fragen erleichtern.

Ich bitte dies von Ihnen ( und von allen anderen, die Fragen zu WordPress Answers stellen ) als Gegenleistung dafür, dass Sie sich die Zeit nehmen, Ihre Fragen zu beantworten, weil ich und die anderen Moderatoren WordPress Answers zu einer enormen Ressource für die Community machen wollen ein weiteres schlampiges Forum, das schwer zu lesen ist und schwer zu finden ist wie so viele andere Seiten im Internet.

UPDATE # 2

Ich dachte, Sie hätten in Ihrer if-statement möglicherweise einen Vorrang für den Operator gehabt, aber wenn ich getestet habe, bin ich nicht darauf gestoßen. Wenn es sich so verhält, wie du es sagst, dann tust du es mit ziemlicher Sicherheit (versuch, ich habe jetzt keine Zeit, dies zu testen, um sicherzustellen, dass es funktioniert):

 < ?php add_action('admin_init','load_my_script'); function load_my_script() { global $pagenow, $typenow; if (empty($typenow) && !empty($_GET['post'])) { $post = get_post($_GET['post']); $typenow = $post->post_type; } if (is_admin() && $typenow=='events') { if ($pagenow=='post-new.php' OR $pagenow=='post.php') { $ss_url = get_bloginfo('stylesheet_directory'); wp_enqueue_script('jquery'); wp_enqueue_script('my-custom-script',"{$ss_url}/js/my-custom-script.js",array('jquery')); } } } 

Ich dachte, ich würde hier einen Code hinzufügen, der ein verwandtes Problem von mir triggerse. In meinem Fall versuche ich, JavaScript und CSS nur auf Seiten und Posts zu laden und zu bearbeiten und zu erstellen und nirgendwo sonst.

Ich hatte eine praktikable Lösung gefunden mit basename( $_SERVER[ 'SCRIPT_FILENAME' ] ) um festzustellen, wo auf dem Backend ich war. Ich war jedoch besorgt, da die Verfügbarkeit von $_SERVER[ 'SCRIPT_FILENAME' ] Server zu Server variieren könnte (jeder weiß, wie wahrscheinlich es ist, dass $_SERVER[ 'SCRIPT_FILENAME' ] nicht auf einem Server verfügbar ist?)

Dann bin ich auf diese Frage gestoßen und MikeSchinkel habe geantwortet. Mit ein wenig Änderung habe ich es für mich arbeiten lassen, bis auf eine Sache. Es scheint, dass aus irgendeinem Grund, wenn ein neuer Beitrag über “Add New” erstellt wird, es nicht funktioniert.

Mit den folgenden Verbesserungen habe ich es zum Laufen gebracht und ich teile es hier in der Hoffnung, anderen zu helfen und es zu verbessern.

 add_action( 'admin_init','imp_add_admin_scripts' ); function imp_add_admin_scripts() { $urljs = get_bloginfo( 'template_directory' ).IMP_JS; $urlcss =get_bloginfo( 'template_directory' ).IMP_STYLES; // Register our scripts wp_register_script('imp_jquerytools', $urljs.'jquery/imp_tabs_jquery.tools.min.js' ); wp_register_style( 'rpanel-css', $urlcss.'impoweradmin.css' ); global $pagenow, $typenow; if ( empty( $typenow ) && !empty( $_GET['post'] ) ) { $post = get_post( $_GET['post'] ); $typenow = $post->post_type; } elseif ( empty( $typenow ) && ( $pagenow == 'post-new.php' ) ){ $typenow = 'post'; } if ( is_admin() && ( ( $typenow == 'page') || ( $typenow == 'post') ) ){ if ( $pagenow == 'post-new.php' OR $pagenow == 'post.php' ) { wp_enqueue_script( 'imp_jquerytools' ); wp_enqueue_style( 'rpanel-css' ); } } } 

Als nächstes versuche ich, einige Skripte auf meine Seite mit den Themenoptionen zu beschränken, was nicht mit $ pagenow möglich ist, da die angezeigte URL admin.php ist. Page = themeoptions und ich möchte nicht, dass die Skripte auf jedem Admin laufen .php-Seite, nur auf dieser bestimmten Seite (meine Themenoptionen-Seite)

Weiß jemand, wie das am besten gemacht werden könnte?

Und um meine eigene Frage zu beantworten:

 if( is_admin() && ( $_GET['page'] == 'themeoptions' ) ){ wp_enqueue_script( 'my-script' ); } 

Per Justin Tadlock sollten Sie in admin_enqueue_scripts im Gegensatz zu wp_enqueue_scripts für Plugins oder nur für admin-Skripte einhaken:

http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin

 add_action('admin_enqueue_scripts','load_admin_datapicker_script'); 

Ich habe eine Version erstellt, die die $ typenow-Variable nicht verwendet:

 function isPostEditPage($strCheckType="") { //This function will test for a post type and return true if it is the edit page for this type //an empty value means checking for native (original, not custom) post type $strCheckType=$strCheckType==""?"post":$strCheckType; $blnReturn=false; if(is_Admin()) { $strPage=basename($_SERVER['SCRIPT_FILENAME']); switch($strPage) { case "post.php": if(isset($_GET["post"])) { $intPostID=$_GET["post"]; $strThisPostType=get_post_type($intPostID); if($strCheckType==$strThisPostType) { $blnReturn=true; } } break; case "post-new.php": $strThisPostType="post"; if(isset($_GET["post_type"])) { $strThisPostType=$_GET["post_type"]; } if($strCheckType==$strThisPostType) { $blnReturn=true; } break; } } return $blnReturn; } 

Wie wäre es mit:

 add_action( 'admin_init', 'scripts_admin' ); function scripts_admin($hook){ global $typenow; if (empty($typenow) && !empty($_GET['post'])) { $post = get_post($_GET['post']); $typenow = $post->post_type; } if( 'post.php' != $hook && 'CUSTOMPOSTTYPE' != $typenow) return; wp_enqueue_script( 'google-api','http://maps.googleapis.com/maps/api/js?key=AIzaSyCD5TwT3vXLfYEv9WD-kOcEg7YQLcncsls&sensor=true', array( 'jquery' ) ); } 

Ich weiß, dass die Frage beantwortet wurde. Ich denke, das ist eine einfachere Lösung.

 < ?php add_action( 'admin_enqueue_scripts', 'load_admin_datapicker_script' ); function load_admin_datapicker_script() { $current_screen = get_current_screen(); if ( $current_screen->post_type === 'events' ) { $ss_url = get_bloginfo('stylesheet_directory'); wp_enqueue_script('jquery'); wp_enqueue_script('custom_js_jquery_ui',"{$ss_url}/admin-metabox/js/jquery-ui-1.7.1.custom.min.js",array('jquery')); wp_enqueue_script('custom_js_daterangepicker',"{$ss_url}/admin-metabox/js/daterangepicker.jQuery.js",array('jquery')); wp_enqueue_script('custom_js_custom',"{$ss_url}/admin-metabox/js/custom.js",array('jquery'),NULL,TRUE); wp_enqueue_style('custom_css_daterangepicker',"{$ss_url}/admin-metabox/css/ui.daterangepicker.css"); wp_enqueue_style('custom_css_jquery_ui',"{$ss_url}/admin-metabox/css/redmond/jquery-ui-1.7.1.custom.css"); } } ?> 

Dies

$ typenow hat während admin_init keinen Wert

ist nicht ganz richtig. Es hat einen Wert auf admin_init in den meisten Post-Typ-Bildschirme wie Add New, Taxonomie-Liste, Taxonomie bearbeiten und Eintragsliste, aber es hat keinen auf dem Bildschirm “YourPostType bearbeiten”.

Wie bereits erwähnt, ist der korrekte Hook zum Hinzufügen von Stylesheets und Skripts zu WP Admin admin_enqueue_scripts . Wenn Sie diesen Hook verwenden, müssen Sie is_admin() nicht überprüfen, da er nur in WP Admin ausgetriggers wird und Sie als Parameter den aktuellen Bildschirm erhalten. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts