Ich stoße also weiterhin auf dieses Problem und suche nach der besten und einfachsten Lösung, um dieses Problem zu lösen.
Ich bin dazu gekommen, benutzerdefinierte Beitragstypen in vielen verschiedenen Projekten zu verwenden und habe diese mit benutzerdefinierten Metaboxen erweitert, die ich dann durch Hinzufügen von benutzerdefinierten Skripten, wie z. B. jQuery-Ereigniskalender-Selektoren, erweitert habe ... Ich möchte nicht, dass diese benutzerdefinierten jQuery-Skripte auf jeder Seite im Admin geladen werden.
Im Grunde bin ich nur auf der Suche nach einer Möglichkeit, diese benutzerdefinierten JQuery-Felder zu laden, wenn ich mich auf der Seite "Beitrag bearbeiten" für einen SPEZIFISCHEN Beitragstyp befinde.
Was ist hier die beste Lösung?
UPDATE 1
Zunächst einmal vielen Dank.
Eigentlich bin ich schockiert, dass Plugin-Entwickler solche Dinge nicht sicherstellen, da dies, wie ich herausfinde, einer der Hauptgründe ist, warum es Probleme mit verschiedenen Plugins gibt.
Ich habe jedoch einige weitere Probleme damit. Beispielsweise...
Ich habe das Skript geändert, um die if-Anweisung wie folgt aufzurufen:
if (is_admin() && $pagenow=='post-new.php' OR $pagenow=='post.php' && $typenow=='events')
Wie Sie sehen, versuche ich, die Einstellungen so vorzunehmen, dass meine Skripte NUR aufgerufen werden, wenn ich einen Beitrag im Beitragstyp "Ereignisse" hinzufüge oder bearbeite.
Ich möchte nicht, dass das Skript auf einer anderen Seite geladen wird, und ich möchte auch nicht, dass es in der Liste der Seiten innerhalb des Beitragstyps "events" ausgeführt wird, daher würde ich die if-Anweisung für richtig halten.
Das Problem scheint jedoch zu sein, dass das Skript nur geladen wird, wenn ich einen neuen Beitrag innerhalb dieses Beitragstyps erstelle, aber es scheint nicht zu funktionieren, wenn ich einen vorhandenen Beitrag bearbeite.
Könnten Sie das testen und mich vielleicht wissen lassen, was ich falsch machen könnte?
Hier ist der genaue Code, den ich verwende ... gibt es vielleicht eine bessere oder einfachere Möglichkeit, 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");
}
}
Auch ... wenn ich drei Beitragstypen hinzufügen und verschiedene JS-Skripte für jeden Beitragstyp laden möchte, würde ich den Code einfach dreimal hintereinander duplizieren, oder ist dies keine gute Methode, dies zu tun? Zum Beispiel ... wäre es besser, einfach Folgendes aufzurufen: global $ pagenow, $ typenow; Oben in meiner Funktionsdatei, oder ist es wichtig oder kompliziert, wenn ich es mehr als einmal dupliziere?
Auf ein anderes Problem bezogen auf das selbe ... Ich benutze zum Beispiel das "Schwerkraftformen" -Plugin, aber ich habe bemerkt, dass ihre Skripte auf jeder Seite im Admin laufen, was Probleme mit anderen Plugins verursacht. Wie gehe ich vor, um ihr Skript zu ä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 (unten) bereitgestellten Code geändert. Es scheint jedoch, dass das entsprechende Javascript noch enthalten ist, wenn Sie einen NEUEN Beitrag oder eine NEUE Seite erstellen. Dies bedeutet, wenn Sie versuchen, einen NEUEN Beitrag oder eine NEUE Seite zu erstellen, indem Sie entweder einen neuen WordPress-Standardbeitrag / eine neue WordPress-Standardseite erstellen, oder wenn Sie einen NEUEN Beitrag / eine neue Standardseite basierend auf einem Ihrer benutzerdefinierten Beitragstypen erstellen. Der von Mike vorgeschlagene Code funktioniert auf allen anderen Admin-Seiten und auch, wenn Sie einen vorhandenen Beitrag / eine Seite oder einen benutzerdefinierten Beitragstyp "BEARBEITEN". Irgendwelche vorgeschlagenen Änderungen, um diese Arbeit korrekt zu machen?
Hier ist mein aktueller Code:
<?php
add_action('admin_init','load_admin_datapicker_script');
function load_admin_datapicker_script() {
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') {
$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");
}
}
?>
quelle
Antworten:
Erstens, ich nehme an, Sie verwenden
wp_enqueue_script()
Ihre Skripte zu laden , nicht wahr?Das heißt, wenn ich Ihre Frage verstehe , brauchen Sie etwas wie das Folgende . Sie müssen es natürlich für Ihre Details bearbeiten, aber es gibt Ihnen den allgemeinen Rahmen.
Wir arbeiten
admin_init
mit der Funktion zusammen,load_my_script()
um das Global$pagenow
auf eine Übereinstimmung mit der Admin-Seiteedit.php
und das Global$typenow
zu testen , um festzustellen , ob der Beitragstyp der von Ihnen gewünschte ist.Der Rest sind nur Details, über die Sie hier lesen können, wenn Sie mehr erfahren möchten:
AKTUALISIEREN
Ich antworte auf dein Update. Leider hat ( aus welchem Grund auch immer )
$typenow
während kein Wert,admin_init
so dass Sie denpost_type
durch Laden des Beitrags auf der Grundlage des URL-Parameters abrufen müssen,'post'
wie Sie im folgenden Beispiel sehen (ich habe die Zeile oben und die Zeile unten aus Ihrem Beispiel kopiert) so können Sie sehen, wo Sie es platzieren können):PS: Für Ihre anderen Fragen stellen Sie diese bitte als neue Frage auf der Website, damit ich oder andere sie beantworten können. Da wir so hart daran arbeiten, Ihnen zu helfen, achten Sie bitte sehr darauf, Ihren Titel so gut wie möglich zu beschreiben und Ihre Fragen so klar und prägnant wie möglich mit guter Formatierung und korrektem Englisch zu verfassen. Wenn Sie dies tun, wird es Ihnen helfen, Ihre Frage bei den gleichen Problemen als ähnlich wie das zu erkennen, was sie benötigt, und es wird uns, die Ihre Fragen beantworten, leichter fallen.
Ich bitte Sie ( und alle anderen, die Fragen zu WordPress Answers stellen ) um einen Gefallen, wenn Sie sich die Zeit nehmen, Ihre Fragen zu beantworten, weil ich und die anderen Moderatoren WordPress Answers zu einer hervorragenden Ressource für die Community machen möchten, anstatt ein weiteres schlampiges Forum, das schwer zu lesen und schwer zu beantworten ist, wie so viele andere Websites im Web.
UPDATE # 2
Ich dachte, Sie hätten möglicherweise Probleme mit der Operatorrangfolge in Ihrer if-Anweisung, aber als ich sie getestet habe, bevor ich sie nicht kennengelernt habe. Wenn es sich so verhält, wie Sie es sagen, dann versuchen Sie es mit ziemlicher Sicherheit.
quelle
Ich dachte, ich würde hier einen Code hinzufügen, der ein damit zusammenhängendes Problem von mir löst. In meinem Fall versuche ich, JavaScript und CSS nur auf Seiten und Posts zu laden und (bearbeiten und erstellen) und nirgendwo anders.
Ich hatte eine brauchbare Lösung gefunden,
basename( $_SERVER[ 'SCRIPT_FILENAME' ] )
um festzustellen, wo ich mich im Backend befand. Ich war jedoch besorgt, da die Verfügbarkeit von$_SERVER[ 'SCRIPT_FILENAME' ]
Server zu Server variieren könnte (weiß jemand, wie wahrscheinlich es ist$_SERVER[ 'SCRIPT_FILENAME' ]
, auf einem Server nicht verfügbar zu sein?)Dann bin ich auf diese Frage gestoßen und MikeSchinkel hat geantwortet. Mit ein wenig Modifikation habe ich es für mich zum Laufen gebracht, bis auf eine Sache. Es scheint, dass es aus irgendeinem Grund nicht funktioniert, wenn ein neuer Beitrag über "Neu hinzufügen" erstellt wird.
Mit den folgenden Verbesserungen habe ich es zum Laufen gebracht und teile es hier in der Hoffnung, anderen zu helfen und es zu verbessern.
Als nächstes versuche ich, einige Skripte auf die Seite mit den Theme-Optionen zu beschränken. Dies kann nicht auf der Basis von $ pagenow erfolgen, da die URL admin.php? Page = themeoptions lautet und ich nicht möchte, dass die Skripte bei jedem Administrator angezeigt werden .php Seite, nur auf dieser bestimmten Seite (meine Theme Options Seite)
Weiß jemand, wie das am besten gemacht werden könnte?
Und um meine eigene Frage zu beantworten:
quelle
Laut Justin Tadlock sollten Sie sich in admin_enqueue_scripts einbinden, im Gegensatz zu wp_enqueue_scripts für Plugins oder Skripte nur für Administratoren:
http://justintadlock.com/archives/2011/07/12/how-to-load-javascript-in-the-wordpress-admin
quelle
Ich weiß, dass die Frage beantwortet wurde. Ich denke, das ist eine einfachere Lösung.
quelle
Ich habe eine Version erstellt, die die Variable $ typenow nicht verwendet:
quelle
$_GET
nur könnte scheitern. Wie auch immer: Willkommen bei WPSE.Wie wäre es mit:
quelle
Dies
ist nicht ganz richtig. In den meisten Bildschirmen für Beitragstypen wie "Neu hinzufügen" , "Taxonomieliste", "Taxonomiebearbeitung" und "Eintragsliste" ist für "admin_init" ein Wert festgelegt , jedoch nicht im Bildschirm "Beitragstyp bearbeiten".
Wie andere bereits erwähnt haben, ist der richtige Hook zum Hinzufügen von Stylesheets und Skripten zu WP Admin
admin_enqueue_scripts
. Wenn Sie diesen Haken verwenden, brauchen Sie nicht zu überprüfen,is_admin()
da er nur in WP Admin ausgelöst wird und Sie als Parameter den aktuellen Bildschirm erhalten. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scriptsquelle