SWELLで、おすすめ記事を自分で選び、指定した順番のままスライダーに並べる方法です。
ショートコードに記事IDを入力し、SWELLが読み込むSwiperで前後に送れるようにします。
PHPテンプレートファイルの追加は不要です。
カテゴリーや新着順で自動選定したい場合は、投稿リストブロックをSwiperにする方法を使います。
手動で横へ送るだけなら、CSSの横スクロールも選べます。
動く見本:選んだ4記事を指定順で表示
以下は、まとめ記事→Swiper→CSS横スクロール→リッチカラムの順に指定した見本です。
自動再生はしません。
矢印ボタン、スマートフォンの横スワイプ、記事リンクへのキーボード移動で操作します。
最初と最後では進めない側のボタンが無効になります。
2つ置いても、それぞれ独立して操作する
2つ目は、CSS横スクロール→Swiperの順です。
横幅に全記事が収まる場合は送る必要がないため、ボタンが表示されないことがあります。
スマートフォン幅では2つの見本を別々に操作できます。
設置前に確認すること
対象はSWELLを使用するサイトの通常投稿です。
公開・パスワードなしの記事を最大12件まで表示します。
固定ページ・非公開記事は対象外です。
SWELL内のSwiperを使うため、別バージョンのSwiperをCDNから重ねて読み込まないでください。
テーマ更新後は動作を再確認します。
旧版の motoki_slider_select、motoki_slider.php、slider_motoki 用JavaScript・CSSを使用している場合は、保存してから新しい設置先で置き換えます。
ほかのページでも旧コードを使っている場合は、そのページの移行が終わるまで共通PHPやテンプレートを削除しないでください。
1.PHPを登録する
まず検証用サイトで作業します。
変更前のPHP・CSS・JSを保存し、PHPエラーで管理画面が開けなくなった場合も元へ戻せる手段を確認してください。
PHPはCode Snippetsか子テーマのfunctions.phpのどちらか1か所へ登録します。
Code Snippetsでは開始タグなしで貼り付けます。
以下の 20244 は、スライダーを表示するページのIDへ変更してください。
複数ページで使う場合は対象IDを配列へ追加します。
// SWELL用。20244はこのコードを使う投稿・固定ページのIDへ変更します。
add_action('wp_enqueue_scripts', function () {
if (!is_singular() || !in_array(get_queried_object_id(), array(20244), true)) return;
wp_enqueue_script('swell_swiper');
wp_enqueue_style('swell_swiper');
});
add_shortcode('waza_selected_slider', function ($atts) {
$atts = shortcode_atts(array('ids' => ''), $atts);
$ids = array_slice(array_values(array_unique(array_filter(array_map('absint', explode(',', $atts['ids']))))), 0, 12);
// post__in が空だと全投稿の検索になるため、ここで終了します。
if (!$ids) return '<p>表示する記事IDを指定してください。</p>';
$query = new WP_Query(array('post_type' => 'post', 'post_status' => 'publish', 'has_password' => false,
'post__in' => $ids, 'orderby' => 'post__in', 'posts_per_page' => count($ids), 'ignore_sticky_posts' => true, 'no_found_rows' => true));
if (!$query->have_posts()) return '<p>表示できる公開記事がありません。</p>';
ob_start(); ?>
<section class="waza-selected-slider" aria-label="おすすめ記事">
<div class="swiper"><ul class="swiper-wrapper">
<?php while ($query->have_posts()): $query->the_post(); ?>
<li class="swiper-slide"><a href="<?php echo esc_url(get_permalink()); ?>">
<?php if (has_post_thumbnail()) echo get_the_post_thumbnail(get_the_ID(), 'medium', array('loading' => 'lazy', 'alt' => '')); ?>
<span><?php echo esc_html(get_the_title()); ?></span>
</a></li>
<?php endwhile; wp_reset_postdata(); ?>
</ul></div>
<div class="wss-controls" hidden><button type="button" class="wss-prev" aria-label="前の記事へ">前へ</button><button type="button" class="wss-next" aria-label="次の記事へ">次へ</button></div>
</section>
<?php return ob_get_clean();
});
2.表示する記事IDを指定する
設置先のショートコードブロックに [waza_selected_slider ids="123,456,789"] と入力し、123などを自分の記事IDへ置き換えます。
投稿編集画面のURLにある post=123 の数値が記事IDです。
PHP側のページIDは「設置先」、ショートコード側の記事IDは「表示する記事」です。
カンマ区切りで書いた順に表示します。
IDの重複は除外し、先頭から最大12件を取得対象にします。
その12件の中に表示できない記事があっても、13件目以降から補充はしません。
表示できない記事はスキップします。
アイキャッチ未設定の記事はタイトルだけ表示します。
IDが空の場合に、意図せず全記事を取得しない構成です。
3.CSSとJavaScriptを追加する
CSSは追加CSSか設置先記事のCSS欄へ、JavaScriptは設置先記事のJS欄へ貼り付けます。
JS欄にはscriptタグを付けません。
複数ページに設置する場合は、各設置先でもCSSとJSが読み込まれるようにします。
次のCSSは専用クラス内だけに適用します。
.waza-selected-slider { margin-block:2em; min-width:0; }
.waza-selected-slider .swiper { overflow:hidden; }
.waza-selected-slider .swiper-wrapper { display:flex; padding:0; margin:0; list-style:none; }
.waza-selected-slider .swiper-slide { flex-shrink:0; height:auto; width:85%; box-shadow:none; }
.waza-selected-slider .swiper-slide a { display:block; border:1px solid #ddd; border-radius:4px; overflow:hidden; height:100%; color:inherit; text-decoration:none; }
.waza-selected-slider .swiper-slide img { display:block; width:100%; aspect-ratio:16 / 9; object-fit:cover; }
.waza-selected-slider .swiper-slide span { display:block; padding:1em; }
.waza-selected-slider .wss-controls { text-align:right; margin-top:.75em; }
.waza-selected-slider button { min-width:60px; min-height:44px; border:1px solid #555; border-radius:4px; margin-left:.5em; padding:.5em; background:#fff; color:#222; }
.waza-selected-slider button:disabled { opacity:.4; }
.waza-selected-slider :is(a,button):focus-visible { outline:3px solid #0969da; outline-offset:-3px; }
.waza-selected-slider .swiper:not(.swiper-initialized) .swiper-wrapper { overflow-x:auto; gap:16px; }
document.addEventListener('DOMContentLoaded', () => {
if (typeof Swiper === 'undefined') return;
document.querySelectorAll('.waza-selected-slider').forEach(root => {
const track = root.querySelector('.swiper');
if (track.swiper) return;
const controls = root.querySelector('.wss-controls');
const slider = new Swiper(track, {
slidesPerView: 1.15,
spaceBetween: 16,
loop: false,
autoplay: false,
watchOverflow: true,
speed: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : 300,
breakpoints: {600: {slidesPerView: 2}, 960: {slidesPerView: 3}},
navigation: {prevEl: root.querySelector('.wss-prev'), nextEl: root.querySelector('.wss-next')},
a11y: {prevSlideMessage: '前の記事へ', nextSlideMessage: '次の記事へ', slideLabelMessage: '{{index}} / {{slidesLength}}'}
});
controls.hidden = false;
// SWELL同梱版で画面幅変更後に残る aria-disabled を実際の状態と揃えます。
const syncButtons = () => requestAnimationFrame(() => {
controls.querySelectorAll('button').forEach(button => button.setAttribute('aria-disabled', String(button.disabled)));
});
slider.on('resize breakpoint slideChange lock unlock', syncButtons);
syncButtons();
// キーボードでフォーカスしたリンクが画面外へ隠れないようにします。
root.querySelectorAll('.swiper-slide a').forEach((link, index) => {
link.addEventListener('focus', () => slider.slideTo(index));
});
});
});
表示枚数と動きの調整
幅600px未満は1.15枚、600px以上は2枚、960px以上は3枚です。
少し次のカードを見せることで、横に続くことを示します。
画面幅は端末名ではなくCSSピクセルで判定します。
繰り返し・自動再生は無効です。
動きを減らす設定では移動時間を0にします。
動かない・違う記事が出る場合
ボタンが出ず横スクロールだけになる場合は、PHPの対象ページID、Swiperの読み込み、JS欄を確認します。
掲載JSはDOMContentLoaded時に初期化するため、そのイベントの後にJSやスライダーを追加する構成では自動で初期化されません。
ショートコードが文字で残る場合はPHPの有効化と綴りを確認してください。
表示順が違う場合は、旧ショートコードを使っていないか、指定した記事が公開・パスワードなしになっているかを確認します。
設置後はPCとスマートフォンで、指定順・前後ボタン・最後の停止・Tabで画面外の記事へ移動できることを確認します。
コードを変更しても見た目が変わらない場合はキャッシュを削除します。
戻す場合は新ショートコード・専用CSS・JSを外し、新PHPを停止して保存済みの構成へ戻します。
方式全体を選び直す場合は、投稿リスト・記事スライダーの比較へ戻れます。
公開見本の操作確認
2026年10月2日、公開記事の599px・600px・959px・960px幅と、390px幅で2つのスライダーを確認しました。
1つ目の次へボタンをEnterで操作しても2つ目は変わらず、2つ目をSpaceで操作しても1つ目は変わりません。
2つ目の前へボタンへShift+Tabで移動すると青い枠が表示されます。
実機でのタッチ操作とOSの動きを減らす設定は今回確認していません。




