如何将代码隔离到POST编辑屏幕

时间:2013-02-01 作者:N2Mystic

我有一些jQuery,可以与帖子和页面编辑器屏幕上的项目进行交互。然而,该脚本也加载到其他由post驱动的管理屏幕上。php

有没有办法专门针对帖子/页面编辑器屏幕?

我当前正在使用:

global $pagenow;
if( \'post.php\' == $pagenow )
{
  //jQuery blocks go here
}
然而,由于jQuery对对象的引用只出现在post/页面编辑器屏幕上,因此我在post驱动的其他页面上得到了控制台错误。php

例如,此代码引发控制台错误“UncaughtTypeError:无法读取未定义的属性“length”:

var charactersMeta = jQuery("#excerpt").val().length;

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

使用WP\\u Screen对象来告诉您在管理中的位置。更方便。

$screen = get_current_screen();
if ( $screen->id == \'edit-post\' ) {
   // you\'re on the posts screen
}
请注意,您必须等待至少运行admin\\u head挂钩,才能确定当前屏幕,并因此初始化WP\\u screen对象。当前屏幕还没有在插件加载时设置,甚至没有在初始化时设置。

您可以使用它查看屏幕对象在管理中的各个页面上的各种属性:

add_action(\'admin_head\', \'show_screen_info_in_help_tab\');
function show_screen_info_in_help_tab() {
    $screen = get_current_screen();
    $screen->add_help_tab( array(
        \'id\'      => \'screen\',
        \'title\'   => \'Screen Info\',
        \'content\' => \'<pre>\' . var_export($screen, true) . \'</pre>\',
    ) );
}
这将在WordPress的帮助下拉列表中添加一个新的部分,将屏幕对象作为“屏幕信息”选项卡转储到其中。方便,并且可以轻松找出每个管理屏幕的唯一属性。

SO网友:Sven

有多种可能性:

1-向javascript中添加检查以验证您尝试与之交互的元素是否存在,例如:

if(jQuery(\'#excerpt\').length > 0) {
    // this won\'t throw a console error
}
2-您可以将if语句更改为$pagenow == \'post.php\' && $_GET[\'action\'] == \'edit\' 仅在post编辑屏幕上包含脚本没关系,这也针对编辑媒体屏幕。但是,您可以将其与选项1结合使用,以进一步缩小加载脚本(不必要)的页面数量。

SO网友:Max Yudin

你必须检查postpost_type:

$post = get_post($_GET[\'post\']);
$post_type = $post->post_type;

if( !empty($_GET[\'post\']) && (\'post\' == $post_type || \'page\' == $post_type) ) {
    //jQuery blocks go here
}
但使用jQuery的正确方法是将管理脚本排队:

function wpse_84138_add_script_2_post_edit() {

    global $pagenow
    // don\'t run on other pages
    if(\'post.php\' != $pagenow)
        return;

    // get current post type
    $post = get_post($_GET[\'post\']);
    $post_type = $post->post_type;

    // Edited: post types array if somebody wants to add custom post types in future
    $post_types = array{\'post\', \'page\'};

    // if is page or post
    if( !empty($_GET[\'post\']) && in_array($post_type, $post_types) ) {
        // check second parameter for right script URL
        wp_enqueue_script(
            \'my_jQuery_script\',
            get_template_directory_uri().\'/admin/js/my_jQuery_script.js\',
            array(\'jquery\')
        );
    }

}

add_action(\'admin_enqueue_scripts\', \'wpse_84138_add_script_2_post_edit\');
还有一个全球性的$typenow, 但似乎它对post.php.

Edited: post_types 已添加阵列

结束

相关推荐

无法让jQuery进入编辑后脚本

在下面的代码中,除非我硬编码了对jQuery库的引用,否则页面上的jQuery位不会工作。我尝试使用的排队方法有什么问题?在函数中。php:if(is_admin()) { /* LOAD ADMIN SCRIPTS **********************************/ require_once(TEMPLATEPATH . \'/functions_private.php\'); } 在functions\\u pr