仅当存在特定的短代码或小部件时才加载脚本

时间:2010-09-28 作者:Ashley G

我需要一种在加载页面之前过滤页面/发布内容的方法,以便在出现特定的短代码时可以将脚本添加到标题中。经过多次搜索,我在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\');
这真是太棒了,完全符合我的需要。

现在我需要进一步扩展它,并对侧边栏执行相同的操作。它可以通过特定的小部件类型、短代码、代码段或任何其他可以用来识别何时需要加载脚本的东西来实现。

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

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

您可以使用该功能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\\u active\\u widget()代码。E、 例如,请参阅默认的最近评论小部件(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\') );
    }

SO网友:Nick Caporin

我只是想分享我所研究的一个解决方案,它使我的实现更加灵活。我没有让函数检查各种短代码,而是对其进行了修改,以查找引用需要排队的脚本/样式函数的单个短代码。这将适用于其他类中的方法(例如插件本身可能无法做到这一点)和范围函数中的方法。只需在函数中删除以下代码。php,并将以下语法添加到任何需要特定CSS的页面/帖子中;JS。

页面/帖子语法:[loadCSSandJS function=“(类->方法/函数名)”]

功能。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;
}
这还允许您在页面上添加任意数量的内容。请记住,您确实需要一个方法/函数来加载。

SO网友:Aurovrata

有了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);
}
首先是你register your script, 它实际上不会打印在页面上,除非在调用快捷码时将其排队,

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;
}
thedo_shortcode_tagintroduced in WP 4.7 可以在new developers documentation 页。

SO网友:jekbau

感谢您分享此提示!它让我有点头疼,因为一开始它不起作用。我认为上面的代码中有几个错误(可能是拼写错误)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语句的范围内,这导致循环总是在第一次迭代时中断。另一个问题更微妙,也更难发现。如果短代码是在帖子中写的第一件事,那么上面的代码就不起作用。我必须使用=== 操作员来解决此问题。

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

结束

相关推荐

如何将外部jQuery/Javascript文件与WordPress链接

因此,我使用Starkers作为我下一个WP主题的基础,我遇到了一个小问题,我在header.php 但是当我使用Firebug检查我的网站时,我注意到jquery被下载了两次,我做了一些挖掘,并注意到我不仅包括了文件,还包括了wp_head() 作用在尝试修复该问题时,我注意到头文件中有一条注释,该注释源于“210”主题:/* Always have wp_head() just before the closing </head> * tag of your theme, or