如何仅在特定页面上包含代码?


14

我正在学习插件和简码。我注意到,当我激活插件时,其代码会加载到我的所有页面上,即使没有简码的页面也是如此。(我的意思不是内容与管理页面)。在某些内容页面上,我不使用特定的短代码,而在其他内容页面上,我不使用-但无论如何,都会加载插件的代码。如何使插件仅包含在使用简码的页面上?

更多详情:

假设我有一个制作灯箱的插件。我激活插件。在“酷图片”页面上,我使用简码制作了一个灯箱。当我在“关于”页面上选中不使用灯箱简码的查看源代码时,我看到灯箱插件的代码已加载。如果我编写插件,则页面加载速度会更快,以便其代码仅在需要的页面上加载。这可能吗?否则,我将不必要地在页面上加载大量插件的代码。有任何想法吗?


1
您是要入队,还是要在具有简码的页面上执行PHP脚本?
mor7ifer 2012年

+1 @ m0r7if3r-我也想明白,..方法会大不相同
krembo99 2012年

@ mrOr7if3r,谢谢。例如,假设我有一个Google Maps插件。是否必须在每个页面(即不使用该插件的页面)上加载该插件?假设我有一个“关于”页面,上面没有Google Maps简码。如果查看“查看源代码”,则会看到该页面上已加载了插件的代码(尽管我没有使用该事件)。插件代码是否必须在每个页面上加载?谢谢。
Laxmidi 2012年

imho带来了(新的)最佳实践的好问题,因为WP现在使我们能够在任何时间点入队脚本。
拉斐尔2012年

Answers:


9

WP v3.3使我们能够在页面中间运行wp_enqueue_script。机票9346

这使得以更好的粒度(至少在使用短代码时)包含JS变得容易得多。在这里,只有当我们的简码被触发时才会包含jquery。

function get_slideshow() {
  // Do some stuff...

  // Load up scripts right from within our shortcode function (requires WP 3.3+)
  wp_enqueue_script( 'jquery', array(), null, true  ); 

  return;
}
add_shortcode( 'cool_slideshow', 'get_slideshow' );

1
imo,这就是应该怎么做。
拉斐尔2012年

1
太好了,我没有意识到现在可以在页面中间运行wp_enqueue_script了。仅在需要时才加载脚本/ css的更简洁的方法!
里克·柯伦

2

检查管理界面变量

一个菜单项是一种特殊情况:注释,因为它们是使用add_WHATEVER_(submenu)page()API 注册的。

// All need to be stated as beeing global
global $pagenow, $typenow, $hook_suffix, $parent_file, $submenu_file, $post_type_object;
if ( 'THE-OUTPUT.php' === $WHATEVER_YOU_CHOOSE_TO_CHECK )
    // do stuff

这些是非连续的,并已硬编码到wp核心中。请注意,并非所有页面都设置完整。

挂钩到特定于页面的管理UI挂钩

然后还有特殊的,特定于页面的挂钩,您可以在admin-footer.php和中查看它们admin-header.php

// Examples:
// Header
"admin_head-$hook_suffix"
"admin_print_styles-$hook_suffix"
"admin_print_scripts-$hook_suffix"
// Footer
"admin_footer-$hook_suffix"

现实世界中的一些示例:Post Screen

// Examples how the result looks like
admin_print_styles-post.php
admin_print_styles-post-new.php

然后还有$hook_suffix一个您可以检查的队列脚本,就在您钩住操作时:

do_action( 'admin_enqueue_scripts', $hook_suffix );

更新资料

为了更轻松地(一按)访问此数据/信息,我们构建了一个免费的,对开发人员友好的名为“(WCM)Current Admin Info”的插件,该插件可在GitHub上获得。该插件也可以在不久的将来在官方的wp.org资源库中找到

屏幕截图

预览此插件的效果:

屏幕

钩子

全球


0

可以做一些事情(在header.php中):

<?php
        if ( have_posts() && ( is_page() || is_single() ) ) {
            $content = get_the_content(the_post());
            if ( stripos( $content , '[your-shortcode') ) { function_for_scripts(); } 
        }   
?>

检查当前负载是页面还是帖子,然后获取内容并搜索您的简码。找到它后,它将执行您的功能。


感谢您的留言。我尝试使用您的解决方案,但不幸的是,我无法使它正常工作。
Laxmidi 2012年

是否已添加到标题?
Noel Tock 2012年


0

最简单的方法是只检查简码。

function your_scripts()
{ 
    global $post;
    wp_register_script('your-script',$the_path_to_your_script,'0.1',true);
    if ( strstr( $post->post_content, '[your-shortcode' ) ) 
    {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'your_scripts');


0

@kaiser get_shortcode_regex()在该线程中多次提到,我只是想举一个关于如何使用它的示例。该代码几乎取自get_shortcode_regex()WordPress代码参考页面。

function enqueue_script_if_shortcode_is_detected() {
    global $post;

    wp_register_script( 'your-script', $the_path_to_your_script, '1.0', true );

    $pattern = get_shortcode_regex();

    if (   preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
        && array_key_exists( 2, $matches )
        && in_array( 'your-shortcode', $matches[2] )
    ) {
        wp_enqueue_script('your-script');
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_script_if_shortcode_is_detected' );

-3

我找到了这个解决方案

add_action( 'wp_print_scripts', 'my_deregister_javascript', 100 );

function my_deregister_javascript() {
    wp_deregister_script( 'my_scripts_handle' );
}

3
但是您的解决方案将删除所有页面中的脚本
Mamaduka'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.