2026年7月18日

2026年7月18日

WordPressのテーマにソーシャルシェアボタンを追加するコード例(プラグインなし)

プラグインを使わずにソーシャルシェアボタンを付けるなら、各SNSが用意している「シェア用URL」へのリンクを、子テーマの functions.php で記事末尾に差し込む方法が手軽で軽量です。この記事では、X・Facebook・LINE・はてなブックマークのボタンを出すコード例と、クラシックテーマ/ブロックテーマそれぞれでの組み込み方、表示されないときの確認ポイントまでを解説します。

リンク型のシェアボタンを選ぶ理由

シェアボタンの作り方は大きく2通りあります。SNSが配布する公式スクリプト(JavaScript SDK)を読み込む方法と、シェア画面を開くURLへ普通のリンクを張る方法です。

公式スクリプトは「いいね数」などを表示できる反面、ページ表示のたびに外部のスクリプトや Cookie が読み込まれ、表示速度やプライバシーの面で負担になります。リンク型は外部への通信がクリックした時だけで済み、テーマ側のCSSで見た目も自由に整えられます。数の表示が不要なら、リンク型で十分なことがほとんどです。

なお、ブロックエディターにある「ソーシャルアイコン」ブロックは、自分のSNSアカウントのプロフィールへ誘導するためのものです。読者が記事をシェアするボタンとは役割が違うので、今回のような用途には向きません。

作業前の準備

コードは親テーマではなく子テーマの functions.php に書きます。親テーマに直接書くと、テーマの更新で消えてしまうためです。子テーマがまだない場合は先に作成してください。

また、functions.php の書き間違いはサイト全体を表示できなくする原因になります。編集前にファイルのバックアップを取り、管理画面のテーマファイルエディターではなく、FTPやサーバーのファイルマネージャーで編集すると、エラー時にすぐ元へ戻せます。

シェアボタンのHTMLを作る関数

まず、記事のURLとタイトルからボタン一式のHTMLを返す関数を用意します。ここでは出力と組み込みを分けておき、後でクラシックテーマ・ブロックテーマのどちらにも使い回せるようにします。

<?php
// 子テーマの functions.php に追記
function mytheme_share_buttons( $post = null ) {
	$post = get_post( $post );
	if ( ! $post ) {
		return '';
	}

	$url   = get_permalink( $post );
	// タイトルの &#8217; などの文字参照を元の文字に戻してからURLエンコードする
	$title = html_entity_decode( wp_strip_all_tags( get_the_title( $post ) ), ENT_QUOTES, get_bloginfo( 'charset' ) );

	$services = array(
		'x'        => array(
			'label' => 'X',
			'href'  => 'https://twitter.com/intent/tweet?url=' . rawurlencode( $url ) . '&text=' . rawurlencode( $title ),
		),
		'facebook' => array(
			'label' => 'Facebook',
			'href'  => 'https://www.facebook.com/sharer/sharer.php?u=' . rawurlencode( $url ),
		),
		'line'     => array(
			'label' => 'LINE',
			'href'  => 'https://social-plugins.line.me/lineit/share?url=' . rawurlencode( $url ),
		),
		'hatena'   => array(
			'label' => 'はてブ',
			'href'  => 'https://b.hatena.ne.jp/add?mode=confirm&url=' . rawurlencode( $url ) . '&title=' . rawurlencode( $title ),
		),
	);

	$html = '<nav class="share-buttons" aria-label="この記事をシェア"><ul class="share-buttons__list">';
	foreach ( $services as $key => $service ) {
		$html .= sprintf(
			'<li><a class="share-buttons__link share-buttons__link--%1$s" href="%2$s" target="_blank" rel="noopener noreferrer">%3$s</a></li>',
			esc_attr( $key ),
			esc_url( $service['href'] ),
			esc_html( $service['label'] )
		);
	}
	$html .= '</ul></nav>';

	return $html;
}

ポイントは3つあります。

  • タイトルの文字参照を戻す: get_the_title() は表示用に整形された値を返すため、アポストロフィなどが &#8217; のような文字参照になっていることがあります。そのままURLに入れるとシェア文に記号の羅列が出るので、html_entity_decode() で戻してから rawurlencode() します。
  • URLパラメータは rawurlencode()、属性は esc_url(): パラメータ部分をエンコードしたうえで、href 全体を esc_url() でエスケープします。
  • 別タブで開くリンクには rel="noopener noreferrer": 開いた先のページから元のページを操作されないようにするためです。

各SNSのシェア用URLの形式は、サービス側の都合で変わることがあります(2026年10月現在、上記の形式で動作するものとして記載しています)。X は x.com ドメインのURLも案内されていますが、twitter.com の形式も転送されて使える状態です。公開前に実際にクリックして、シェア画面が開くかを確かめてください。

記事の末尾に自動で差し込む

関数ができたら、the_content フィルターで投稿本文の後ろに追加します。

<?php
add_filter( 'the_content', function ( $content ) {
	// 投稿の個別ページで、表示中の記事そのものの本文にだけ付ける
	if ( ! is_singular( 'post' ) || get_the_ID() !== get_queried_object_id() ) {
		return $content;
	}
	return $content . mytheme_share_buttons();
} );

条件を付けている理由は、the_content フィルターが「関連記事の抜粋」や「ウィジェット内の投稿表示」など、本文以外の場面でも呼ばれることがあるためです。表示中のページのIDと処理中の投稿IDが一致する時だけ追加すれば、関連記事の一覧にまでボタンが並ぶといった重複を防げます。固定ページにも出したい場合は、is_singular( 'post' ) を is_singular( array( 'post', 'page' ) ) に変えます。

この方法は、クラシックテーマでもブロックテーマでも動きます。ブロックテーマの「投稿コンテンツ」ブロックも本文の出力時に the_content フィルターを通すためです。

好きな位置に置きたい場合

記事の冒頭や、タイトル直下など本文以外の場所に置きたいときは、組み込み方を変えます。

クラシックテーマでは、親テーマの single.php(または single.php から呼ばれる template-parts 内のファイル)を子テーマに同じパスでコピーし、置きたい位置に次の1行を書きます。関数内でエスケープ済みなので、そのまま echo して問題ありません。

<?php echo mytheme_share_buttons(); ?>

ブロックテーマでは、ショートコードとして登録しておき、サイトエディターで「単一投稿」のテンプレートを開いて「ショートコード」ブロックを置く方法が扱いやすいです。この場合は、前の節の the_content フィルターは外しておかないと、ボタンが2か所に表示されます。

<?php
add_shortcode( 'share_buttons', function () {
	return mytheme_share_buttons();
} );

ショートコードブロックには [share_buttons] と入力します。

見た目を整えるCSS

スタイルは子テーマ内のCSSファイルにまとめ、投稿ページでだけ読み込みます。

<?php
add_action( 'wp_enqueue_scripts', function () {
	if ( is_singular( 'post' ) ) {
		wp_enqueue_style(
			'mytheme-share',
			get_stylesheet_directory_uri() . '/css/share.css',
			array(),
			'1.0.0'
		);
	}
} );
/* 子テーマの css/share.css */
.share-buttons__list {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 2em 0 0;
	padding: 0;
	list-style: none;
}
.share-buttons__link {
	display: inline-block;
	padding: 8px 16px;
	border-radius: 4px;
	color: #fff;
	font-size: 14px;
	text-decoration: none;
}
.share-buttons__link--x { background: #000; }
.share-buttons__link--facebook { background: #1877f2; }
.share-buttons__link--line { background: #06c755; }
.share-buttons__link--hatena { background: #00a4de; }

CSSを変更しても見た目が変わらないときは、wp_enqueue_style() の最後の引数(バージョン)を上げると、ブラウザやCDNに古いCSSが残っていても新しいファイルが読み込まれます。

表示・動作を確認する

組み込んだら、次の順で確かめます。

  1. ログアウトした状態で表示を見る: キャッシュプラグインを使っている場合、ログイン中はキャッシュを通らないため、ログアウト時だけ古いページが出ることがあります。表示されなければページキャッシュを削除します。
  2. 各ボタンをクリックする: シェア画面にURLとタイトルが入っているかを確認します。タイトルが文字化けしていたら、エンコード前の文字参照の戻しが効いていない可能性があります。
  3. シェア時のプレビュー(カード)を確認する: 画像や説明文が意図どおりに出るかは、ボタンではなくページ側のOGPタグで決まります。Facebook はシェアデバッガーで取得内容を確認できます。OGPが未設定なら、SEOプラグインなどで設定しておきます。
  4. PHPエラーが出ていないか: 画面が真っ白になった、ボタンの位置に警告文が出た、という場合は wp-config.php で WP_DEBUG と WP_DEBUG_LOG を有効にし、wp-content/debug.log を確認します。確認が済んだら本番では無効に戻してください。

スマートフォンのブラウザ標準の共有シートを使いたい場合は、JavaScript の Web Share API(navigator.share)を組み合わせる方法もあります。対応していないブラウザ向けに、今回のリンク型ボタンを残しておくと安心です。

まとめ

  • シェアボタンは、各SNSのシェア用URLへのリンクで作ると外部スクリプトが不要で軽量です。
  • コードは子テーマの functions.php に書き、タイトルは文字参照を戻してから rawurlencode()、href は esc_url() でエスケープします。
  • 記事末尾に出すなら the_content フィルター、位置を指定したいならクラシックテーマは single.php、ブロックテーマはショートコードブロックを使います。
  • シェア時のカード表示はOGP次第なので、ボタンと合わせて確認します。シェアURLの形式は変わることがあるため、定期的にクリックして動作を確かめてください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲