SWELL│Pjax遷移のSwiperカスタマイズの対応方法

静的サイトのようなスピードを求める方は非推奨ですがSWELLのPjaxを使われる方がいらっしゃいます。

その場合JavaScriptなどがうまく機能しない不具合が起きるので、対応が必要になります。

その備忘録です。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

Pjax遷移のSwiperスライダーの対応方法

Pjaxにした場合、初回はSwiperのスライダーが動いていたのですが、別のページから戻ると動かなくなってしまっていたので、対応してみました。

対応前のコード

Pjaxにする前のコードです。

function enqueue_swiper_assets() {
    if (is_front_page()) { // トップページのみ適用

        // SwiperのCSSとJSを読み込み
        wp_enqueue_style('swell_swiper');
        wp_enqueue_script('swell_swiper');

        wp_add_inline_script('swell_swiper', '
            document.addEventListener("DOMContentLoaded", function() {
                const swiper = new Swiper(".swiper-container", {
                    loop: true,
                    autoplay: {
                        delay: 4000,
                        disableOnInteraction: false,
                    },
                    pagination: {
                        el: ".swiper-pagination",
                        clickable: true,
                    },
                    navigation: {
                        nextEl: ".swiper-button-next",
                        prevEl: ".swiper-button-prev",
                    },
                    slidesPerView: 1,
                    spaceBetween: 20,
                    centeredSlides: true,
					speed: 1000,
					allowTouchMove: true,
                    breakpoints: {
                        600: {
                            slidesPerView: 2,
                            spaceBetween: 10,
                        },
                        960: {
                            slidesPerView: 3,
                            spaceBetween: 20,
                        },
                    }
                });
            });
        ');
    }
}
add_action('wp_enqueue_scripts', 'enqueue_swiper_assets');

対応後のコード

Pjaxの場合はトップページ限定にしても意味がないので、条件は削除しました。

修正前は、初回ロード時のみSwiperが初期化され、Pjax遷移後のページでは動作しませんでした。

しかし修正後は、initializeSwiper関数とwindow.SWELLHOOK.barbaAfterを組み合わせることで、Pjax遷移後でもSwiperが確実に動作するようになりました。

function enqueue_swiper_assets() {
    // SwiperのCSSとJSを読み込み
    wp_enqueue_style('swell_swiper');
    wp_enqueue_script('swell_swiper');

    // Swiperの初期化スクリプトを追加
    wp_add_inline_script('swell_swiper', '
        // Swiperの初期化関数
        function initializeSwiper() {
            document.querySelectorAll(".swiper-container").forEach((element) => {
                if (element.swiper) {
                    element.swiper.destroy(true, true); // 既存のSwiperインスタンスを破棄
                }
                new Swiper(element, {
                    loop: true,
                    autoplay: {
                        delay: 4000,
                        disableOnInteraction: false,
                    },
                    pagination: {
                        el: ".swiper-pagination",
                        clickable: true,
                    },
                    navigation: {
                        nextEl: ".swiper-button-next",
                        prevEl: ".swiper-button-prev",
                    },
                    slidesPerView: 1,
                    spaceBetween: 20,
                    centeredSlides: true,
                    speed: 1000,
                    allowTouchMove: true,
                    breakpoints: {
                        600: {
                            slidesPerView: 2,
                            spaceBetween: 10,
                        },
                        960: {
                            slidesPerView: 3,
                            spaceBetween: 20,
                        },
                    },
                });
            });
        }

        // 初回ロード時にSwiperを初期化
        document.addEventListener("DOMContentLoaded", () => {
            initializeSwiper();
        });

        // Pjax遷移後にSwiperを再初期化
        if (window.SWELLHOOK && window.SWELLHOOK.barbaAfter) {
            window.SWELLHOOK.barbaAfter.add(() => {
                initializeSwiper(); // Pjax遷移後に再初期化
            });
        }
    ');
}
add_action('wp_enqueue_scripts', 'enqueue_swiper_assets');

以上です。

  • URLをコピーしました!
目次