Скрипт не будет загружаться через класс плагина


Я не уверен, почему этот скрипт не загружается или не выдает никаких ошибок загрузки через 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 работает, но скрипт никогда не загружается. Правильно ли я загружаю это?

Author: AlxVallejo, 2012-06-26

2 answers

Метод конструктора класса не вызывается до тех пор, пока не будет вызван обработчик вашего шорткода (т.Е. Когда 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 на странице.

 1
Author: Stephen Harris, 2012-06-26 18:27:24

Ваша первая проблема заключается в том, что вы звоните, чтобы поставить свои скрипты в очередь. Измените эту строку на...

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() было статичным, а остальное - объективным по определенной причине, вам следует придерживаться одного или другого. Не так уж много причин быть объективным, но я сохранил это таким образом, так как это то, что у тебя было.

 0
Author: eddiemoya, 2012-06-26 22:30:57