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