Работающий перевод карусели Bootstrap на WP – Технические вопросы

Вопрос или проблема

Я разработал работающий карусель 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 значительно упростит вашу задачу.

Данный подход также позволит вам дальше развивать проект, добавляя дополнительные функции по мере вашего обучения. Применяя эти шаги, вы сможете создать динамическую карусель с хорошей производительностью и функциональностью. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать. Удачи в разработке!

Оцените материал
Добавить комментарий

Капча загружается...