脚本不会通过插件类加载

时间:2012-06-26 作者:AlxVallejo

我不知道为什么这个脚本没有通过Firebug加载或产生任何加载错误。以下是我的插件脚本:

class AV_Slideshow{ 

function __construct(){
    $this->hooks();
}
function hooks(){
    add_action(\'wp_head\', array( $this, \'load_av_slider\' ));
}   
function load_av_slider(){
    wp_register_script(\'av-slideshow\', get_bloginfo(\'stylesheet_directory\') . \'/js/AV-Slideshow/av_slideshow.js\', array(\'jquery\') );
    wp_enqueue_script(\'av-slideshow\' );
}

function build_slideshow($slides){

    if(!$slides){$slideshow = \'No posts are selected for this slideshow.\';}

        $slideshow = \'<div id="slides"><div class="slides_container">\';
        foreach($slides as $post_id){
            $post = get_post($post_id);
            $title = $post->post_title;
            $content = $post->post_content;

            $slideshow .= \'<span>\' . $title . \'</span><span>\' . $content . \'</span>\';
        }
        $slideshow .= \'</div></div>\';

        return $slideshow;
}

}

add_shortcode( \'slideshow\', array(\'AV_Slideshow\', \'build_slideshow\') );
?>

这个$slideshow 输出正在工作,但脚本从未加载。我加载的是否正确?

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

直到您的短代码处理程序被调用(即WordPress在帖子内容中搜索短代码时),才会调用类构造函数方法。这是在wp_head 你错过了那艘船。

但是,您不需要在wp_head - 对于可能不在每个页面上的短代码/小部件这样做是一种浪费。从3.3开始,您可以拨打wp_enqueue_script 在短代码/小部件回调中,这样做意味着您的脚本仅在绝对需要的页面上排队。然后在页脚中打印脚本。

class AV_Slideshow{ 

function build_slideshow($slides){

    if(!$slides){$slideshow = \'No posts are selected for this slideshow.\';}

        $slideshow = \'<div id="slides"><div class="slides_container">\';
        foreach($slides as $post_id){
            $post = get_post($post_id);
            $title = $post->post_title;
            $content = $post->post_content;

            $slideshow .= \'<span>\' . $title . \'</span><span>\' . $content . \'</span>\';
        }
        $slideshow .= \'</div></div>\';

        //Shortcode is being used, so enqueue the script:
        wp_enqueue_script(\'av-slideshow\', get_bloginfo(\'stylesheet_directory\') .  \'/js/AV-Slideshow/av_slideshow.js\', array(\'jquery\') );

        return $slideshow;
}

}

add_shortcode( \'slideshow\', array(\'AV_Slideshow\', \'build_slideshow\') );
在减肥之后,班级结构似乎有点不必要了。但我倾向于将插件的所有短代码放在一个类中,尤其是当短代码共享脚本/样式并且我需要将JavaScript变量打印到页面时。

SO网友:eddiemoya

第一个问题是挂接调用以将脚本排队。将该行更改为。。。

function hooks() {
    add_action(\'wp_enqueue_scripts\', array($this, \'load_av_slider\'));
}
还有一个明显的遗漏,我本打算忽略它。您没有实例化类的对象。我假设您只是没有在示例中包含它,但如果您只是忘记了这么做,那么肯定会导致永远不会加载脚本,因为永远不会调用构造函数。

我的建议如下。。。

class AV_Slideshow {

    function __construct() {
        $this->hooks();
    }

    function hooks() {
        add_action(\'wp_enqueue_scripts\', array($this, \'load_av_slider\'));
    }

    function load_av_slider() {
        wp_register_script(\'av-slideshow\', get_bloginfo(\'stylesheet_directory\') . \'/js/AV-Slideshow/av_slideshow.js\', array(\'jquery\'));
        wp_enqueue_script(\'av-slideshow\');
    }

    function build_slideshow($slides) {

        if (!$slides) {
            $slideshow = \'No posts are selected for this slideshow.\';
        }

        $slideshow = \'<div id="slides"><div class="slides_container">\';
        foreach ($slides as $post_id) {
            $post = get_post($post_id);
            $title = $post->post_title;
            $content = $post->post_content;

            $slideshow .= \'<span>\' . $title . \'</span><span>\' . $content . \'</span>\';
        }
        $slideshow .= \'</div></div>\';

        return $slideshow;
    }

}

$avs = new AV_Slideshow();

add_shortcode(\'slideshow\', array($avs, \'build_slideshow\'));
如果你要使用$this 引用,您肯定需要实例化类的对象。之后,您可以继续以静态方式传递上下文参数,但是如果您继续扩展代码,以后可能会导致混淆。除非你是故意的build_slideshow() 静态,而rest目标由于特定的原因,您应该坚持其中之一。没有太多的理由去客观化,但我一直这样,因为这就是你所拥有的。

结束

相关推荐