it-swarm.cn

在管理员中加载外部脚本但仅适用于特定的帖子类型?

所以我继续遇到这个问题,我只是在寻找解决这个问题的最佳和最简单的解决方案。

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

我基本上只是想找到一种方法,当我在SPECIFIC帖子类型的“编辑帖子”页面上时,加载这些自定义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脚本,那么我只是将这些代码重复上述三次,或者这不是一个好方法吗?例如......最好只调用:global $ pagenow,$ typenow;在我的函数文件的顶部,或者当我多次复制它时,它是重要的还是复杂的?

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


更新2

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

这是我目前的代码:

<?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
NetConstructor.com

首先,我假设你 正在使用wp_enqueue_script()来加载你的脚本 ,对吗?

也就是说,如果我理解你的问题那么你需要的是以下。你必须编辑它以获取你的详细信息,当然,它会为你提供一般框架。

我们使用函数load_my_script()挂钩admin_init来测试全局$pagenow以获得与管理页面edit.php的匹配,以及全局$typenow来查看帖子类型是否是您想要的。

其余的只是您可以阅读有关 here 的详细信息,如果您需要了解更多信息:

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

UPDATE

我正在回复您的更新。不幸的是(无论出于何种原因$typenowadmin_init期间没有值,所以你需要通过加载基于URL参数post_type的帖子来获取'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') {

附: 至于你的其他问题,请将它们作为新问题在网站上发布为我或其他人回答。由于我们正在努力帮助你,请小心谨慎地为你的头衔提供你可能的最佳头衔并且请尽可能清晰简洁地写出您的问题,并提供良好的格式和正确的英语。如果您这样做,它将有助于解决您的问题与他们需要的相似问题,这将使我们更容易谁在回答你的问题。

我问你这个问题(以及所有其他在WordPress问答上提问的人)作为一个帮助,以换取花时间努力回答你的问题,因为我和其他主持人想要使WordPress答案巨大社区的资源,而不是另一个草率的论坛,难以阅读,很难找到像网上许多其他网站的答案。

更新#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'));
    }
  }
}
14
MikeSchinkel

Per Justin Tadlock,你应该挂钩到admin_enqueue_scripts而不是插件或管理员脚本的wp_enqueue_scripts:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');
3
Nathaniel Schweinberg

我想我会在这里添加一些代码来解决我的相关问题。在我的情况下,我试图让JavaScript和CSS只加载页面和帖子和(编辑和创建),没有其他地方。

我找到了一个可行的解决方案,使用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,我不希望每个管理员都有脚本.php页面,仅在该特定页面上(我的主题选项页面)

任何人都知道如何最好地完成这项工作?

并回答我自己的问题:

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

 }
3
Ashley G

关于什么:

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

我创建了一个不使用$ 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;
}
1
Mark

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

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

这个

$ typenow在admin_init期间没有值

不完全正确。它确实在admin_init的 most post类型屏幕上设置了值,例如Add New,分类列表,分类编辑和条目列表,但它在“Edit YourPostType”屏幕中没有。

另外,正如其他人指出的那样,用于向WP Admin添加样式表和脚本的正确钩子是admin_enqueue_scripts。如果你使用这个钩子,你不需要检查is_admin(),因为它只在WP Admin中触发,你得到当前屏幕的参数。 http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

0
Elliot