当前位置: 首页>>技术教程>>正文


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

webfans 技术教程 , , , , 去评论

问题描述

我需要一种在加载页面/发布内容之前过滤内容的方法,这样如果存在特定的短代码,我就可以在标题中添加脚本。经过多次搜索,我在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;
}

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

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2699.html,转载请务必附带本地址声明。