在Admin中加载外部脚本,但仅针对特定帖子类型加载吗?


16

因此,我继续遇到此问题,而我只是在寻找最佳和最简单的解决方案来解决此问题。

我开始在许多不同的项目中使用自定义帖子类型,并通过自定义元框扩展了它们,然后通过添加自定义脚本(如jQuery事件日历选择器)进一步扩展了这些功能。除了一个关键问题,所有这些工作都很好...我不希望这些自定义jQuery脚本加载到管理员的每个页面上。

我本质上只是在寻找一种方法来在我在“编辑帖子”页面上针对特定帖子类型加载这些自定义jquery字段时。

最好的解决方案是什么?


更新1

首先,非常感谢。

实际上,让我感到震惊的是,插件开发人员无法确保这样的事情,因为我发现这是不同插件存在问题的关键原因之一。

我对此还有其他问题。例如...

我已经修改了脚本来调用if语句,如下所示:

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

如您所见,我正在尝试进行设置,以便仅当我在“事件”的帖子类型内添加或编辑帖子时才调用脚本。

我不希望脚本在任何其他页面上加载,也不想在“事件”的帖子类型内的页面列表上运行,因此我认为if语句是正确的。

但是,问题似乎在于,仅当我在此帖子类型中创建新帖子时才加载脚本,但在编辑现有帖子时似乎无法使用。

你能测试一下,也许让我知道我做错了什么?

这是我正在使用的确切代码...也许有更好或更简单的方法可以做到这一点?

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

另外...如果我想添加三种帖子类型并为每种帖子类型加载不同的JS脚本,那么我是否将代码重复3次以上还是这样做的好方法?例如……最好打电话:global $ pagenow,$ typenow; 在我的函数文件的顶部,或者当我多次复制它时,它是否有意义或使事情复杂化?

关于与之相关的不同问题...例如,我正在利用“重力形式”插件,但我注意到他们的脚本在管理员的每个页面上运行,这导致其他插件出现问题。我将如何修改其脚本以确保仅在需要它们时才加载脚本。


更新2

我已经使用Mike(如下)提供的代码修改了functions.php文件,但是当您创建新的帖子或页面时,似乎仍包含适用的JavaScript。这意味着当您尝试通过创建新的默认wordpress帖子/页面来创建新帖子或页面时,或者在基于自定义帖子类型之一创建新帖子/页面时。Mike提议的代码可以在所有其他管理页面上使用,并且在您“编辑”现有帖子/页面或自定义帖子类型时可以使用。有任何建议的修改使这项工作正确吗?

这是我当前的代码:

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

2
@ NetConstuctor.com:别震惊,许多编写插件的人都学会了编程,因此他们可以编写插件,因此几乎没有编程背景。他们挠痒痒,没有遵循最佳做法。
MikeSchinkel 2010年

Answers:


14

首先,我假设您wp_enqueue_script()用来加载脚本的,对吗?

就是说,如果我理解您的问题,那么您需要的是类似以下内容的东西。当然,您必须对其进行详细编辑,但是它为您提供了总体框架。

我们希望admin_init通过该函数load_my_script()来测试$pagenow与admin页是否匹配的全局变量edit.php,以及$typenow用于查看帖子类型是否为所需类型的全局变量。

其余只是细节,如果您需要了解更多信息,可以在这里阅读:

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

更新

我正在回复您的更新。不幸的是(由于某种原因$typenowadmin_init此期间没有任何值,因此您需要post_type通过根据URL参数加载帖子来获取,'post'如下面的示例所示(我从示例中复制了上一行和下一行这样您就可以看到放置位置):

<?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 关于您的其他问题,请将其作为新问题发布在网站上,供我或其他人回答。由于我们一直在努力为您提供帮助,因此请务必尽最大可能为您的标题提供最好的标题,并且请使用格式和正确的英语尽可能清楚,简洁地写下您的问题。如果您这样做,将有助于解决相同的问题,将您的问题识别为与他们所需要的相似,这将使我们更容易回答您的问题。

我想向您(以及在WordPress问答中提出问题的所有其他人)求助,以换取花时间来回答您的问题,因为我和其他主持人希望使WordPress Answers成为社区的巨大资源,而不是另一个草率的论坛,就像网络上的许多其他站点一样,很难阅读也很难找到答案。

更新#2

我以为您的if语句中可能存在运算符优先级问题,但是当我在未遇到问题之前进行测试时。如果您的言行举止如此,那么您几乎可以肯定尝试这样做(对不起,我现在没有时间进行测试,以确保它可以正常工作):

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

嗨,迈克...请看下面我的评论...对不起,我在错误的框中发布了信息
NetConstructor.com 2010年

@ NetConstuctor.com:请不要在旨在回答问题的地方对您的问题进行澄清。我已将您放入答案的内容移至您的问题中,并投票关闭该答案。
MikeSchinkel 2010年

嗨,迈克...您的代码除了一个问题外,工作正常。当您在管理页面上时,可以添加新帖子或新页面(我正在谈论默认帖子/页面),JavaScript代码仅应对于自定义帖子类型,将被加载。除此问题外,它似乎运行正常,并且仅在指定的帖子类型上加载javascript。您有什么建议可以修改吗?
NetConstructor.com 2010年

抱歉,迈克-我的最初假设实际上是错误的。您提供的代码似乎还包含我所拥有的其他帖子类型上的javascript。我已经完全按照您的建议包含了脚本。您能否再评论一次?
NetConstructor.com 2010年

1
好吧...因此,在进一步研究之后,我发现Mike的代码确实可以在所有地方正常工作,除非您创建“ NEW”帖子。从我在这里看到的内容,当您为默认的wordpress页面/帖子以及您可能拥有的任何自定义帖子类型创建一个NEW PAGE,NEW POST时,会错误地包含javascript。当您编辑现有的帖子或页面(默认的wordpress帖子或页面或自定义帖子类型)时,代码正常工作(表示不包含javascript)。有人可以提供建议的修改来解决此问题吗?
NetConstructor.com 2010年

3

我以为我会在这里添加一些代码来解决我的一个相关问题。就我而言,我试图让JavaScript和CSS仅加载到Pages and Posts和(编辑和创建)上,而没有其他地方加载。

我找到了一个可行的解决方案,basename( $_SERVER[ 'SCRIPT_FILENAME' ] )用于确定我在后端的位置。不过,我担心的是,$_SERVER[ 'SCRIPT_FILENAME' ]服务器之间的可用性可能会有所不同(任何人都知道服务器$_SERVER[ 'SCRIPT_FILENAME' ]上不可用的可能性有多大?)

然后我遇到了这个问题,MikeSchinkel回答了。稍加修改,我使它对我有用,除了一件事。通过“添加新内容”创建新帖子时,无论出于何种原因,它似乎都不起作用。

经过以下调整,我确实将其投入使用,并在此与大家分享,以期帮助其他人并改善它。

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

  }
 }
}

接下来,我尝试将某些脚本限制在主题选项页中,该脚本不能基于$ pagenow来完成,因为出现的url是admin.php?page = themeoptions,并且我不希望每个admin上的脚本.php页面,仅在该特定页面上(我的主题选项页面)

有人知道如何最好地做到这一点吗?

并回答我自己的问题:

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

 }


2

我知道问题已经回答。我认为这是一个更简单的解决方案。

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

我创建了一个不使用$ typenow变量的版本:

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

全局变量不会改变,因此可以安全使用。此外,还有特定于这些页面的挂钩,因此您不需要该功能和工作量。最后但并非最不重要的一点:您正在检查非严格且非尤达风格的字符串,因此它们可能会失败。同时依托$_GET可能失败。无论如何:欢迎来到WPSE。
kaiser 2012年

1

关于什么:

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


}

0

这个

$ typenow在admin_init期间没有值

并不完全正确。在大多数帖子类型屏幕(如添加新内容,分类列表,分类编辑和条目列表)中,确实在admin_init上设置了一个值,但在“编辑YourPostType”屏幕中没有该值。

另外,正如其他人指出的那样,用于将样式表和脚本添加到WP Admin的正确钩子是admin_enqueue_scripts。如果使用此挂钩,则不需要检查,is_admin()因为它仅在WP Admin中触发,并且您可以获取当前屏幕的参数。 http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.