在管理员中加载外部脚本,但仅适用于特定的帖子类型?
-
16-10-2019 - |
题
因此,我继续遇到这个问题,我只是寻找解决此问题的最佳,最简单的解决方案。
我来利用许多不同项目中的自定义帖子类型,并使用自定义的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'));
}
}
更新
我正在回复您的更新。很遗憾 (无论出于何种原因) $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') {
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