it-swarm.com.de

Externe Skripte in Admin laden, aber NUR für einen bestimmten Beitragstyp?

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.

Ich bin im Grunde 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 bestimmten 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. Zum Beispiel...

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 Post-Typs von "events" ausgeführt wird, also würde ich denken, dass die if-Anweisung korrekt ist.

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önntest du 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, nur 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 benötige.


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 Standard-WordPress-Beitrag/eine neue Standard-WordPress-Seite erstellen, oder wenn Sie einen NEUEN Beitrag/eine neue Seite basierend auf einem Ihrer benutzerdefinierten Beitragstypen erstellen. Der von Mike IS vorgeschlagene Code funktioniert auf allen anderen Admin-Seiten und funktioniert, 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");
    }
   }
?> 
16

Erstens nehme ich an, dass Sie wp_enqueue_script() verwenden, um Ihre Skripte zu laden , richtig?

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

Wir verknüpfen admin_init mit der Funktion load_my_script(), um den globalen $pagenow auf eine Übereinstimmung mit der Administratorseite edit.php und dem globalen $typenow zu testen, um festzustellen, ob der Beitragstyp der 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) $typenow während admin_init keinen Wert, daher müssen Sie den post_type abrufen, indem Sie den Beitrag basierend auf dem URL-Parameter 'post' laden, wie Sie im folgenden Beispiel sehen (ich habe Kopieren Sie die oberste und unterste Zeile aus Ihrem Beispiel, damit Sie sehen können, wo Sie sie platzieren müssen.

<?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') {

P.S. Andere Fragen stellen Sie 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 machen und Ihre Fragen so klar und prägnant wie möglich mit guter Formatierung und korrektem Englisch zu schreiben. 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 einem enormen Problem machen möchten Ressource für die Community statt eines weiteren schlampigen Forums, 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 Operator-Rangfolge in Ihrer if-Anweisung, aber als ich das getestet habe, bin ich nicht darauf gestoßen. Wenn es sich so verhält, wie Sie es sagen, versuchen Sie es mit ziemlicher Sicherheit (Entschuldigung, ich habe momentan keine Zeit, dies zu testen, um sicherzugehen, 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'));
    }
  }
}
14
MikeSchinkel

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');

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

Dann bin ich auf diese Frage gestoßen und habe MikeSchinkel beantwortet. Mit ein wenig Modifikation habe ich es für mich zum Laufen gebracht, abgesehen von einer 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' );

 }
3
Ashley G

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


}
1
chifliiiii

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;
}
1
Mark

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

}
?> 
1
grappler

Diese

$ typenow hat während admin_init keinen Wert

ist nicht ganz richtig. Es gibt einen Wert, der in admin_init in den Bildschirmen most post type (Neu hinzufügen), Taxonomieliste, Taxonomiebearbeitung und Eintragsliste festgelegt wurde, aber keinen im Bildschirm "Edit YourPostType".

Wie andere bereits erwähnt haben, lautet der richtige Hook zum Hinzufügen von Stylesheets und Skripten 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 ausgelöst wird und Sie als Parameter den aktuellen Bildschirm erhalten. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot