【WordPress】テキストが短いときは「続きを読む」ボタンをPHPで非表示にする方法

WordPressに「続きを読む」ボタン(アコーディオン)を実装する方法【スマホ・PC対応】

WordPressでアコーディオン型の「続きを読む」ボタンを実装した際、テキストが短い場合でもボタンが表示されてしまうと、違和感があることがあります。

本記事では、テキストの長さ(文字数や行数)に応じて、「続きを読む」ボタンをPHPで自動的に非表示にする方法をご紹介します。

「アコーディオンの基本実装は完了しているけど、短文のときだけボタンを消したい」という方におすすめの内容です。

「PHPで自動的に非表示する」機能が必要ない場合、こちらの記事を参考にしてください。

あわせて読みたい
WordPressに「続きを読む」ボタン(アコーディオン)を実装する方法【スマホ・PC対応】 WordPressの投稿やカスタムフィールドで長いテキストを表示するとき、「続きを見る」ボタン(アコーディオン)で折りたたむことで、ページの見やすさ・読みやすさが向上...

目次

実装イメージ

5〜6行くらい表示させておいて、「VIEW MORE」ボタンをクリックしたらアコーディオンが開閉します。
アコーディオンが閉じている時は「VIEW MORE」、開くと「CLOSE」と文言が変わります。

「表示させておくテキストの長さ」はスマホ・PCそれぞれで設定できます。
また、「VIEW MORE」、「CLOSE」ボタンの文言・色も変更可能です。

さらに、テキストの長さ(文字数や行数)に応じて、「続きを読む」ボタンをPHPで自動的に非表示にする機能を追加しました。

「続きを読む」ボタンの実装概要

  • PHPでACF(カスタムフィールド)のテキストを出力
    <?php the_content(); ?>など、ACFでなくても実装できます。
  • JavaScriptでアコーディオンの開閉処理
  • CSSで見た目とレスポンシブ対応

実装方法

1. PHP:ACFの値を出力する

  • 160文字以上なら、アコーディオンを出すようにしています。
  • 160文字未満(アコーディオンが不要)の場合、文字部分に高さを自動設定するためのクラス.is-shortを追加します。
<?php
// PHPで動的にテキストを出す(ACF)
$manager_profile_text = get_field('manager_profile_text', $manager_term);//タームページで出力の場合
$accordion_needed = false;

if ($manager_profile_text) {
	$plain_text = wp_strip_all_tags($manager_profile_text); // HTMLタグを除去
	if (mb_strlen($plain_text) > 160) { // 160文字以上ならアコーディオン必要
		$accordion_needed = true;
	}
}
?>

<div class="p-profile__textarea js-accordion">
	<?php if ($accordion_needed) : ?>
		<div class="p-profile__button-toggle c-button-bg-left-to-right js-accordion-btn">
			<span class="a-tag">
				<span class="text open-text">続きを読む</span>
				<span class="text close-text">閉じる</span>
			</span>
		</div>
	<?php endif; ?>

	<?php if ($manager_profile_text) : ?>
		<p class="p-profile__text p-profile__hide-box js-accordion-contents<?php if (!$accordion_needed) echo ' is-short'; ?>">
			<?php echo wp_kses_post($manager_profile_text); ?>
		</p>
	<?php endif; ?>
</div>

2. JavaScript:アコーディオンを制御する

ここは、どちらの記事も共通です。

// viewMoreAccordion(ウィンドウサイズが768px以上のときにリサイズする)====================
// 閉じている時は少しチラ見せ、開いている時は全文表示(要素ごとに、高さ改変可能)

  window.addEventListener("load", initializeAccordion);
  window.addEventListener("resize", resizeAccordion);

  function initializeAccordion() {
    setAccordionHeights();
    setupAccordionButtons();
  }

  function setAccordionHeights() {
    document.querySelectorAll(".js-accordion").forEach(function (accordion) {
      const content = accordion.querySelector(".js-accordion-contents");
      adjustHeight(content, accordion.classList.contains("is-active")); //js-accordion-contentsに、is-activeがあるかどうかで処理を変更する
    });
  }

  //アコーディオンボタンのクリックイベント
  function setupAccordionButtons() {
    document.querySelectorAll(".js-accordion-btn").forEach(function (btn) {
      btn.addEventListener("click", function () {
        const parentAccordion = this.closest(".js-accordion");
        if (parentAccordion) {
          parentAccordion.classList.toggle("is-active"); //親の要素にis-activeを付与・削除

          const nextContent = this.nextElementSibling;

          // ボタンに隣接する.js-accordion-contentsの表示切り替え
          if (
            nextContent &&
            nextContent.classList.contains("js-accordion-contents")
          ) {
            adjustHeight(
              nextContent,
              parentAccordion.classList.contains("is-active") //親の要素にis-activeがあるかどうか
            );
          }
        }
      });
    });
  }

  // js-accordion-contentsの高さ切り替えの処理内容
  function adjustHeight(element, isActive) {
    //.is-activeがある場合、全文表示。ない場合、少しチラ見せ
    if (isActive) {
      element.style.height = element.scrollHeight + "px";
    } else {
      //チラ見せの高さを設定
      if (window.innerWidth >= 768) {
        //PCの場合
        element.style.height = "12em"; //6行くらい(任意で調整)
      } else {
        //SPの場合
        element.style.height = "32vw"; //6行くらい(任意で調整)
      }
    }
  }

  function resizeAccordion() {
    if (window.innerWidth >= 768) {
      setAccordionHeights();
    }
  }

3. CSS:見た目と高さの調整(SCSS)

  • アコーディオンが不要の場合、文字部分に高さを自動設定するためのクラス.is-shortを追加します。
    (JavaScriptで高さ追加されてしまうので、それを打ち消しています。)
.p-manager-profile {
  &__textarea {
    // 「続きを見る」ボタンの親要素につける
    position: relative;
    // 「続きを見る」ボタンの高さ分、余白を確保
    padding-bottom: 42px; //アコーディオンのトグル部分
    // (装飾部分)
    text-align: justify;
    text-align-last: left;
  }

  //アコーディオンのトグル部分-----------
  &__button-toggle {
    cursor: pointer;
    caret-color: transparent;

    position: absolute;
    right: 0;
    left: 0;
    bottom: 0;

    display: flex;
    align-items: center;
    justify-content: flex-end;
    width: 100%;
    min-height: 42px;
    z-index: 3; //他の要素より上に表示するため


    & > span {
      font-size: 15px;

      &::after {
        content: "";
        display: inline-block;
        margin-left: 1.5em;
        width: 9px;
        height: 9px;
        border-right: 1px solid var(--color-main);
        border-bottom: 1px solid var(--color-main);
        transform: translateY(-25%) rotate(45deg);
        transform-origin: center;
        transition: 0.3s;
      }

      .open-text {
        display: inline-block;
      }

      .close-text {
        display: none;
      }
    }
  }

  //アコーディオン部分(高さ改変)-----------
  &__hide-box {
    position: relative;
    height: 32vw; //高さ初期値(JavaScriptと揃えておく)
    overflow: hidden;
    transition: height 300ms ease;
    will-change: height; //動きを滑らかにする

    @include s.media(md) { 
      //タブレット・pcの時
      height: 12em; //高さ初期値(JavaScriptと揃えておく)
    }

    //はみ出た部分(省略記号っぽく見せる)
    &::after {
      content: "...";
      display: inline-block;
      position: absolute;
      right: 0;
      bottom: 0;
      background: #fff;
    }

    //【追加】短い時、JavaScriptの高さを強制的に無効にする
    &.is-short {
      height: auto !important;
    }
  }

  //アコーディオン開いているとき------------
  .is-active {
    #{$this}__button-toggle {
      & > span {
        &:after {
          transform: translate(0%, 25%) rotate(225deg);
        }

        .open-text {
          display: none;
        }

        .close-text {
          display: inline-block;
        }
      }
    }

    #{$this}__hide-box {
      height: auto;

      &::after {
        display: none;
      }
    }
  }
}

まとめ:UX向上にもSEOにも効果的な「続きを読む」ボタン

長文コンテンツを読みやすく整理する「続きを読む」アコーディオンは、
ユーザー体験(UX)の向上だけでなく、ページ滞在時間の増加にもつながり、
間接的にSEOにも貢献します。

WordPressで動的に出力されるACFフィールドや投稿本文でも活用できるので、
カスタマイズ性の高いサイト制作におすすめ
の実装方法です。

よくある質問(FAQ)

Q. この実装はSEOに悪影響はありませんか?

A. JavaScriptで高さを制御しているだけで、HTML上のテキストは全て読み込まれているため、SEOには影響ありません。

Q. 「続きを読む」ボタンを複数設置できますか?

A. .js-accordion クラス単位で処理しているため、複数のアコーディオンをページ内に設置可能です。

WordPressに「続きを読む」ボタン(アコーディオン)を実装する方法【スマホ・PC対応】

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメント一覧 (1件)

目次