カテゴリーアーカイブ 日々のこと

Ninja Formsでコンバージョンを取る

Ninja Formsで完了ページを別途作ってないけどGoogle Analyticsでコンバージョンが取りたい。
どのフォームからかに加えて、どのタイプに申し込んだかも取れるようにしたい。

基本的な設定方法

こちらのページが参考になる。

大まかな流れ

  • 送信(nhFormSubmitResponseイベントの発火)時にjQueryデータレイヤーにイベントとパラメータを送信するタグを作成、トリガーは全ページ
  • 上記のタグでデータレイヤーに発信されたイベント「ninjaFormSubmission」発火を検知してアナリティクスにイベントを送信するタグを追加
  • そのタグのラベル部分でフォームIDなどを渡すことで判別可能に
  • アナリティクス側では受け取ったイベントのフォームIDなどで目標を振り分け

フォームID以外の情報を渡す

nfFormSubmitResponseのコールバック関数の引数responseの中にはフォーム送信データがごっそり入っているので、response.response.data.fields_by_key を使えば幸せになれる。

Ninja Formsで「business-type」というフィールドキーを設定したフィールドの値を、BusinessTypeというデータレイヤー変数に渡すようにした。カスタムJSは以下のような形。

<script>
jQuery(document).ready( function() {
  jQuery(document).on('nfFormSubmitResponse', function(event, response, id) {
      dataLayer.push ({
            'event' : 'ninjaFormSubmission',
            'NFformID' : response.id,
            'BusinessType' : response.response.data.fields_by_key['business-type'].value
        });
     });
});
</script>

うっかりフィールドキーにハイフンを使っていたためドットシンタックスで指定できなくて躓いた。

Custom Field Suite をWordPressマルチサイトに対応させる

※こちらの方法はプラグインソースを直接編集している無理やりな方法です。最初からマルチサイトに対応しているプラグインを選択できるならそちらのほうをおすすめします(ACFとか)。

Custon Field Suiteはもともとマルチサイト非対応で、最初に CFS()->get() が呼び出されたblog_idのプレフィクスのwp_postテーブルに対するselectクエリをキャッシュとして保持し、使い回すため、switch_to_blogするとその後のCFS()->get()で正しく結果を受け取れないという動作が発生してしまっていた。

includes/field_group.php 15行目あたりのキャッシュを返す処理を無効化すれば、switch_to_blogしても動作するようになったが、そうするとクエリ数が膨大になってしまう。

キャッシュ部分をよく見るとCustom Field Suiteのキャッシュはマルチサイトを想定していない配列に確保していたので、ここをマルチサイトに対応した構造にカスタマイズ。

includes/field_group.php
public function load_field_groups() {
    global $wpdb;
        
    /*
    if ( isset( $this->cache['field_groups'] ) ) {
        return $this->cache['field_groups'];
    }
    */
    if ( isset( $this->cache['field_groups'][$wpdb->posts] ) ) {
        return $this->cache['field_groups'][$wpdb->posts];
    }        
        ...中略...

    //$this->cache['field_groups'] = $output;
    $this->cache['field_groups'][$wpdb->posts] = $output;

    return $output;
}
includes/api.php
public function get_field( $field_name, $post_id, $options ) {
    global $wpdb,$post; //$wpdbを追加

    ...中略...

    // Trigger get_fields if not in cache
    //if ( ! isset( $this->cache[ $post_id ][ $options['format'] ][ $field_name ] ) ) {
    if ( ! isset( $this->cache[ $wpdb->posts ][ $post_id ][ $options['format'] ][ $field_name ] ) ) {
        $fields = $this->get_fields( $post_id, $options );
        return isset( $fields[ $field_name ] ) ? $fields[ $field_name ] : null;
    }
    return $this->cache[ $wpdb->posts ][ $post_id ][ $options['format'] ][ $field_name ];
}
public function get_fields( $post_id, $options ) {
    global $post, $wpdb;

    ...中略...

    // Return cached results
    //if ( isset( $this->cache[ $post_id ][ $options['format'] ] ) ) {
    if ( isset( $this->cache[ $wpdb->posts ][ $post_id ][ $options['format'] ] ) ) {
        return $this->cache[ $wpdb->posts ][ $post_id ][ $options['format'] ];
    }

    ...中略...

    //$this->cache[ $post_id ][ $options['format'] ] = $field_data;
    $this->cache[ $wpdb->posts ][ $post_id ][ $options['format'] ] = $field_data;
    return $field_data;
}

これで無駄なクエリ数も抑えられた…と思う。
直接ソースを弄っているので、当然アップデートすると元に戻ってしまうので注意。

iPadでCSS opacity animationが動作しない

特定のiPad(iPadOS12.4.1(16G102))のSafariとChromeで、opacityを使ったフェードインCSS animationが動作してくれなかった。なんでかなと調べたら、初期化用opacityは0/1、keyframes側では0%,100%を使用、と単位が違っていたからのようだ。

@keyframes fadeIn{
    0%  {opacity: 0%;}
    100%{opacity: 100%;}
}
.fade-in-element {
    opacity: 0; /* 単位が%でない! */
    animation: fadeIn 1s;
}

単位を%で統一するか、逆に0/1で統一するとちゃんと動作した。
より新しいバージョンのiPhoneやWindowsでは単位が違っていても解釈してくれていたようだ。
念の為メモ。

opacity – CSS: カスケーディングスタイルシート | MDN

によれば、opacityプロパティの取りうる値は<alpha-value>、
0.0以上1.0以下の<number>か、0%~100%の<percentage>となっている。
古いバージョンではこれが混在すると別プロパティとして取り扱われてしまっていたのかもしれない。

iOSでsvgストロークアニメーションが動かない

PC, Androidでは動くのに、iOS(iPhoneのSafari, Chromeなど)でsvgのストロークアニメーションが動かないケースに出くわした。

.path-stroke {
	stroke: #FFF000;
	stroke-width: 2px;
	animation: svg-stroke 5s ease-in;
}
@keyframes svg-stroke {
	0% {
		stroke-dasharray: 2000;
		stroke-dashoffset: 2000;
	}
	100%{
		stroke-dashoffset: 0;
	}
}

原因としては、keyframes内のstroke-dasharrayプロパティが開始位置にしかいないことだった。どうやら変化しないプロパティがkeyframes内にあると不具合を起こすっぽい。
以下のように変更したら動作した

.path-stroke {
	stroke: #FFF000;
	stroke-width: 2px;
	stroke-dasharray: 2000; /* 変化しないプロパティはこちらに移動 */
	animation: svg-stroke 5s ease-in;
}
@keyframes svg-stroke {
	0% {
		/*stroke-dasharray: 2000;*/
		stroke-dashoffset: 2000;
	}
	100%{
		stroke-dashoffset: 0;
	}
}

よ!

Myst Online フォーラム(Again)

https://www.greenyouth.cc/myst/forum/

気づいたらMyst Online Forumが閉鎖していたので、避難所としてのフォーラムを作ってみました。よかったら使ってみてください…といっても本家でアナウンスできないからあちらの常連さんに伝える方法がない…まあ気長に待ってみますか。

ティアナの書─Book of Ti’ana

ティアナの書─Book of Ti’ana 日本語訳のページを作成しました。どこまで気力が続くかわかりませんが、ぼちぼち追加していければいいなと思います。

Book of Ti’anaはBook of Atrus(日本語訳が出版されていたが絶版)に続く2作目のMYSTクロニクル・サポートストーリーです。地上人であるアトラスの祖母アナと、地下文明ドニの出会い、そして滅亡までが描かれており、滅亡前のドニ文化が当時の視点で描写されているのはこれだけではないでしょうか。

前作アトラスの書の主人公、アトラスの名前の由来である祖父にあたるアトラス(同名)が主人公で、アナとの間に生まれるゲーンも登場します。ゲーンが何故あれほどまでにドニ文化の復活を望み、そして歪んだのかの一端も語られるのではないかと思います。

 

WordPress 管理画面ログインでCSS崩れ

サーバー引っ越しをした際に load-styles.php の読み込みでエラーになったわけである。
WPバージョンは4.8.2
PHPはいずれも5.6.30

色々追っかけてみるとphp.ini で2つの値の違いが見つかった。
output_handler
mbstring.encoding_translation

正常動作する方は
output_handler は設定されておらず
mbstring.encoding_translation = Off

エラーを出す方は
output_handler = mb_output_handler
mbstring.encoding_translation = On

だった。

Chromeで「PDFドキュメントを読み込むことができませんでした」と出た

Chromeで上記メッセージとともにPDFが表示されない現象が発生。
ファイルサイズが1MB以下程度であれば発生しない。
Microsoft Edge, IE11でもダウンロードが途中で止まっているような気配。
Firefox,Safariでは問題なし。

僕のケースの場合、原因は.htaccessにおけるmod_deflate使用の記述でした。

<IfModule mod_deflate.c>
   SetOutputFilter DEFLATE
</Ifmodule>

としていたことが原因。SetOutputFilter行をコメントアウトしたら解決。
コンテンツを圧縮して転送量を減らしてくれるモジュールなんですが、それがPDFになにかしら悪影響を与えていた様子。

Obduction ─ さわり部分の翻訳

Obductionはじめました。さわりの部分の雑訳。
一部自分でも意味不明なところがあるので鵜呑みにすると実際アブナイ。いいね?

Introduction / Unknown

私たちはみな、全てを失った──
残ったのは、それぞれの物語だけ…
この物語は、忘れられてはならない

私は3歳だった…
1983年4月
セシル、あなたにとっては1870年だったわね

サムとベラ──
あなた達は昨日のことのように話すけど、
あれから62年も経っているの…
あの閃光を見てから

あの光…
あれがすべての物語の始まりだったわ
それは…空を駆け…
美しく…でも怖さも感じた

真昼に見ても
ヨーゼフ、あなたはすばらしく明るいと言っていたけど──
夕暮れ時、それは魅惑的だったわ…

セシルのように森の奥深くで
またはジェーンとジェニーのように、町のすぐ外で
いずれにせよ、私たちは…
もっとよく見ようと引き寄せられた
ベラ、あなたは笑顔だったのを思い出すと言っていたわね

あなた達の何人かは一人だったけど、私は違ったわ

私の愛する祖母は、それを幸運を知らせる祖霊かなにかだと思って喜んだ
彼女に神の加護を
祖母はポーチにいる私を乳母車に乗せて庭へ歩き出し
そして私たちはそれを目の当たりにしたの…

まったく理由はわからないけれど…
でも、そうね…
私たちはそれについて行った

私たちはなんだか
不安を感じたわ…それでもまだ
惹きつけられていたの

私たちが近づくと…
それも近づいてきたわ

みな覚えているでしょう…
だれも引き返す人はいなかった

それは高度な…
まるで…
意思を持つように…
回転して…
ゆっくりと…そう…

それは私たちを見つけた──それぞれの私たちを
私たちはそれらの物語を伝えていかなければならないわ
なぜならあれが私たちを救ったのだし…そして…そう…
きっとそれ以上の意味があるはずだから…

Hunrath Image Viewer – Welcome / Josef

[ファンファーレ]
ハロー!
ボンジュール!
チャオ!
オラ!
ハロー!
ショーラー!
ニーハオ!
フンラスへようこそ。
私はヨーゼフ、
ここの町長だ。
おそらく君は混乱して途方に暮れていることだろう。
だが安心して欲しい、大丈夫だ。
この体験をしたのは君が初めてではない。
君の前にここへやって来た人々が、
君の順応を助けてくれるだろう。
この道をまっすぐ進むと、
白い垣根のある家がある。
そこでファーリーと会えるだろう。
そしてここでの新しい生活について教えてくれるはずだ。
[停止]

Hunrath Image Viewer – Farley’s Community Center / Farley

[ファンファーレ]
ハイ、ええと…ファーリーよ。
きっとこれを見ていると思うけど、
私は今ちょっと─[停止、上書きされた映像が始まる]
…念のため…
ようこそ、ここは…安全じゃないわ。
とにかく、私たちは戦いを始めようとしてる。
あなたが何を見つけるか知らないけど、
ただ言えることは…
あなたが信じる人に気を付けて。
ここにはC.W.がいるかもしれない。
知らないけど。
ただ、気を付けて。
行かなくちゃ。
[停止、元の映像に戻る]
…すぐ会えるわ。
そして…パニックにならないで。
この状況は落ち着かないと思うけど、
フンラスはまともな場所だってことがわかってもらえると思うわ。
[停止]

Hunrath / C.W.(A)

[物音]

どうしてこんなにクソ長い間帰ってこなかった!?
お前の仕事…

俺はてっきり…

一体全体君は誰だ?
[ため息]
やれやれ、新入りか?
今?

まずい時にやってきたな。

あいつら、だから話を聞けといったんだ…
[ため息]

あー…俺は家へ帰る。

もしかしたら君にとっていいタイミングだったかもな。
他の奴らより随分早く、
この牢獄から出られるかもしれん。

よーし、いいだろう。
俺にとってもいいタイミングかもしれん。
これ以上待ってられん。

一人でも全部できるとは思うが、
うむ…君の助けを借りれば、多少スピードアップになる。

まずは…
君はこの場所全体を知っておくべきだ。
クソッたれモーファンとの戦いに…
備えるために。
穴を全て塞がなきゃならん。
ここには若干の電力が来ているが、
全て必要だ。
もし君が手伝ってくれるなら…
…全ての電線をつなげ…
私の装置を動かすことができる。

今こそ…
この場所から脱出してやろう。

Obduction ─ Screenshot Update

Backers向けにスクリーンショットが公開されていた。
画像はCyan,Incからの転載

Revelationのスパイアを彷彿とさせますな。

公開は今年半ばから後半とのことだったので、予定どおり進んでいるならもうじき歩き回れますね。
楽しみです。