问题描述

我需要一种方法来过滤页面/帖子内容之前加载,所以如果一个特定的短代码存在,我可以添加脚本到标题。经过多次搜索,我在 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');

这是绝对辉煌,做了我所需要的。

现在我需要进一步扩展它,并为侧边栏做同样的事情。它可以通过特定的小工具类型,短代码,代码片段或其他任何可以确定脚本需要加载的功能。

问题是我无法弄清楚在侧边栏加载之前如何访问侧边栏内容 (相关主题将有几个侧边栏)

最佳解决方案

您可以使用功能 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') );
    }

次佳解决方案

只是想分享一个解决方案,这使我在我的实现中变得更加多样化。而不是对各种短信进行功能检查,我修改了它,以寻找引用需要排入队列的脚本/样式函数的单个短代码。这将适用于其他类中的两种方法 (例如可能无法自己完成的插件) 和 in-scope 功能。只需将以下代码放在 functions.php 中,并将以下语法添加到您想要的特定 CSS& JS 。

页面/后缀语法:[loadCSSandJS function =「(class-> method /function name)」]

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;
}

这也将允许您在页面上添加所需的数量。请记住,您需要一个加载方法/函数。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。