仅在存在特定的简码或窗口小部件时加载脚本


17

我需要一种在加载页面/帖子内容之前对其进行过滤的方法,这样,如果存在特定的短代码,我可以将脚本添加到页眉中。经过大量搜索之后,我在http://wpengineer.com上发现了这一点

function has_my_shortcode($posts) {
    if ( empty($posts) )
        return $posts;

    $found = false;

    foreach ($posts as $post) {
        if ( stripos($post->post_content, '[my_shortcode') )
            $found = true;
            break;
        }

    if ($found){
        $urljs = get_bloginfo( 'template_directory' ).IMP_JS;

    wp_register_script('my_script', $urljs.'myscript.js' );

    wp_print_scripts('my_script');
}
    return $posts;
}
add_action('the_posts', 'has_my_shortcode');

这绝对是出色的,完全满足了我的需求。

现在,我需要进一步扩展它,并对侧边栏进行相同的操作。它可以是特定的窗口小部件类型,短代码,代码段或任何其他可以识别何时需要加载脚本的方法。

问题是在加载侧栏之前我不知道如何访问侧栏内容(所讨论的主题将具有多个侧栏)


标头中的脚本是否适合您的情况?页面末尾的脚本更易于有条件地处理,并建议您提高性能。
拉斯特

我首先在wp_footer中进行了尝试,这很好地消除了对内容进行预过滤的需要,但是尽管脚本可以很好地加载,但是它们没有用。这些脚本必须位于wp_head中才能执行所需的操作。
Ashley G

Answers:


20

您可以使用is_active_widget函数。例如:

function check_widget() {
    if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used
        wp_enqueue_script('my-script');
    }
}

add_action( 'init', 'check_widget' );

要在仅加载小部件的页面中加载脚本,您将必须在小部件类中添加is_active_widget()代码。例如,请参阅默认的最近评论小部件(wp-includes / default-widgets.php,第602行):

class WP_Widget_Recent_Comments extends WP_Widget {

    function WP_Widget_Recent_Comments() {
        $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
        $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
        $this->alt_option_name = 'widget_recent_comments';

        if ( is_active_widget(false, false, $this->id_base) )
            add_action( 'wp_head', array(&$this, 'recent_comments_style') );

        add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
        add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
    }

可以在加载小部件之前调用它吗?需要明确的是,这必须在页面加载之前进行。我的示例代码使用the_posts来过滤页面上的内容,但是没有获取侧边栏/小部件。
Ashley G

是的,请参阅我添加到答案中的示例。
sorich87

您的示例实际上不起作用。我是否缺少明显的东西?
Ashley G

其实我是。将wp_enqueue_script应用于wp_head时似乎不起作用,但是wp_print_scripts起作用。wp_enqueue_script确实可以工作,但是如果将其应用于init则如下:add_action('init','check_widget');
Ashley G

但是,即使该窗口小部件仅在一个侧栏中处于活动状态,它也会在网站的每个页面上加载脚本。例如,如果我有一个用于博客页面的侧边栏,另一个用于其他页面的侧边栏。我将搜索小部件添加到博客侧边栏,并且脚本确实加载了,但是它也加载在没有博客侧边栏的页面上。仅当该页面上存在小部件时,我才需要能够加载脚本。
Ashley G

3

只是想分享一个我致力于的解决方案,使我的实现更加灵活。我没有让函数检查各种短代码,而是对其进行了修改,以查找单个短代码,该短代码引用了需要排队的脚本/样式函数。这将适用于其他类中的两种方法(例如本身可能不会执行此操作的插件)和作用域内的函数。只需将以下代码拖放到functions.php中,然后将以下语法添加到要使用特定CSS和JS的任何页面/帖子中。

页面/后语法:[loadCSSandJS function =“(class->方法/函数名称)”]

functions.php代码:

function page_specific_CSSandJS( $posts ) {
  if ( empty( $posts ) )
    return $posts;

  foreach ($posts as $post) {

    $returnValue = preg_match_all('#\[loadCSSandJS function="([A-z\-\>]+)"\]#i', $post->post_content, $types);

    foreach($types[1] as $type) {
      $items = explode("->",$type);
      if (count($items) == 2) {
        global $$items[0];      
        if( method_exists( $$items[0], $items[1] ))
          add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) );
      }
      else if( !empty( $type ) && function_exists( $type ))
        add_action( 'wp_enqueue_scripts', $type );
    }
  }

  return $posts;
}

这也将允许您在页面上添加任意数量的内容。请记住,您确实需要加载方法/函数。


1

感谢您分享此提示!这让我有些头疼,因为起初它没有用。我认为上面的代码中有几个错误(可能是拼写错误)has_my_shortcode,我将函数重写如下:

function has_my_shortcode( $posts ) {

        if ( empty($posts) )
            return $posts;

        $shortcode_found = false;

        foreach ($posts as $post) {

            if ( !( stripos($post->post_content, '[my-shortcode') === false ) ) {
                $shortcode_found = true;
                break;
            }
        }

        if ( $shortcode_found ) {
            $this->add_scripts();
            $this->add_styles();
        }
        return $posts;
    }

我认为有两个主要问题:break不在if语句的范围内,这导致循环总是在第一次迭代时中断。另一个问题更加微妙和难以发现。如果简码是帖子中写的第一件事,则上面的代码不起作用。我必须使用===运算符来解决此问题。

无论如何,非常感谢您分享这项技术,它很有帮助。


1

使用Wordpress 4.7,您可以通过另一种方法在functions.php文件中实现此目的,

add_action( 'wp_enqueue_scripts', 'register_my_script');
function register_my_script(){
  wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter);
}

首先,您注册自己的脚本,除非您调用了简码,否则您的脚本实际上不会打印在页面上,

add_filter( 'do_shortcode_tag','enqueue_my_script',10,3);
function enqueue_my_script($output, $tag, $attr){
  if('myShortcode' != $tag){ //make sure it is the right shortcode
    return $output;
  }
  if(!isset($attr['id'])){ //you can even check for specific attributes
    return $output;
  }
  wp_enqueue_script('my-shortcode-js'); //enqueue your script for printing
  return $output;
}

do_shortcode_tagWP 4.7引入的,可以在新的开发人员文档页面中找到。

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.