Laden externer Skripte in Admin, aber NUR für einen bestimmten Beitragstyp?

16

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");
    }
   }
?> 
NetConstructor.com
quelle
2
@ NetConstuctor.com: Seien Sie nicht schockiert, viele Leute, die Plugins schreiben, haben gelernt zu programmieren, so dass sie das Plugin schreiben können und somit nur einen sehr geringen Programmierhintergrund haben. Sie kratzen einen Juckreiz und folgen nicht den besten Praktiken.
MikeSchinkel

Antworten:

14

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_initmit der Funktion zusammen, load_my_script()um das Global $pagenowauf eine Übereinstimmung mit der Admin-Seite edit.phpund das Global $typenowzu 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:

<?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 hat ( aus welchem ​​Grund auch immer ) $typenowwährend kein Wert, admin_initso dass Sie den post_typedurch 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):

<?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: 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.

<?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'));
    }
  }
}
MikeSchinkel
quelle
hi mike ... siehe mein Kommentar unten ... sorry, ich habe in der falschen Box gepostet
NetConstructor.com
@ NetConstuctor.com : Bitte geben Sie an der für Antworten vorgesehenen Stelle keine Erläuterungen zu Ihrer Frage . Ich habe den Inhalt, den Sie in eine Antwort eingefügt haben, in Ihre Frage verschoben und stimme ab, um diese Antwort zu schließen.
MikeSchinkel
Hallo Mike ... dein Code funktioniert bis auf ein Problem einwandfrei ... Wenn du auf der Admin-Seite bist, wo du einen neuen Beitrag oder eine neue Seite hinzufügen kannst (ich spreche über den Standardbeitrag / die Standardseite), sollte der Javascript-Code nur geladen werden für den benutzerdefinierten Beitragstyp Wird geladen. Abgesehen von diesem Problem scheint es einwandfrei zu funktionieren und lädt nur das Javascript für die angegebenen Beitragstypen. Haben Sie Änderungen, die Sie vorschlagen können?
NetConstructor.com
Sorry Mike - Meine ursprüngliche Annahme war tatsächlich falsch. Es scheint, dass der Code, den Sie angegeben haben, das Javascript auf anderen Beitragstypen enthält, die ich auch habe. Ich habe das Skript genau so aufgenommen, wie Sie es vorgeschlagen haben. Könnten Sie dies bitte noch einmal wiederholen?
NetConstructor.com
1
OK ... Nachdem ich das noch einmal durchgesehen habe, habe ich herausgefunden, dass Mikes Code in der Tat überall korrekt funktioniert, außer wenn Sie einen "NEUEN" Beitrag erstellen. Nach dem, was ich hier sehe, wird das Javascript fälschlicherweise beim Erstellen einer NEUEN SEITE, eines NEUEN POST für die Standard-WordPress-Seiten / -Posts sowie eines benutzerdefinierten Post-Typs, den Sie möglicherweise haben, einbezogen. Der Code funktioniert (das Javascript ist nicht enthalten), wenn Sie einen vorhandenen Beitrag oder eine Seite bearbeiten, bei der es sich entweder um einen WordPress-Standardbeitrag oder eine WordPress-Seite oder um einen benutzerdefinierten Beitragstyp handelt. Kann jemand einen Änderungsvorschlag zur Behebung dieses Problems vorlegen?
NetConstructor.com
3

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.

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 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:

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

 }
Ashley G
quelle
2

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");
    }

}
?> 
Grappler
quelle
1

Ich habe eine Version erstellt, die die Variable $ typenow 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;
}
Kennzeichen
quelle
Die Globalen ändern sich nicht, daher können sie sicher verwendet werden. Darüber hinaus gibt es spezielle Hooks für diese Seiten, sodass Sie diese Funktion und diesen Aufwand nicht benötigen. Last but not least: Sie überprüfen Strings nicht streng und auch nicht-yoda-Stil, also sie könnte scheitern. Auch das Verlassen auf $_GETnur könnte scheitern. Wie auch immer: Willkommen bei WPSE.
Kaiser
1

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' ) );


}
chifliiiii
quelle
0

Dies

$ typenow hat während admin_init keinen Wert

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_scripts

Elliot
quelle