皆さま引き続きコロナには気をつけてお過ごしください!

【WordPress】プラグインなしで吹き出しを入れよう

アイキャッチ 吹き出しを増やそう WordPress


WordPressには様々なプラグインがあります。

 

Word Balloonというプラグインを使うと、

簡単に吹き出しを入れることができますが、

 

残念ながら、そのままですと、写真わくに入れられるのは男性のシルエット(なぞの人)だけです。

男性吹き出し

 

1人のつぶやきとして使うなら、

選ぶだけでいろいろなバリエーションの吹き出しを作ることができ、

これだけで十分なのですが、

もっといろいろ入れて、会話形式にできたらいいなぁと、

前回の記事を書きながら思っていました。

 

今回は、会話形式で使える吹き出しを

プラグインなしで入れられるようにしてみたいと思います。

 

スポンサーリンク

吹き出しとは

主に漫画で登場人物のセリフを表現するために、絵の中に設けられる空間のこと。「吹き出し」とも書く。英語では”Speech balloon”という。

引用:wikipedia

一人考えている時の吹き出し、

吹き出し

悩んでもやもやしているときの吹き出し、

吹き出し

電話の会話の吹き出し

吹き出し

伝言でんごんするときの吹き出し

吹き出し

怒っているときの吹き出し

吹き出し(怒り)

など、様々な吹き出しに加え、感情を表すイラストを一緒に使うことで、

そのときの感情を可視化かしかして見せることができますね。

 

スポンサーリンク

吹き出し作成参考サイト

いくつか、吹き出しを作成されている方のブログを拝見しました。

吹き出し用のHTMLとCSSを記述する形式が多い中、

ナコさんのブログでは、PHPとCSSで吹き出しを作られており、

更に、クリックタグ化もされていて、とても魅力的みりょくてきです✨

 

ここからは、ナコさんのブログを参考に、

にゃこ
こんなのを作りたい!

と思います★

 

 

スポンサーリンク

吹き出しの設定に必要なもの

吹き出しを使うために変更が必要なファイルは何があるのでしょうか?

 

吹き出しを設定するには、以下2か所の設定と、アイコン用画像が必要です。

  1. functions.php
  2. style.css

①functions.php

利用しているテーマ内で汎用的はんようてきに使われるコードを記載するファイルです。

共通的に利用する関数などを記載しておき、

その関数を使いたい場所(例えば投稿画面)で、呼び出すことで使うことができます。

このファイルに、吹き出しを使うための関数を記述します。

 

②style.css

見え方を設定するファイルです。

吹き出しのデザイン設定コードを記述します。

 

スポンサーリンク

吹き出しを設定しよう①(アニメーション用ファイルのダウンロード)

アニメーション用のマーク(怒り、汗など)を使う準備をしたいと思います。

 

ダウンロード手順

①ナコさんブログの下記リンクで

「動く会話チャット画面Ver.1.0をダウンロードする(balloon_animetion_css.zip)」をクリックする。

ナコさんブログDL

なお、zipファイルの中身は以下となっております。

ファイル名 内容
nakolog-code-balloon_animetion_css 解凍かいとうフォルダ
│ README.md 使い方
└─balloon_animetion_css
 │ function.php 追記するコード
 │ index.html サンプルHTML(利用例)
 │ style.css 追記するコード
 │ style.min.css
 │ style.scss style.cssと同じ内容
 │
 └─icon
   icon_angry.svg 怒りマーク用の画像ファイル
   icon_down.svg 気分ダウンマーク用の画像ファイル
   icon_heart.svg ハートマーク用の画像ファイル
   icon_shock.svg ガーンマーク用の画像ファイル
   icon_sweat.svg 汗マーク用の画像ファイル
   icon_trouble.svg 困ったマーク用の画像ファイル
   icon_up.svg 気分UPマーク用の画像ファイル
   img_angry.png なこさんの怒り顔画像ファイル
   img_down.png なこさんの気分ダウン顔画像ファイル
   img_heart.png なこさんの喜び顔画像ファイル
   img_shock.png なこさんのショック顔画像ファイル
   img_sweat.png なこさんの焦り顔画像ファイル
   img_up.png なこさんの気分UP顔画像ファイル

※今回使うのは、青字部分のファイルです。

 

②zipファイルを解凍する。

③WordPressサーバ上にファイルをアップロードするため、SCPにログインする。

※私はwinSCPを利用しています。

④iconフォルダを以下に配置する。

WordPressディレクトリ/wp-content/themes/<利用しているテーマ>

 

スポンサーリンク

吹き出しを設定しよう②(人物等ファイルの)アップロード

にゃこ
この猫の顔のようなイラストファイルを準備します

 

ファイルはご自身で作られても、

アイコン作成サイト等を利用されても構いません。

ただ、正方形がいいようです。

 

今回私が使ったアイコンは「フリーペンシル」さんのを利用させていただきました。

フリーペンシルさん

優しいタッチの、かわいいイラストがたくさんあります★

 

作成したら、先ほどSCPでアップロードしたiconフォルダ内に、アップロードしましょう。

WordPressディレクトリ/wp-content/themes/<利用しているテーマ>/icon

※WordPress のメディアにアップロードし、
URLを確認する方法でも問題ありません。

 

スポンサーリンク

吹き出しを設定しよう③(functions.php)

吹き出しを設定したいと思います。

まずは、バックアップを取ってから、設定をしていきましょう。

 

functions.phpの編集手順

「Snippets」というプラグインを使って編集をします。

※本来、functions.phpは利用しているテーマフォルダの中にあるファイルを編集しますが、

Snippetsを使うと、どのテーマからもSnippetsのコードを呼び出すことができるため、

もしテーマを変更したとしても、もう一度functions.phpを編集しなくてもよくなります。

①Snippetsプラグインの「Add New」をクリックする。

snippets追加

②任意のタイトルをつける。

③ダウンロードしたfunctions.phpの1行目「<?php」部分を削除し、

残りのコードをコード記入欄に貼り付ける。

③「Run snippet everywhere」を選択し、「Save changes」をクリックする。

④追加したsnippetが有効になっていることを確認する。

有効化

 

スポンサーリンク

functions.phpに設定したコードの意味を確認しよう

ただ書くだけでも使う分には問題ないですが、

折角なので、コードの意味を確認し、理解を深めたいと思います。

 

クイックタグ用コード

  • function add_button_quicktag() {

add_button_quicktagという名前の関数を作ります。

 

  • function add_button_quicktag() {
  •     ?>
  •     <script type=”text/javascript”>
  •     </script>
  •     <?php

script typeにJavaScriptを指定することで、

?> から <?php で囲った部分までがJavaScriptコードとして出力されて呼びだされるようになります。

 

例えば以下のようなJavaScriptです。

コード

WordPressの記事作成画面で、「テキスト」を設定したときに表示するクリックタグを追加しています。

クリックタグ

 

記事作成画面で「ふきだし(汗)」という名前のクリックタグをクリックすると、
anime_balloon position=”left” name=”名前” text=”本文” img=”icon/img_sweat.png” animetion=”icon_sweat”

の文字を表示し、
必要に応じて、以下を変更します。

項目 変更内容
position 吹き出し画像を表示する位置(left / right)
name 吹き出し画像の下につける名前
text 吹き出しの中に入れる言葉
img 吹き出し画像として使う画像のアドレス
※絶対パス、
もしくは、
functions.phpがあるフォルダから見た相対そうたいパス

※functions.phpは以下フォルダ内にあります。

WordPressディレクトリ/wp-content/themes/<利用しているテーマ>/functions.php

 

以下フォルダに画像ファイルを置いたとします。

WordPressディレクトリ/wp-content/themes/<利用しているテーマ>/icon/img_sweat.png

この場合、以下のように指定します。

相対パス icon/img_sweat.png
絶対パス <サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/img_sweat.png

 

  • add_action(‘admin_print_footer_scripts’, ‘add_button_quicktag’);

作成した関数を呼び出して実行します。

※add_action関数の詳細はCODEXご参照。

アニメ吹き出し用ショートコード

  • function anime_balloon_func($atts) {
  •  ~~~
  • }

anime_balloon_funcという名前の関数を用意します。

 

  •     shortcode_atts( array(
  •         ‘animetion’ => ”,
  •         ‘position’ => ”,
  •         ‘img’ => ”,
  •         ‘name’ => ”,
  •         ‘text’ => ”,
  •     ), $atts )

arrayは配列はいれつと言います。

電車を思い浮かべてみてください。

1つ1つの項目が1両だと思ってみてください。

その車両の中に”animetion”、”position”などのデータを入れています。

配列

 

shortcode_attsという関数は下記のように使われます。

shortcode_atts(
【必須】使用したいキーとデフォルト値の宣言[],
【必須】ショートコードに渡されたキーと値[],
【任意】フィルター用の文字列
);

 

【必須】使用したいキーとデフォルト値の宣言[]

例えば、今回では「’animetion’ => ”」はanimetionという配列の1つ目に空データをデフォルト値として入れています。

 

今回作成している「anime_balloon_func」関数は、

“animetion”、”position”、”img”、”name”、”text”に値が渡されることを前提に実装されています。

そのため、配列を用意し、それぞれの項目に空データをデフォルト値として入れています。

 

クイックタグボタンをクリックすると、以下のようなコードが表示され、

必要に応じて、””の中を編集して利用します。

anime_balloon position=”left” name=”名前” text=”本文” img=”icon/img_sweat.png” animetion=”icon_sweat”

しかし、想定していない情報を利用者が設定する可能性も0ではありません。

そこで、ショートコードから想定するキーの値が入力値にある場合はそれらをそのまま使い、

なかった場合はデフォルト値を使用することで、入力による誤作動を防いでいます。

 

【必須】ショートコードに渡されたキーと値[]

利用者が設定した値は「$atts」に入っています。

 

  •     extract( shortcode_atts( array(
  •         ‘animetion’ => ”,
  •         ‘position’ => ”,
  •         ‘img’ => ”,
  •         ‘name’ => ”,
  •         ‘text’ => ”,
  •     ), $atts ) );

 

extract関数は、配列を別々に扱うことができるようにする関数です。

 

配列は下記のように車両がつながっている状態でした。

配列

 

これを、電車全体としてではなく、車両個別に使えるようにするものです。

extract関数

 

配列のときは、1つの要素を使いたいときでも、電車全体を呼び出す必要がありましたが、

配列からの呼び出し

バラバラにすると、電車全体を意識する必要がなくなります。

単体呼び出し

 

  •     $code_balloon = <<<EOT
  •  ~~
  • EOT;

code_balloonという箱に、<<<EOT~EOT;で囲まれたコードを代入しています。

1つの箱(変数と言います)に長い文字列を入れる場合に、<<<EOT~EOT;を使います。

この「EOT」という文字列は、必ずEOTにする必要はなく、任意の文字列で構いません。

 

<div class="balloon__contener $animetion">
<div class="balloon__$position">
<figure>
  <span class="icon_emotion"></span>
  <img src="$img" />
  <figcaption>$name</figcaption>
</figure>
<div class="balloon__text">
  $text
</div>
</div>
</div>
  • 吹き出しの位置
  • 吹き出し用の画像
  • アニメーション画像
  • 画像下につける名前
  • 吹き出しに入れる文字

をHTMLコードにセットしています。

 

  •     return $code_balloon;

anime_balloon_func関数の処理が終わると、

code_balloonという箱を結果として返します。

 

  • add_shortcode(‘anime_balloon’, ‘anime_balloon_func’);

作成した関数を呼び出して実行します。

※add_action関数の詳細はCODEXご参照。

 

スポンサーリンク

吹き出しを設定しよう④(style.css)

見た目をよくするために、style.cssを編集しましょう。

 

style.cssの編集手順

※ここでは、Simple Custom CSS and JSプラグインでCSSを追加しますが、

外観>カスタマイズ>追加CSSに記載しても構いません。

①Simple Custom CSS and JSプラグインで、「カスタムCSSの追加」をクリックする。

②任意の名前をつけ、コード記入欄に例えば以下を入力する。

 

「 background: url」の部分は、SVGファイルの保管ディレクトリを指定してください。

相対パスでの記載でも問題ありませんが、

その場合、style.cssをカレントディレクトリとした相対パスを書く必要があります。

パスが間違っていると、アニメーション画像が表示されないため、書いた後、正しく表示されているか確認してください。

にゃこ
パスを間違えると表示されないよ💦

 

/*/////////////////////////////////////////////////
//チャット画面(会話方式)を記事に表示する方法
/////////////////////////////////////////////////*/
.balloon__contener {
  clear: both;
  width: 100%;
  padding: 10px 0;
}

.balloon__contener:after {
  content: ".";
  display: block;
  clear: both;
  height: 0;
  visibility: hidden;
}

.balloon__contener figure {
  width: 60px;
  position: absolute;
  padding: 0;
  margin: 0;
  top: 0;
  /* 正方形を用意 */
}

.balloon__contener figure img {
  border-radius: 50%;
  width: 60px;
  height: 60px;
  border: solid 1px #dddddd;
}

.balloon__contener figure figcaption {
  color: #000000;
  width: 60px;
  position: absolute;
  top: 60px;
  text-align: center;
  font-size: 70%;
  line-height: 100%;
}

.balloon__contener .balloon__left {
  width: 100%;
  position: relative;
  display: block;
  max-width: 80%;
  clear: both;
}

.balloon__contener .balloon__left figure {
  left: 0;
}

.balloon__contener .balloon__left .balloon__text {
  margin-left: 80px;
  position: relative;
  padding: 20px;
  border-radius: 10px;
  background-color: #d8f4f8;
}

.balloon__contener .balloon__left .balloon__text::after {
  content: "";
  position: absolute;
  display: block;
  width: 0;
  height: 0;
  left: -10px;
  top: 12px;
  border-right: 15px solid #d8f4f8;
  border-top: 15px solid transparent;
  border-bottom: 15px solid transparent;
}

.balloon__contener .balloon__right {
  width: 100%;
  position: relative;
  display: block;
  float: right;
  max-width: 80%;
  clear: both;
}

.balloon__contener .balloon__right figure {
  right: 0;
}

.balloon__contener .balloon__right .balloon__text {
  margin-right: 80px;
  position: relative;
  padding: 20px;
  border-radius: 10px;
  background-color: #eeeeee;
}

.balloon__contener .balloon__right .balloon__text::after {
  content: '';
  position: absolute;
  display: block;
  width: 0;
  height: 0;
  right: -10px;
  top: 12px;
  border-left: 15px solid #eeeeee;
  border-top: 15px solid transparent;
  border-bottom: 15px solid transparent;
}

@media only screen and (max-width: 767px) {
  .balloon__contener .balloon__left,
  .balloon__contener .balloon__right {
    max-width: 100%;
  }
}

/*/////////////////////////////////////////////////
//チャット画面(会話方式)にアイコンを追加する方法
/////////////////////////////////////////////////*/
.balloon__contener .icon_emotion {
  width: 30px;
  height: 30px;
  position: absolute;
  top: 0px;
  left: 40px;
  background-size: auto 100%;
  padding: 0;
  z-index: 1;
}

.balloon__contener .balloon__right .icon_emotion {
  left: 0px;
}

/*//// ガーン /////*/
@-webkit-keyframes icon_shock {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 0;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
  }
  51%,
  100% {
    opacity: 1;
  }
}
@keyframes icon_shock {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 0;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
  }
  51%,
  100% {
    opacity: 1;
  }
}

.icon_shock .balloon__left .balloon__text {
  background-color: #c7ade2;
}

.icon_shock .balloon__left .balloon__text::after {
  border-right: 15px solid #c7ade2;
}

.icon_shock .icon_emotion {
  background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_shock.svg") repeat-x 0 0;
  -webkit-animation: icon_shock 1s ease-in-out infinite alternate;
  animation: icon_shock 1s ease-in-out infinite alternate;
}

/*//// 汗 /////*/
@-webkit-keyframes icon_sweat {
  16.65% {
    -webkit-transform: translateX(6px);
    transform: translateX(6px);
  }
  33.3% {
    -webkit-transform: translateX(-5px);
    transform: translateX(-5px);
  }
  49.95% {
    -webkit-transform: translateX(4px);
    transform: translateX(4px);
  }
  66.6% {
    -webkit-transform: translateX(-2px);
    transform: translateX(-2px);
  }
  83.25% {
    -webkit-transform: translateX(1px);
    transform: translateX(1px);
  }
  100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}
@keyframes icon_sweat {
  16.65% {
    -webkit-transform: translateX(6px);
    transform: translateX(6px);
  }
  33.3% {
    -webkit-transform: translateX(-5px);
    transform: translateX(-5px);
  }
  49.95% {
    -webkit-transform: translateX(4px);
    transform: translateX(4px);
  }
  66.6% {
    -webkit-transform: translateX(-2px);
    transform: translateX(-2px);
  }
  83.25% {
    -webkit-transform: translateX(1px);
    transform: translateX(1px);
  }
  100% {
    -webkit-transform: translateX(0);
    transform: translateX(0);
  }
}

.icon_sweat .balloon__left .balloon__text {
  background-color: #a5d4d8;
}

.icon_sweat .balloon__left .balloon__text::after {
  border-right: 15px solid #a5d4d8;
}

.icon_sweat .icon_emotion {
  background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_sweat.svg") repeat-x 0 0;
  -webkit-animation: icon_sweat 1s ease-in-out infinite alternate;
  animation: icon_sweat 1s ease-in-out infinite alternate;
}

/*//// 気分UP /////*/
@-webkit-keyframes icon_up {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    -webkit-transform: translateY(1em);
    transform: translateY(1em);
  }
}
@keyframes icon_up {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    -webkit-transform: translateY(1em);
    transform: translateY(1em);
  }
}

.icon_up .balloon__left .balloon__text {
  background-color: #f0d2a7;
}

.icon_up .balloon__left .balloon__text::after {
  border-right: 15px solid #f0d2a7;
}

.icon_up .icon_emotion {
  background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/img_shock.svg") repeat-x 0 0;
  -webkit-animation: icon_up 1s ease-in-out infinite alternate;
  animation: icon_up 1s ease-in-out infinite alternate;
}

/*//// 怒る /////*/
@-webkit-keyframes icon_angry {
  50% {
    -webkit-transform: scale(1.5);
    transform: scale(1.5);
  }
}
@keyframes icon_angry {
  50% {
    -webkit-transform: scale(1.5);
    transform: scale(1.5);
  }
}

.icon_angry .balloon__left .balloon__text {
  background-color: #e7b3b1;
}

.icon_angry .balloon__left .balloon__text::after {
  border-right: 15px solid #e7b3b1;
}

.icon_angry .icon_emotion {
  background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_angry.svg") repeat-x 0 0;
  -webkit-animation: icon_angry 1s ease-in-out infinite alternate;
  animation: icon_angry 1s ease-in-out infinite alternate;
}

/*//// ハート /////*/
@-webkit-keyframes icon_heart {
  50% {
    -webkit-transform: scale(1.5);
    transform: scale(1.5);
  }
}
@keyframes icon_heart {
  50% {
    -webkit-transform: scale(1.5);
    transform: scale(1.5);
  }
}

.icon_heart .balloon__left .balloon__text {
  background-color: #f9d7e8;
}

.icon_heart .balloon__left .balloon__text::after {
  border-right: 15px solid #f9d7e8;
}

.icon_heart .icon_emotion {
  background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_heart.svg") repeat-x 0 0;
  -webkit-animation: icon_heart 1s ease-in-out infinite alternate;
  animation: icon_heart 1s ease-in-out infinite alternate;
}

/*//// 気分ダウン /////*/
@-webkit-keyframes icon_down {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 0;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
  }
  51%,
  100% {
    opacity: 1;
  }
}
@keyframes icon_down {
  0% {
    opacity: 0;
  }
  50% {
    opacity: 0;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
  }
  51%,
  100% {
    opacity: 1;
  }
}

.icon_down .balloon__left .balloon__text {
  background-color: #adbedb;
}

.icon_down .balloon__left .balloon__text::after {
  border-right: 15px solid #adbedb;
}

.icon_down .icon_emotion {
  background: url("<サイトのトップページアドレス>/wp-content/themes/<利用しているテーマ>/icon/icon_down.svg") repeat-x 0 0;
  -webkit-animation: icon_down 1.3s ease-in-out infinite alternate;
  animation: icon_down 1.3s ease-in-out infinite alternate;
}

※お好みに応じて、

  • 吹き出しの背景色(background-color)や、
  • 吹き出しの枠線(border-left/border-right/border-top/border-bottom)、
  • 吹き出しの角の丸め(border-radius)

を変更することができます。

 

スポンサーリンク

まとめ

いかがでしたでしょうか?

正しく表示されましたか?

 

パスが正しくないと、せっかくの吹き出しがきちんと表示されず、

試行錯誤した結果、結局相対パスではなく、絶対パスで書いてしまいました。

カスタムCSSを利用すると、テーマごとに用意されているファイルと異なるフォルダに配置されます。

パスを書いた後、必ずプレビューして表示を確認しましょう。

 

にゃこ
もっとパスの書き方勉強しないとな💦
タイトルとURLをコピーしました