Вопрос или проблема
Я разработал работающий карусель Bootstrap, её нужно конвертировать в WP. Это маленькая часть сайта, но, будучи новичком в WordPress, я застрял на понимании технической проблемы.
Вот что я пытаюсь сделать:
Показать все посты, у которых есть заглавное изображение, чтобы они отображались как часть карусели Bootstrap, а затем ограничить количество постов на странице по мере необходимости.
На первом этапе я подумал, что не буду использовать WP_Query для этой цели. И попробую обычный цикл постов.
<?php if(have_posts()) {
?>
<div class="carousel-inner" role="listbox">
<?php
$postNumber = 0;
while(have_posts()) {
the_post(); ?>
<!-- 1-й слайд -->
<div class="carousel-item <?php echo $postNumber == 0 ? 'active' : ''; ?>">
<!-- Начало раздела с заглавными постами -->
<div class="featured">
<div class="container">
<div class="row text-center">
<div class="col-12 m-auto pt-5">
<?php if(has_post_thumbnail()) { ?>
Я использую has_post_thumbnail() как проверку, чтобы включать только те посты, которые имеют прикрепленное заглавное изображение, чтобы показать их в карусели. Если я присоединяю класс “active” к div с carousel-item, все эти посты отображаются одновременно в карусели.
И если я использую флаг, например, $postNumber, чтобы инициализировать его на 1, а в цикле while проверяю, равно ли $postNumber 1, а затем использую условие, чтобы добавить ‘active’ к div с carousel-item. И сбрасываю $postNumber на 0 в конце первого цикла. Это не работает корректно. Так что я пытался использовать current_post с пользовательским запросом, но это не сработало. Либо контент вообще не отображается в карусели, либо карусель отображается, но не движется автоматически, только при нажатии на стрелку назад она движется один раз.
Еще одна проблема заключается в том, как динамически установить индикаторы карусели, чтобы они отображались в соответствии с количеством постов. Это легко, если мы ограничиваем количество постов в запросе и используем то же число здесь, но если мы можем сделать это динамически.
Как новичок в WordPress, я узнал много различных вещей, начиная от использования шорткодов, до дочерних тем и использования Options API вместе с множеством других вещей как для тем, так и для плагинов. Было важно привести эти знания в действие.
Поэтому я разработал веб-сайт с нуля в Photoshop, закодировал его в Bootstrap и теперь конвертирую его в WordPress. Это была одна из проблем, где я застрял и не мог продвигаться дальше. Надеюсь, кто-то сможет помочь.
Спасибо!
Недавно у меня была аналогичная ситуация — сделать карусель Bootstrap динамической.
Вот мой код в functions.php для этого:
//Слайдер изображений
function themename_slider_home_images_setup($wp_customize)
{
$wp_customize->add_section('home-slider-images', array(
'title' => 'Главный слайдер',
));
$wp_customize->add_setting('home-slider-first-image');
$wp_customize->add_control(
new WP_Customize_Image_Control(
$wp_customize,
'home-slider-first-image',
array(
'label' => __( 'Первое изображение', 'theme_name' ),
'section' => 'home-slider-images',
'settings' => 'home-slider-first-image'
)
)
);
$wp_customize->add_setting('home-slider-second-image');
$wp_customize->add_control(
new WP_Customize_Image_Control(
$wp_customize,
'home-slider-second-image',
array(
'label' => __( 'Второе изображение', 'theme_name' ),
'section' => 'home-slider-images',
'settings' => 'home-slider-second-image'
)
)
);
$wp_customize->add_setting('home-slider-third-image');
$wp_customize->add_control(
new WP_Customize_Image_Control(
$wp_customize,
'home-slider-third-image',
array(
'label' => __( 'Третье изображение', 'theme_name' ),
'section' => 'home-slider-images',
'settings' => 'home-slider-third-image'
)
)
);
}
add_action('customize_register', 'themename_slider_home_images_setup');
А для шаблонного файла:
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<!-- Индикаторы -->
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
<li data-target="#myCarousel" data-slide-to="2"></li>
</ol>
<!-- Обертка для слайдов -->
<div class="carousel-inner">
<div class="item active">
<img src="https://wordpress.stackexchange.com/questions/312817/<?php echo get_theme_mod("home-slider-first-image');?>" alt="Синан" >
</div>
<div class="item header-image">
<img src="https://wordpress.stackexchange.com/questions/312817/<?php echo get_theme_mod("home-slider-second-image');?>" alt="Синан" >
</div>
<div class="item header-image">
<img src="https://wordpress.stackexchange.com/questions/312817/<?php echo get_theme_mod("home-slider-third-image');?>" alt="Синан" >
</div>
</div>
<!-- Левые и правые элементы управления -->
</div>
Думаю, есть более элегантные способы сделать это, но я тоже новичок в разработке пользовательских тем WordPress, и это сработало для меня.
Редактировать: Вы можете сделать другие элементы редактируемыми, например, атрибут alt, добавить подписи к слайдам и т. д., используя ту же логику, добавляя больше настроек в файл функций и заменяя значения атрибутов, закодированных в HTML, на соответствующие теги PHP, которые появятся в кастомизаторе.
Надеюсь, это поможет!
Ответ или решение
Конвертация карусели Bootstrap в WordPress может быть непростой задачей для новичка, особенно если вы хотите динамически извлекать записи, которые имеют установленные миниатюры, и организовать их в карусель. Давайте шаг за шагом разберем, как добиться этого с использованием стандартного цикла WordPress (Loop) и кастомных полей.
Шаг 1: Использование WP_Query
Хотя вы хотите избежать WP_Query
, настоятельно рекомендую использовать его для выборки записей с установленными миниатюрами. Это даст вам больше контроля и гибкости.
Вы можете создать пользовательский запрос, который извлекает только те записи, которые имеют миниатюры и ограничивает количество отображаемых записей. Например, так:
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS',
),
),
);
$carousel_query = new WP_Query($args);
Шаг 2: Создание карусели
Теперь, когда у вас есть нужные записи, вам нужно создать структуру карусели. Вот пример кода, который может вам помочь:
if ($carousel_query->have_posts()) {
echo '<div id="myCarousel" class="carousel slide" data-ride="carousel">';
echo '<ol class="carousel-indicators">';
for ($i = 0; $i < $carousel_query->found_posts; $i++) {
$active_class = $i === 0 ? 'active' : '';
echo '<li data-target="#myCarousel" data-slide-to="' . $i . '" class="' . $active_class . '"></li>';
}
echo '</ol>';
echo '<div class="carousel-inner">';
$postNumber = 0;
while ($carousel_query->have_posts()) {
$carousel_query->the_post();
$active_class = $postNumber === 0 ? 'active' : '';
echo '<div class="carousel-item ' . $active_class . '">';
if (has_post_thumbnail()) {
echo get_the_post_thumbnail();
}
echo '<div class="carousel-caption d-none d-md-block">';
echo '<h5>' . get_the_title() . '</h5>';
echo '<p>' . get_the_excerpt() . '</p>';
echo '</div>';
echo '</div>';
$postNumber++;
}
echo '</div>';
echo '<a class="carousel-control-prev" href="#myCarousel" role="button" data-slide="prev">';
echo '<span class="carousel-control-prev-icon" aria-hidden="true"></span>';
echo '<span class="sr-only">Previous</span>';
echo '</a>';
echo '<a class="carousel-control-next" href="#myCarousel" role="button" data-slide="next">';
echo '<span class="carousel-control-next-icon" aria-hidden="true"></span>';
echo '<span class="sr-only">Next</span>';
echo '</a>';
echo '</div>';
}
wp_reset_postdata();
Шаг 3: Динамическое создание индикаторов
Индикаторы создаются динамически на основе количества записей, извлеченных из WP_Query. Это позволит вам избежать ручного добавления индикаторов в каждом случае, когда количество записей меняется.
Шаг 4: Проверка работы карусели
Убедитесь, что все зависимости для Bootstrap подключены к вашему шаблону. Проверьте, что вы подключили CSS и JavaScript файлы Bootstrap. Например:
function theme_enqueue_styles() {
wp_enqueue_style('bootstrap-css', 'https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css');
wp_enqueue_script('jquery');
wp_enqueue_script('bootstrap-js', 'https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js', array('jquery'), null, true);
}
add_action('wp_enqueue_scripts', 'theme_enqueue_styles');
Заключение
Опираясь на приведенные выше примеры, вы можете создать карусель в WordPress с использованием миниатюр, что является важным аспектом проектирования вашего сайта. Поскольку вы уже обладаете некоторыми знаниями, работа с WP_Query и базовыми концепциями WordPress значительно упростит вашу задачу.
Данный подход также позволит вам дальше развивать проект, добавляя дополнительные функции по мере вашего обучения. Применяя эти шаги, вы сможете создать динамическую карусель с хорошей производительностью и функциональностью. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать. Удачи в разработке!