是否在管理员中加载外部脚本,但仅针对特定的帖子类型?

时间:2010-08-31 作者:NetConstructor.com

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

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

我本质上只是在寻找一种方法,当我在;编辑帖子;特定帖子类型的页面。

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

首先,非常感谢您。

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

我对此还有一些问题。例如

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

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

正如你所看到的,我正在尝试设置,以便我的脚本仅在我添加或编辑“post type”中的帖子时才会被调用;事件;。

我不希望脚本加载到任何其他页面上,也不希望它在post类型中的页面列表上运行;“事件”;所以我认为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我已经修改了我的功能。php文件和Mike(下面)提供的代码,但在创建新帖子或页面时,似乎仍然包含了适用的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");
    }
   }
?> 

7 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

首先,我想你are using wp_enqueue_script() to load your scripts, 正当

也就是说,如果我理解你的问题what you need is something like the following. 当然,您必须根据自己的详细信息对其进行编辑,但它提供了一般框架。

我们在勾搭admin_init 有了这个功能load_my_script() 测试全局$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\'));
  }
}
更新我正在回复你的更新。不幸的是(无论出于何种原因)$typenow 在期间没有值admin_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\') {
P.S。As for your other questions, please post them as new question on the site 让我或其他人来回答。由于我们一直在努力帮助您,请尽可能小心地为您的标题提供最好的标题,并请用良好的格式和适当的英语尽可能清晰简洁地写下您的问题。如果你这样做,这将有助于解决同样的问题,认识到你的问题与他们的需要相似,这将使我们回答你的问题更加容易。

我向你(和所有其他在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\'));
    }
  }
}

SO网友:Ashley G

我想我会在这里添加一些代码来解决我的一个相关问题。在我的例子中,我试图让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=选项,我不希望每个管理员都使用这些脚本。php页面,仅在特定页面上(我的主题选项页面)

有人知道这最好怎么做吗?

回答我自己的问题:

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

 }

SO网友:Nathaniel Schweinberg

根据Justin Tadlock的说法,您应该连接到admin\\u enqueue\\u脚本,而不是插件的wp\\u enqueue\\u脚本或仅管理脚本:

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

add_action(\'admin_enqueue_scripts\',\'load_admin_datapicker_script\');

SO网友:grappler

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

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

}
?> 

SO网友:Mark

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

SO网友:chifliiiii

What about:

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


}
SO网友:Elio

$typenow在admin\\u init期间没有值

不完全正确。它确实在Add New、taxonomy list、taxonomy edit和entry list等大多数post类型屏幕的admin\\u init上设置了一个值,但在“edit YourPostType”屏幕中没有设置。

另外,正如其他人所指出的,用于向WP Admin添加样式表和脚本的正确挂钩是admin_enqueue_scripts. 如果你用这个钩子,你不需要检查is_admin() 因为它只在WP Admin中启动,并且您可以将当前屏幕作为参数。http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

结束

相关推荐

WP-ADMIN似乎正在重定向

我的w-admin登录有一个奇怪的问题。这是从我升级到3.0以后才开始的,当我转到wp admin时,登录表单显示正常,但当我输入用户名并通过时,每次都会再次显示登录表单。使用密码恢复功能会导致电子邮件未找到错误。我知道用户名密码和电子邮件是正确的,b/c我可以访问mysql数据库,我可以看到值(至少用户名和电子邮件) 有人知道会出什么问题吗