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

我来利用许多不同项目中的自定义帖子类型,并使用自定义的metaboxes扩展了这些类型,然后我通过添加诸如jquery event日历选择器等自定义脚本进一步扩展了这些类型...所有这些都很好,除了一个关键问题外, ...我不希望这些自定义的jQuery脚本在管理员中的每个页面上加载。

从本质上讲,我只是在寻找一种方法,即将这些自定义的jQuery字段加载到“编辑帖子”页面上的特定帖子类型时。

这里最好的解决方案是什么?


更新1

首先,非常感谢。

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

尽管如此,我还有一些问题。例如...

我已经修改了脚本以调用这样的语句:

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

如您所见,我正在尝试设置内容,以便我的脚本仅在我添加或编辑“事件”帖子中的帖子时才会被调用。

我不希望该脚本在其他页面上加载,也不希望它在“事件”的帖子类型中的页面列表中运行,因此我认为如果语句正确。

然而,问题似乎是只有在我在此帖子类型中创建新帖子时才会加载脚本,但是当我编辑现有帖子时,它似乎不起作用。

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

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

<?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脚本,那么我是否会在三个单独的时间上复制代码,还是这不是这样做的好方法?例如...最好只致电:全球$ pagenow,$ typenow;在我的函数文件的顶部,或者当我复制一次以上时,它很重要或使事物复杂化?

在与同一问题有关的不同问题上...我正在使用“重力表单”插件,但我注意到他们的脚本在管理员的每个页面上都运行,这导致其他插件引起问题。我将如何修改他们的脚本以确保仅在需要时才加载脚本。


更新2

我已经用Mike提供的代码修改了我的function.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");
    }
   }
?> 
有帮助吗?

解决方案

首先,我想你 正在使用 wp_enqueue_script() 加载脚本, , 正确的?

就是说,如果我理解你的问题 您需要的是如下. 。当然,您必须为您的详细信息进行编辑,但是它为您提供了一般框架。

我们正在钩 admin_init 使用功能 load_my_script() 测试全局 $pagenow 与管理页面匹配 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答案上提出问题的人)作为换取时间努力来回答您的问题的一种忙网络上的许多其他网站。

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

其他提示

我以为我会在这里添加一些解决方案的代码。就我而言,我试图让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 = temomoptions,我不希望每个admin上的脚本.php页面,仅在该特定页面上(我的主题选项页面)

有人知道这是最好的做法吗?

并回答我自己的问题:

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

 }

根据贾斯汀·塔德洛克(Justin Tadlock),您应该将其挂入admin_enqueue_scripts,而不是插件或管理脚本的WP_ENQUEUE_SCRIPTS:

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

add_action('admin_enqueue_scripts','load_admin_datapicker_script');

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

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

}
?> 

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

关于什么:

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


}

这个

$ 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

许可以下: CC-BY-SA归因
scroll top