有条件地将小部件的脚本/样式表放入Head中(仅当出现在页面上时!)

时间:2012-04-01 作者:Mark Jeldi

我一直在尝试加载WordPress小部件的脚本和样式,条件如下。。。

脚本必须装入头部(否则会中断)我做了很多搜索,这似乎是一个常见的(未解决的)问题。。。但我希望这里有人成功地实施了一种变通方法。

这是我目前为止最好的。。。

下面是一个将文本打印到侧栏的简单小部件。它成功地有条件地加载jQuery(当小部件实际显示时)。。。虽然只在页脚!(注:itmay also only work on WordPress 3.3, 虽然this hack 可能提供向后兼容性)。

class BasicWidget extends WP_Widget
{

    function __construct() {
        parent::__construct(__CLASS__, \'BasicWidget\', array(
            \'classname\' => __CLASS__,
            \'description\' => "This is a basic widget template that outputs text to the sidebar"
        ));
    }

  function form($instance) {
    $instance = wp_parse_args( (array) $instance, array( \'title\' => \'\' ) );
    $title = $instance[\'title\'];
?>
  <p><label for="<?php echo $this->get_field_id(\'title\'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id(\'title\'); ?>" name="<?php echo $this->get_field_name(\'title\'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></label></p>
<?php
  }

  function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance[\'title\'] = $new_instance[\'title\'];
    return $instance;
  }

  function widget($args, $instance) {

    extract($args, EXTR_SKIP);

    echo $before_widget;
    $title = empty($instance[\'title\']) ? \' \' : apply_filters(\'widget_title\', $instance[\'title\']);

    if (!empty($title))
      echo $before_title . $title . $after_title;;

    echo "<h1>This is a basic widget!</h1>";

    echo $after_widget;

        // if we\'re echoing out content, enqueue jquery.

        if (!empty($after_widget)) {
            wp_enqueue_script(\'jquery\');
        }
    }
}
add_action( \'widgets_init\', create_function(\'\', \'return register_widget("BasicWidget");\') );
似乎一旦WordPress开始处理小部件,就太晚了,无法排队(甚至取消注册之前排队的东西)。

任何想法都将不胜感激!

做记号

3 个回复
SO网友:Bainternet

Wordpress是一个很好的功能is_active_widget 您可以在构造和测试小部件是否存在于当前页面中时使用它,并基于该示例添加脚本/样式:

function __construct() {
    parent::__construct(__CLASS__, \'BasicWidget\', array(
        \'classname\' => __CLASS__,
        \'description\' => "This is a basic widget template that outputs text to the sidebar"
    ));
     if ( is_active_widget(false, false, $this->id_base) )
        add_action( \'wp_head\', array(&$this, \'add_styles_and_scripts\') );
}

function add_styles_and_scripts(){
    //since its wp_head you need to echo out your style link:
    echo \'<link rel="stylesheet" href="http://example.com/css/style.css" type="text/css" />\';
    //as for javascript it can be included using wp_enqueue_script and set the footer parameter to true:
    wp_enqueue_script( \'widget_script\',\'http://example.com/js/script.js\',array(),\'\',true );
}

SO网友:Martin Zeitler

或者,您可以尝试“Widget Logic”插件。。。它使用条件语句加载小部件。

这完全是另一种想法,但结果应该如预期的那样。

wp\\u print\\u脚本(&U);wp\\u print\\u样式可能是合适的挂钩,只需向这些挂钩添加优先级为100左右的操作,就可以成为队列中的最后一个挂钩。wp\\u enqueue\\u script()、wp\\u enqueue\\u style()、wp\\u deregister\\u script()、wp\\u deregister\\u style()。。。

您对上述代码的问题可能是缺少优先级参数(未测试)?WP codex

SO网友:iStefan

您可以简单地使用wp_enqueue_scriptwp_enqueue_style 在自定义小部件类的小部件方法(函数)中,它将仅在小部件处于活动状态时加载脚本。请参见此处的详细信息和示例:https://wpshed.com/wordpress/load-scripts-styles-widget-active/

结束

相关推荐

If has $title in widgets

我正在写一个小部件来显示125 x 125像素的广告。广告有6个空间,目前所有作品都有。然而,我想添加一些条件逻辑,这样,如果在一个广告的小部件管理中的值中没有输入任何内容,那么就不会显示add。我想这可以通过使用PHP if或其他什么东西来实现,我不记得它到底是什么。我需要它和<?php & ?> 标签打开。需要检查一下$adone 存在,如果不存在,则显示空白。我知道这里的代码是错误的,但类似这样的代码:<?php if_has($adone_img) ?>