SWELLのLPにシェアボタンを設置する方法|プラグインなし

swell-sns-sharebutton
  • URLをコピーしました!

SWELLの投稿記事では、標準機能のSNSシェアボタンを利用できます。一方、LPでは投稿記事と同じようにシェアボタンを表示できません。

最初はシェアボタン用のプラグインを使いましたが、設置するのは数件のLPだけです。そのためにプラグインを使い続ける必要はないと考え、カスタムHTMLブロックへ貼り付けるシェアボタンを作成しました。

Facebook、X、はてなブックマーク、LINE、URLコピーに対応しています。複数のページで使う場合は、WordPressの同期パターンに登録すれば一括管理も可能です。

目次

LPに設置するシェアボタンのコード

以下のコードを、LP内でシェアボタンを表示したい場所の「カスタムHTML」ブロックへ貼り付けます。現在開いているページのURLとタイトルを自動で取得するため、LPごとの書き換えは不要です。

このコードは、貼り付けた場所にだけシェアボタンを表示します。サイト全体の記事へ自動表示するものではありません。

<div class="mkt-share-box" data-mkt-share-box>
  <div class="mkt-share-buttons">
    <a class="mkt-share-btn mkt-share-facebook" data-mkt-share="facebook" href="#" target="_blank" rel="noopener noreferrer" aria-label="Facebookでシェア">
      <span class="mkt-share-icon" aria-hidden="true">f</span>
    </a>

    <a class="mkt-share-btn mkt-share-x" data-mkt-share="x" href="#" target="_blank" rel="noopener noreferrer" aria-label="Xでシェア">
      <span class="mkt-share-icon" aria-hidden="true">X</span>
    </a>

    <a class="mkt-share-btn mkt-share-hatena" data-mkt-share="hatena" href="#" target="_blank" rel="noopener noreferrer" aria-label="はてなブックマークでシェア">
      <span class="mkt-share-icon" aria-hidden="true">B!</span>
    </a>

    <a class="mkt-share-btn mkt-share-line" data-mkt-share="line" href="#" target="_blank" rel="noopener noreferrer" aria-label="LINEでシェア">
      <span class="mkt-share-icon mkt-share-icon-line" aria-hidden="true">LINE</span>
    </a>

    <button class="mkt-share-btn mkt-share-copy" type="button" data-mkt-share-copy aria-label="URLをコピー">
      <span class="mkt-share-copy-icon" aria-hidden="true">📋</span>
      <span class="mkt-share-copy-text">コピー</span>
    </button>
  </div>

  <p class="mkt-share-message" data-mkt-share-message aria-live="polite"></p>
</div>

<style>
.mkt-share-box {
  width: min(720px, 100%);
  margin: 2rem auto;
}

.mkt-share-buttons {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(110px, 1.15fr);
  gap: 10px;
  align-items: stretch;
}

.mkt-share-btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 20px;
  padding: 0.6em 1em;
  background: #fff;
  border: 1px solid #ccc;
  border-radius: 2px;
  box-shadow: none;
  text-decoration: none;
  color: #222;
  font-size: 14px;
  font-weight: 700;
  line-height: 1.2;
  cursor: pointer;
  transition:
    background-color 0.2s ease,
    border-color 0.2s ease,
    color 0.2s ease,
    opacity 0.2s ease;
  min-width: 0;
  white-space: nowrap;
}

.mkt-share-btn:hover {
  text-decoration: none;
}

.mkt-share-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  line-height: 1;
}

.mkt-share-facebook {
  border-color: #4267b2;
}

.mkt-share-facebook .mkt-share-icon {
  color: #4267b2;
  font-family: Arial, sans-serif;
  font-size: 1.35rem;
}

.mkt-share-facebook:hover {
  background: #4267b2;
  border-color: #4267b2;
}

.mkt-share-facebook:hover .mkt-share-icon {
  color: #fff;
}

.mkt-share-x {
  border-color: #222;
}

.mkt-share-x .mkt-share-icon {
  color: #111;
  font-size: 1.2rem;
}

.mkt-share-x:hover {
  background: #222;
  border-color: #222;
}

.mkt-share-x:hover .mkt-share-icon {
  color: #fff;
}

.mkt-share-hatena {
  border-color: #00a4de;
}

.mkt-share-hatena .mkt-share-icon {
  color: #00a4de;
  font-size: 1.2rem;
}

.mkt-share-hatena:hover {
  background: #00a4de;
  border-color: #00a4de;
}

.mkt-share-hatena:hover .mkt-share-icon {
  color: #fff;
}

.mkt-share-line {
  border-color: #00c300;
}

.mkt-share-line .mkt-share-icon {
  color: #00c300;
  font-size: 0.75rem;
  letter-spacing: 0;
}

.mkt-share-line:hover {
  background: #00c300;
  border-color: #00c300;
}

.mkt-share-line:hover .mkt-share-icon {
  color: #fff;
}

.mkt-share-copy {
  gap: 0.45em;
  border-color: #999;
}

.mkt-share-copy-icon {
  font-size: 1rem;
  line-height: 1;
}

.mkt-share-copy-text {
  font-size: 0.9rem;
  font-weight: 700;
  color: #333;
}

.mkt-share-copy:hover {
  background: #333;
  border-color: #333;
}

.mkt-share-copy:hover .mkt-share-copy-icon,
.mkt-share-copy:hover .mkt-share-copy-text {
  color: #fff;
}

.mkt-share-message {
  margin: 0.8rem 0 0;
  text-align: center;
  font-size: 0.85rem;
  color: #555;
}

@media (max-width: 767px) {
  .mkt-share-box {
    width: 100%;
    margin: 1.5rem auto;
  }

  .mkt-share-buttons {
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 6px;
  }

  .mkt-share-btn {
    min-height: 34px;
    padding: 0.45em 0.4em;
    font-size: 12px;
  }

  .mkt-share-facebook .mkt-share-icon {
    font-size: 1.15rem;
  }

  .mkt-share-x .mkt-share-icon,
  .mkt-share-hatena .mkt-share-icon {
    font-size: 1rem;
  }

  .mkt-share-line .mkt-share-icon {
    font-size: 0.65rem;
  }

  .mkt-share-copy {
    gap: 0.2em;
  }

  .mkt-share-copy-icon {
    font-size: 0.85rem;
  }

  .mkt-share-copy-text {
    font-size: 0.75rem;
  }
}
</style>

<script>
(function() {
  const shareBoxes = document.querySelectorAll('[data-mkt-share-box]');
  if (!shareBoxes.length) return;

  shareBoxes.forEach(function(box) {
    const rawUrl = location.href;
    const pageUrl = encodeURIComponent(rawUrl);
    const pageTitle = encodeURIComponent(document.title);

    const shareUrls = {
      x: 'https://twitter.com/intent/tweet?url=' + pageUrl + '&text=' + pageTitle,
      facebook: 'https://www.facebook.com/sharer/sharer.php?u=' + pageUrl,
      line: 'https://social-plugins.line.me/lineit/share?url=' + pageUrl,
      hatena: 'https://b.hatena.ne.jp/entry/s/' + rawUrl.replace(/^https?:\/\//, '')
    };

    box.querySelectorAll('[data-mkt-share]').forEach(function(link) {
      const service = link.dataset.mktShare;
      if (shareUrls[service]) {
        link.href = shareUrls[service];
      }
    });

    const copyButton = box.querySelector('[data-mkt-share-copy]');
    const message = box.querySelector('[data-mkt-share-message]');

    if (copyButton) {
      copyButton.addEventListener('click', function() {
        navigator.clipboard.writeText(rawUrl).then(function() {
          if (message) {
            message.textContent = 'URLをコピーしました。';
          }
        }).catch(function() {
          if (message) {
            message.textContent = 'コピーできませんでした。URLを選択してコピーしてください。';
          }
        });
      });
    }
  });
})();
</script>

カスタムHTMLブロックへの設置方法

  1. LPの編集画面を開く
  2. シェアボタンを表示したい場所に「カスタムHTML」ブロックを追加する
  3. 先ほどのコードを貼り付けてページを更新する
  4. 公開ページで各ボタンとURLコピーを確認する

HTML、CSS、JavaScriptを一つのブロックにまとめているので、追加のファイルは必要ありません。専用のクラス名とdata属性を使い、このシェアボタン内だけを処理するようにしています。

編集画面ではボタンが縦並びになったり、表示が簡略化されたりすることがあります。公開ページで横並びに表示され、各ボタンが動作すれば問題ありません。

複数ページで使うなら同期パターンに登録する

一度しか使わない場合は、LP内へ直接貼り付けるだけで十分です。複数のLPで共通のシェアボタンを使う場合は、同期パターンに登録しておくと管理が楽になります。

  1. WordPress管理画面の「外観」から「パターン」を開く
  2. 新しいパターンを追加し、「同期」をオンにする
  3. カスタムHTMLブロックを追加してシェアボタンのコードを貼り付ける
  4. 「SNSシェアボタン」など、判別しやすい名前を付けて保存する
WordPressでSNSシェアボタン用の同期パターンを作成している画面
「SNSシェアボタン」として同期パターンを作成する画面

保存したパターンは、LPの編集画面から通常のブロックと同じように呼び出せます。検索欄へ登録名の一部を入力し、該当するパターンを選択してください。

WordPressの記事編集画面でSNSシェアボタンの同期パターンを呼び出している画面
記事編集画面から「SNSシェアボタン」パターンを呼び出す画面

同期パターンのコードを編集すると、配置済みのページにも変更が反映されます。ボタンの色や文言、表示するSNSをあとから変更するときに、各ページを一つずつ修正する必要がありません。

標準機能・コード・プラグインの選び方

方法向いている用途特徴
SWELLの標準機能通常の投稿記事に表示したいコードやプラグインが不要
今回のコード数件のLPにだけ表示したい必要なLPだけで使用できる
シェアボタン用プラグイン多くのページで使いたい、多数のSNSへ対応したい管理画面から設定しやすい

数件のLPにシェアボタンを追加するだけなら、今回のコードで目的を満たせます。一方、多くのページへの表示や多数のSNSへの対応が必要なら、AddToAny Share Buttonsなどのプラグインを使う方が管理しやすくなります。

この方法の注意点

  • シェアボタンはコードまたは同期パターンを配置したページにだけ表示される
  • Facebook、X、はてなブックマーク、LINE、URLコピー以外を追加する場合はコードの修正が必要
  • 「コピー」ボタンは、現在開いているページのURLをクリップボードへコピーします。原則としてHTTPSのページで動作し、ブラウザの権限や利用環境によってはコピーに失敗することがあります。
  • 同期をオフにしたパターンは、配置後に各ページの独立したブロックになる

ページごとにデザインや表示項目を変えるなら同期オフ、すべて同じ内容で一括管理するなら同期オンが適しています。

実際に設置したシェアボタン

この記事にも、紹介した同期パターンを使ってシェアボタンを設置しています。実際の表示は以下のとおりです。

まとめ

SWELLのLPにシェアボタンを置くなら、カスタムHTMLブロックへコードを貼り付ける方法で対応できます。数件のLPだけで使う場合は、専用プラグインの追加やPHPファイルの編集も必要ありません。

複数のLPで同じボタンを使う場合は、同期パターンに登録しておけば一か所の編集でまとめて変更できます。投稿記事にはSWELLの標準機能、多くのページで使うならプラグイン、数件のLPだけなら今回のコードと、用途に応じて選び分けられます。

  • URLをコピーしました!

コメント

コメントする

目次