<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Webサービス &#8211; WordPress Memo</title>
	<atom:link href="https://blog.riverforest-wp.info/tag/web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.riverforest-wp.info</link>
	<description>WordPress に関する覚え書き</description>
	<lastBuildDate>Sat, 14 Jun 2025 12:53:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.riverforest-wp.info/wp-content/uploads/2018/05/cropped-icon-256x256-1-32x32.png</url>
	<title>Webサービス &#8211; WordPress Memo</title>
	<link>https://blog.riverforest-wp.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>パスワードレスログインの為のプラグイン</title>
		<link>https://blog.riverforest-wp.info/magic-login-mail/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Wed, 05 Jan 2022 00:09:01 +0000</pubDate>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[パスワードレス]]></category>
		<category><![CDATA[ログイン]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=2936</guid>

					<description><![CDATA[はじめに Web サービス（競技会採点システム COMPE-Scoring）上で、パスワードレスログインのために、Passwordless Login というプラグインを使用していました。ログイン時にメールアドレスを入力 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p>Web サービス（<strong>競技会採点システム COMPE-Scoring</strong>）上で、パスワードレスログインのために、<strong>Passwordless Login</strong> というプラグインを使用していました。ログイン時にメールアドレスを入力し、返信されてきたメールのマジックリンクをクリックするとログインできるというものです。ユーザーは２アクション必須なのですが、ログインしているユーザーの管理画面上から複数のユーザー宛てにマジックリンク付きのメールを送信する必要があり、<strong>Magic Login Mail</strong> を作成しました。以下の<strong>動作</strong>の、最初～15秒までが、２アクションのもの、22秒～最後までが１アクションのものです。</p>



<p><strong>Passwordless Login</strong> を改変したものです。コードを見て、ん？と思うところを修正・削除し、上記の１アクションの機能をアクションフックとして追加しました。</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block7548905009d96c22ef3f1438adb362fc {
  float: right;
  padding: 10px;
}
.simpleblogcard_border7548905009d96c22ef3f1438adb362fc {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title7548905009d96c22ef3f1438adb362fc {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description7548905009d96c22ef3f1438adb362fc {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://compe-scoring.com/ja/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border7548905009d96c22ef3f1438adb362fc">
			compe-scoring.com			<div class="simpleblogcard_title7548905009d96c22ef3f1438adb362fc">
				https://compe-scoring.com/ja/			</div>
							<div class="simpleblogcard_description7548905009d96c22ef3f1438adb362fc">
									</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<div class="pluginstatsview-simple-wrap">
	<div>
		<img decoding="async" src="https://ps.w.org/passwordless-login/assets/icon-256x256.png?rev=2190567" alt="Passwordless Login のアイコン" class="pluginstatsview-simple-icon" />
		<div class="pluginstatsview-after-icon">
			<div class="pluginstatsview-bold"><a href="https://www.cozmoslabs.com" class="pluginstatsview-astyle">Passwordless Login</a></div>
			<div class="pluginstatsview-small"><a href="https://www.cozmoslabs.com#reviews" title="5.0(5点満点中)" class="pluginstatsview-astyle">	<span class="pluginstatsview-stars">
					<span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span>
			</span>
	</a></div>
			<div class="pluginstatsview-small">1,000以上サイトで有効化中</div>
		</div>
	</div>
	<div style="clear: both;"></div>
	<div class="pluginstatsview-small">2026-03-31 09:29 時点の統計</div>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<div class="pluginstatsview-simple-wrap">
	<div>
		<img decoding="async" src="https://ps.w.org/magic-login-mail/assets/icon-256x256.png?rev=2649698" alt="Magic Login Mail or QR Code のアイコン" class="pluginstatsview-simple-icon" />
		<div class="pluginstatsview-after-icon">
			<div class="pluginstatsview-bold"><a href="https://wordpress.org/plugins/magic-login-mail/" class="pluginstatsview-astyle">Magic Login Mail or QR Code</a></div>
			<div class="pluginstatsview-small"><a href="https://wordpress.org/plugins/magic-login-mail/#reviews" title="5.0(5点満点中)" class="pluginstatsview-astyle">	<span class="pluginstatsview-stars">
					<span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span>
			</span>
	</a></div>
			<div class="pluginstatsview-small">100以上サイトで有効化中</div>
		</div>
	</div>
	<div style="clear: both;"></div>
	<div class="pluginstatsview-small">2026-03-31 09:29 時点の統計</div>
</div>
</div>
</div>



<h3 class="wp-block-heading">動作</h3>



<figure class="wp-block-video"><video height="720" style="aspect-ratio: 1280 / 720;" width="1280" controls muted src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/magic-login-mail.mp4"></video></figure>



<h3 class="wp-block-heading">使い方</h3>



<ul class="wp-block-list"><li>固定ページに、<code class="language-php language-html">[magic_login]</code>というショートコードを設置するだけです。そのページがログインの為のページになります。</li></ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69cc6346267f3&quot;}" data-wp-interactive="core/image" data-wp-key="69cc6346267f3" class="wp-block-image size-large wp-lightbox-container"><img fetchpriority="high" loading="eager" decoding="async" width="1024" height="576" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-1-1024x576.png" alt="" class="wp-image-2946" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-1-1024x576.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-1-300x169.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-1-768x432.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-1.png 1284w" sizes="(max-width: 1024px) 100vw, 1024px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ul class="wp-block-list"><li>ユーザーとして登録されたメールアドレスが入力されると、ログインリンクを含むメールが送信されたというメッセージが出力され、メールにログインリンクが届き、リンクをクリックするとログインします。</li></ul>



<figure class="wp-block-gallery columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img loading="lazy" decoding="async" width="1024" height="584" src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-2-1024x584.png" alt="" data-id="2947" data-full-url="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-2.png" data-link="https://blog.riverforest-wp.info/screenshot-2-24/" class="wp-image-2947" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-2-1024x584.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-2-300x171.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-2-768x438.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-2.png 1267w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></li><li class="blocks-gallery-item"><figure><img loading="lazy" decoding="async" width="1024" height="584" src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-3-1024x584.png" alt="" data-id="2948" data-full-url="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-3.png" data-link="https://blog.riverforest-wp.info/screenshot-3-16/" class="wp-image-2948" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-3-1024x584.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-3-300x171.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-3-768x438.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-3.png 1267w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></li><li class="blocks-gallery-item"><figure><img loading="lazy" decoding="async" width="1024" height="576" src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-4-1024x576.png" alt="" data-id="2949" data-full-url="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-4.png" data-link="https://blog.riverforest-wp.info/screenshot-4-8/" class="wp-image-2949" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-4-1024x576.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-4-300x169.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-4-768x432.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-4.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></li></ul></figure>



<ul class="wp-block-list"><li>ユーザーとして登録されていないメールアドレスを入力するとエラーが出ます。デフォルトでは１０分以内に、リンクをクリックしないと期限切れのエラーが出ます。</li></ul>



<figure class="wp-block-gallery columns-2 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img loading="lazy" decoding="async" width="1024" height="584" src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-5-1024x584.png" alt="" data-id="2950" data-full-url="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-5.png" data-link="https://blog.riverforest-wp.info/screenshot-5-4/" class="wp-image-2950" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-5-1024x584.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-5-300x171.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-5-768x438.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-5.png 1267w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></li><li class="blocks-gallery-item"><figure><img loading="lazy" decoding="async" width="1024" height="584" src="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-6-1024x584.png" alt="" data-id="2951" data-full-url="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-6.png" data-link="https://blog.riverforest-wp.info/screenshot-6-4/" class="wp-image-2951" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-6-1024x584.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-6-300x171.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-6-768x438.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20220105/screenshot-6.png 1267w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure></li></ul></figure>



<h3 class="wp-block-heading">カスタマイズ</h3>



<p>管理画面はありません。カスタマイズは、フィルターフックとアクションフックで行います。上記のリンク先に、サンプルコードが書いてありますので、それを見て行ってください。</p>



<h3 class="wp-block-heading">セキュリティ対策</h3>



<p>このプラグインと併せて以下の様なセキュリティ対策を行う事もできると思います。</p>



<p>wp-login.php にアクセスしてきたら、ホームページへリダイレクトする</p>



<pre class="prism line-numbers"><code class="language-php language-html">/** ==================================================
 * Redirect to home if the URI is wp-login.php
 *
 * @since 1.00
 */
function redirect_login() {
	if ( ! is_user_logged_in() &amp;&amp; isset( $_SERVER&#91;'REQUEST_URI'] ) &amp;&amp; ! empty( $_SERVER&#91;'REQUEST_URI'] ) ) {
		$request_uri = esc_url_raw( wp_unslash( $_SERVER&#91;'REQUEST_URI'] ) );
		if ( 'wp-login.php' === wp_basename( parse_url( $request_uri, PHP_URL_PATH ) ) ) {
			wp_safe_redirect( home_url(), 302 );
			exit();
		}
	}
}
add_action( 'init', 'redirect_login' );</code></pre>



<p></p>
]]></content:encoded>
					
		
		<enclosure url="https://blog.riverforest-wp.info/wp-content/uploads/20220105/magic-login-mail.mp4" length="27925728" type="video/mp4" />

			</item>
		<item>
		<title>WooCommerce でライセンスキーを発行するプラグイン及びそれを Web サービスで利用するためのコード</title>
		<link>https://blog.riverforest-wp.info/simple-license-key-for-woocommerce/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Thu, 23 Sep 2021 01:48:46 +0000</pubDate>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[ライセンスキー]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=2872</guid>

					<description><![CDATA[題名が長くなりましたが、以下のプラグインを自分のサービスで利用するために開発しました。 プラグイン自体は可能な限りシンプルにしていて、以下の機能に絞っています。 購入されたライセンスキーを暗号化して Rest API で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>題名が長くなりましたが、以下のプラグインを自分のサービスで利用するために開発しました。</p>



<div class="pluginstatsview-card-wrap">
	<div>
		<img decoding="async" src="https://ps.w.org/simple-license-key-for-woocommerce/assets/icon-256x256.png?rev=2603932" alt="Simple License Key for WooCommerce のアイコン" class="pluginstatsview-card-icon" />
		<div class="pluginstatsview-after-icon">
			<div class="pluginstatsview-bold"><a href="https://wordpress.org/plugins/simple-license-key-for-woocommerce/" class="pluginstatsview-astyle">Simple License Key for WooCommerce</a></div>
			<div class="pluginstatsview-small">ウェブサービス用の WooCommerce 商品のライセンスキーを生成します。</div>
			<div class="pluginstatsview-small">作者: <a href="https://profiles.wordpress.org/katsushi-kawamori/">Katsushi Kawamori</a></div>
			<div style="clear: both;"></div>
		</div>
	</div>
	<div style="clear: both;"></div>

	<div class="pluginstatsview-small">
		<span class="pluginstatsview-card-left"><a href="https://wordpress.org/plugins/simple-license-key-for-woocommerce/#reviews" title="0.0(5点満点中)" class="pluginstatsview-astyle">	<span class="pluginstatsview-stars">
					<span class="dashicons dashicons-star-empty"></span><span class="dashicons dashicons-star-empty"></span><span class="dashicons dashicons-star-empty"></span><span class="dashicons dashicons-star-empty"></span><span class="dashicons dashicons-star-empty"></span>
			</span>
	</a>(0)</span>
		<span class="pluginstatsview-card-right">最終更新: 2日 前</span>
	</div>
	<div class="pluginstatsview-small">
		<span class="pluginstatsview-card-left">3,292ダウンロード</span>
		<span class="pluginstatsview-card-right">検証済み: 7.0</span>
	</div>
	<div class="pluginstatsview-small">
		<span class="pluginstatsview-card-left">ダウンロード: <a href="https://downloads.wordpress.org/plugin/simple-license-key-for-woocommerce.1.18.zip" class="dashicons dashicons-download pluginstatsview-download"></a></span>
		<span class="pluginstatsview-card-right">リリース: 2021-09-23</span>
	</div>
	<div class="pluginstatsview-small pluginstatsview-card-center">
		2026-03-31 09:30 時点の統計	</div>
</div>



<p>プラグイン自体は可能な限りシンプルにしていて、以下の機能に絞っています。</p>



<ul class="wp-block-list"><li>購入されたライセンスキーを暗号化して Rest API で出力</li><li>商品にライセンスキーを付与するかのチェック</li><li>ライセンスキーの有効期日の指定</li></ul>



<p>後は、購入したユーザーが、Web サービス上でメールで届いたライセンスキーを入力すると、それを復号化して検証するという仕組みです。それについては、Web サービス上でコードを書く必要があります。暗号化は、OpenSSL の共通パスフレーズを用いています。コードに関しては、WordPress の管理画面上での PHP と、React で以下に記していきますが、Rest API と、OpenSSL を利用しているので、他の言語やシステムでも別のコードを書けば使えると思います。その辺りに詳しい方は、チャレンジしてみてください。</p>



<h3 class="wp-block-heading">動作</h3>



<figure class="wp-block-video"><video height="720" style="aspect-ratio: 1280 / 720;" width="1280" controls src="https://blog.riverforest-wp.info/wp-content/uploads/20210923/slmwoo.mp4"></video></figure>



<h3 class="wp-block-heading">ライセンスキー販売サイトの商品の設定</h3>



<p>ライセンスキーを発行にチェックし、有効期限を決めます。有効期限を過ぎると、REST API への暗号化されたライセンスキーの出力は無くなります。商品は、バーチャルにチェックを入れます。</p>



<h3 class="wp-block-heading">ライセンスキー販売サイトのプラグイン側の設定</h3>



<p>共通パスフレーズを決めます。これは流出しないように大切に保管してください。また、プラグインの設定画面上で、REST API の URL を知る事ができます。この２点は、後で PHP と React 上に書き込みます。</p>



<h3 class="wp-block-heading">Web サービス側の PHP コード</h3>



<p>子テーマの、functions.php に書く前提で記していきます。</p>



<p>ライセンスキーを入力するためのメニューページを作成するコード</p>



<ul class="wp-block-list"><li>管理画面に、Test License というページを作成</li><li>ページには、React を利用するので、id 属性を指定して、echo するのみ</li></ul>



<pre class="prism line-numbers"><code class="language-php language-html">/** ==================================================
 * Add Menu for Test license
 *
 * @since 1.00
 */
function add_pages() {
	add_menu_page(
		'Test License',
		'Test License',
		'edit_posts',
		'TestLicense',
		'credit_page'
	);
}
add_action( 'admin_menu', 'add_pages' );

/** ==================================================
 * Credit
 *
 * @since 1.00
 */
function credit_page() {

	echo '&lt;div id="test-license-page"&gt;&lt;/div&gt;';

}</code></pre>



<p>メニューページに読み込むスクリプト用のコード</p>



<ul class="wp-block-list"><li>子テーマ内に、test-license というフォルダを作成し、その下の dist フォルダ内に、React の build ファイルを置くためのコード</li></ul>



<pre class="prism line-numbers"><code class="language-php language-html">/** ==================================================
 * License Page Scripts
 *
 * @param string $hook_suffix  hook_suffix.
 * @since 1.00
 */
function license_page_scripts( $hook_suffix ) {

	if ( 'toplevel_page_TestLicense' !== $hook_suffix ) {
		return;
	}

	$asset_file = include( get_stylesheet_directory() . '/test-license/dist/test-license.asset.php' );

	wp_enqueue_style(
		'test-license-style',
		get_stylesheet_directory_uri() . '/test-license/dist/test-license.css',
		array( 'wp-components' ),
		'1.0.0'
	);

	wp_enqueue_script(
		'test-license',
		get_stylesheet_directory_uri() . '/test-license/dist/test-license.js',
		$asset_file&#91;'dependencies'],
		$asset_file&#91;'version'],
		true
	);

}
add_action( 'admin_enqueue_scripts', 'license_page_scripts', 10, 1 );</code></pre>



<p>REST API を出力し、入力されたライセンスキーを検証するコード</p>



<ul class="wp-block-list"><li>権限は以下の場合は編集者権限</li><li>license_api_verify 内の検証コード内に、復号化のための共通パスフレーズを記す</li><li>検証して、入力されたライセンスキーと、プラグインの入っているライセンスキー販売サイトの REST API を復号化したものが一致していれば、ユーザーオプションテーブルの test_licensed を true にする</li></ul>



<pre class="prism line-numbers"><code class="language-php language-html">/** ==================================================
 * Register Rest API
 *
 * @since 1.00
 */
function register_rest() {

	register_rest_route(
		'test/license_api',
		'/token',
		array(
			'methods' =&gt; 'POST',
			'callback' =&gt; 'license_api_verify',
			'permission_callback' =&gt; 'editor_rest_permission',
		)
	);

}
add_action( 'rest_api_init', 'register_rest' );

/** ==================================================
 * Rest Permission for editor
 *
 * @since 1.00
 */
function editor_rest_permission() {

	return current_user_can( 'edit_posts' );

}

/** ==================================================
 * License Rest API verify
 *
 * @param object $request  changed data.
 * @since 1.00
 */
function license_api_verify( $request ) {

	$args = json_decode( $request-&gt;get_body(), true );

	$input_license_key = $args&#91;'license_key'];
	$get_license_api_arr = $args&#91;'license_api'];
	foreach ( $get_license_api_arr as $key =&gt; $value ) {
		/* 共通パスフレーズは、プラグイン側で指定したもの。以下の場合は、'm#xs@%5NhZlR' */
		$get_license_key = openssl_decrypt( $value&#91;'open_key'], 'aes-256-cfb', 'm#xs@%5NhZlR', 0, openssl_cipher_iv_length( 'aes-256-cfb' ) );
		if ( $get_license_key === $input_license_key ) {
			/* ライセンスが一致した時の処理 */
			update_user_option( get_current_user_id(), 'test_licensed', true );
		}
	}
	$args&#91;'licensed'] = get_user_option( 'test_licensed', get_current_user_id() );

	return new WP_REST_Response( $args, 200 );

}</code></pre>



<h3 class="wp-block-heading"> Web サービス側の React コード </h3>



<p>LicenseCheck コンポーネント</p>



<ul class="wp-block-list"><li>Fetch で販売サイトの REST API を取得</li><li>apiFetch で Web サービス側で、ライセンスキーを入力したものと、Fetch で取得した暗号化されたライセンスキーを php 側と通信</li></ul>



<pre class="prism line-numbers"><code class="language-php language-html">import './license-check.css';

import apiFetch from '@wordpress/api-fetch';

import { Button, TextControl } from '@wordpress/components';

import {
	useState,
	useEffect
} from '@wordpress/element';

const LicenseCheck = ( props ) =&gt; {

	const &#91; paidFlag, updatePaidFlag ] = useState( false );
	const &#91; paidText, updatePaidText ] = useState( '' );

	const &#91; currentLicense, updateCurrentLicense ] = useState( '' );
	const &#91; licenseApi, updateLicenseApi ] = useState( {} );

	const items_licensed = &#91;];
	if ( ! paidFlag ) {
		items_licensed.push(
			&lt;div&gt;
				&lt;hr /&gt;
				&lt;h3&gt;{ props.license_text }&lt;/h3&gt;
				&lt;p className="description"&gt;{ props.purchase_description }&lt;/p&gt;
				&lt;div&gt;
					&lt;Button
						className="button button-large"
						href={ props.purchase_site }
						target="_blank"
					&gt;
					{ props.purchase_text }
					&lt;/Button&gt;
				&lt;/div&gt;
				&lt;div className="license_key_input_line"&gt;
					{ props.license_text_input }
					&lt;TextControl
						className = "license_key_input"
						value = { currentLicense }
						onChange = { ( value ) =&gt; updateCurrentLicense( value ) }
					/&gt;
				&lt;/div&gt;
			&lt;/div&gt;
		);
	}

	useEffect( () =&gt; {

		fetch( props.url )
		.then( response =&gt; response.json() )
		.then( data =&gt; {
			//console.log( data );
			updateLicenseApi( data );
		} );

		apiFetch( {
			path: props.path,
			method: 'POST',
			data: {
				license_key: currentLicense,
				license_api: licenseApi,
			}
		} ).then( ( response ) =&gt; {
			//console.log( response );
			if ( response&#91;'licensed'] ) {
				updatePaidFlag( true );
				updatePaidText( props.paid_text );
			} else {
				updatePaidFlag( false );
				updatePaidText( props.no_paid_text );
			}
		} );

	}, &#91; currentLicense ] );

	return (
		&lt;div className="wrap"&gt;
			&lt;h2&gt;{ props.title }&lt;/h2&gt;
			&lt;h3&gt;{ paidText }&lt;/h3&gt;
			{ items_licensed }
		&lt;/div&gt;
	);

};

export default LicenseCheck;</code></pre>



<p>コンポーネント用の CSS</p>



<pre class="prism line-numbers"><code class="language-php language-html">.license_key_input {
	width: 200px;
}
.license_key_input_line {
	display: inline-flex;
}</code></pre>



<p>メインのコード</p>



<ul class="wp-block-list"><li>コンポーネントを読み込む。コンポーネントの属性に各種値を入力。</li><li>属性<ul><li>title : タイトル</li><li>license_text : タイトル２</li><li>purchase_description : 購入の説明</li><li>purchase_text : 購入ボタンの文字</li><li>purchase_site : ライセンスキー商品販売ページの URL</li><li>license_text_input : ライセンスキー入力フォームの左側のテキスト</li><li>paid_text : ライセンスされている事を示すテキスト</li><li>no_paid_text : ライセンスされていない事を示すテキスト</li><li>url : ライセンス販売サイトの REST API の URL（プラグインの設定画面に記してあるもの）</li><li>path : Web サービス側の REST API のパス（PHP に記したパス）</li></ul></li></ul>



<pre class="prism line-numbers"><code class="language-php language-html">import './test-license.scss';

import { render } from '@wordpress/element';

import LicenseCheck from './components/license-check';

const TestLicenseView = () =&gt; {

	return (
		&lt;div className="wrap"&gt;
			&lt;LicenseCheck
				title = { 'ライセンスチェックテスト' }
				license_text = { 'ライセンスキー' }
				purchase_description = { '以下のショップで購入したライセンスキーを入力すると制限が解除されます。' }
				purchase_site = 'https://shop-jp.riverforest.test/product/license'
				purchase_text = { '購入' }
				license_text_input = { 'ライセンスキー入力' }
				paid_text = { 'ライセンス済み' }
				no_paid_text = { '未ライセンス' }
				/* REST API by Simple License Key for WooCommerce */
				url = 'https://shop-jp.riverforest.test/wp-json/rf/slk-woo-open-key_api/token'
				/* Web service REST API */
				path = 'test/license_api/token'
			/&gt;
		&lt;/div&gt;
	);

};

render(
	&lt;TestLicenseView /&gt;,
	document.getElementById( 'test-license-page' )
);</code></pre>



<p>メインの CSS</p>



<pre class="prism line-numbers"><code class="language-php language-html">#test-license-page {
}</code></pre>



<h3 class="wp-block-heading">ダウンロード</h3>



<p>コードを子テーマ毎一式以下に置きました。</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link" href="https://blog.riverforest-wp.info/wp-content/uploads/20210923/twentytwentyone_child.zip">ダウンロード</a></div>
</div>
]]></content:encoded>
					
		
		<enclosure url="https://blog.riverforest-wp.info/wp-content/uploads/20210923/slmwoo.mp4" length="24326105" type="video/mp4" />

			</item>
		<item>
		<title>無料でソフトウェアをつくるという事</title>
		<link>https://blog.riverforest-wp.info/plugin-creation/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Thu, 28 Nov 2019 00:56:31 +0000</pubDate>
				<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[アドオン]]></category>
		<category><![CDATA[アドオン販売]]></category>
		<category><![CDATA[プラグイン]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=1834</guid>

					<description><![CDATA[はじめに WordPress の公式プラグインを作成し始めてから６年、いつの間にか多数のプラグインを作成しました。それに機能を付与するアドオンの販売状況と、無料でプラグインを作成する意味を考えてみました。 2012年～2 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p><strong><a href="https://wordpress.org/">WordPress</a></strong> の<strong><a href="https://wordpress.org/plugins/">公式プラグイン</a></strong>を作成し始めてから６年、いつの間にか多数のプラグインを作成しました。それに機能を付与するアドオンの販売状況と、無料でプラグインを作成する意味を考えてみました。</p>



<style>
.simpleblogcard_img_blocke0e7cacb3e807175779071822e0f83d3 {
  float: right;
  padding: 10px;
}
.simpleblogcard_bordere0e7cacb3e807175779071822e0f83d3 {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlee0e7cacb3e807175779071822e0f83d3 {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptione0e7cacb3e807175779071822e0f83d3 {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://profiles.wordpress.org/katsushi-kawamori/#content-plugins>
				<figure class="simpleblogcard_img_blocke0e7cacb3e807175779071822e0f83d3">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://www.gravatar.com/avatar/90626c97edc7a76c88acf1d216d22721?s=1024&#038;r=g&#038;d=mm" alt="Katsushi Kawamori (@katsushi-kawamori) – WordPress user profile | WordPress.org" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_bordere0e7cacb3e807175779071822e0f83d3">
			profiles.wordpress.org			<div class="simpleblogcard_titlee0e7cacb3e807175779071822e0f83d3">
				Katsushi Kawamori (@katsushi-kawamori) – WordPress user profile | WordPress.org			</div>
							<div class="simpleblogcard_descriptione0e7cacb3e807175779071822e0f83d3">
					公式プラグイン一覧				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h3 class="wp-block-heading">2012年～2013年</h3>



<ul class="wp-block-list"><li><strong><a href="https://www.perl.org/">Perl</a></strong> で作成したプログラムを <strong><a href="https://www.php.net/">PHP</a></strong> に移植、それをプラグイン化した。</li><li>純粋に職場のサイト更新の手間を省くためのものでした。</li></ul>



<h3 class="wp-block-heading">2013年～2016年 </h3>



<ul class="wp-block-list"><li>必要があって、いろいろ作成していく。</li><li>プラグイン <strong><a href="https://wordpress.org/plugins/media-from-ftp/">Media from FTP</a></strong> がヒットし、世界中で使われるようになる。</li><li>サポートフォーラムで様々な要望に応える。</li><li>ますますヒットする。</li><li>無料で作り続けるのが馬鹿馬鹿しくなる。</li></ul>



<h3 class="wp-block-heading">2016年～2018年</h3>



<ul class="wp-block-list"><li>プラグインのアドオンやテーマを個人で販売している人が存在するのを知る。</li><li><strong><a href="https://japan.wordcamp.org/">WordCamp</a></strong> で情報収集しプラグインのアドオン販売を考える。</li><li>プラグインのアドオン販売開始。</li><li>初期の頃は、売り切り60ドルで販売。少し売れる。</li><li>周囲から安いのではと言われ、120ドルにしたら売れなくなる。</li><li>売り切り100ドルにし、サブスクリプション年額60ドルも開始。</li><li>サブスクリプションが売れないのとサブスクリプションソフトウェアの有償化でサブスクリプションを辞める。</li><li>初期の値段60ドルの売り切りに戻す。売れ行きが戻る。</li><li>Webサービス<strong><a href="https://bdc-scoring.com/ja/">ボールルームダンス競技会採点システム</a></strong>を開始。</li></ul>



<h3 class="wp-block-heading">現在</h3>



<ul class="wp-block-list"><li>2019年初頭から、アドオン販売を大幅値下げ、60ドルを30ドルにする。</li><li>半額に値下げしたにもかかわらず、1.5倍の売上増。実質3倍の伸び。</li><li>アドオンの適正価格は、30ドル以下であると知る。</li><li>アドオンは下手なアルバイトよりも儲からないと実感する。</li><li><strong><a href="https://bdc-scoring.com/ja/">ボールルームダンス競技会採点システム</a></strong>からいくつかの機能を分離し<strong><a href="https://wordpress.org/plugins/">公式プラグイン</a></strong>とする。</li><li>Webサービス<strong><a href="https://compe-scoring.com/ja/">競技会採点システム</a></strong>を開始。 </li><li> <strong><a href="https://compe-scoring.com/ja/">競技会採点システム</a></strong>が１団体に導入されて報酬を得る。</li></ul>



<h3 class="wp-block-heading">雑感</h3>



<p>まず最初に思うのは、ソフトウェアの為のソフトウェア（この記事ではアドオン）よりも、サービス（この記事ではWebサービス）の方が報酬になるという事です。</p>



<p>それを理解した時から、無料で公式プラグインを作成する事が苦で無くなり、むしろ積極的に行うようになりました。自分のプラグインだけでは無く、人の作成したプラグインの力も借りて、Webサービス<a href="https://compe-scoring.com/ja/"><strong>競技会採点システム</strong></a>で報酬を得たからです。</p>



<p>世の中ではソフトウェアの為のソフトウェアを買う人よりもサービスを買う人の方が多いのではないかと思います。それならば、皆で無償で知恵を出し合いソフトウェア(この記事では<strong>WordPress</strong>)をより良いものにして<strong>どのようなサービス</strong>にでも<strong>変幻自在に対応</strong>できるようにすべきだというのが今の心境です。</p>



<p>それがいつか報酬となって返ってくるはずだと思います。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordCamp Tokyo 2019 でスポンサーとしてブース出展しました</title>
		<link>https://blog.riverforest-wp.info/wordcamp-tokyo-2019-%e3%81%a7%e3%82%b9%e3%83%9d%e3%83%b3%e3%82%b5%e3%83%bc%e3%81%a8%e3%81%97%e3%81%a6%e3%83%96%e3%83%bc%e3%82%b9%e5%87%ba%e5%b1%95%e3%81%97%e3%81%be%e3%81%97%e3%81%9f/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Sun, 03 Nov 2019 00:23:19 +0000</pubDate>
				<category><![CDATA[WordCamp Tokyo 2019]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[ボールルームダンス競技会採点システム]]></category>
		<category><![CDATA[競技会採点システム]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=1684</guid>

					<description><![CDATA[はじめに 昨年１１月に「ボールルームダンス競技会採点システム」、今年４月に、「競技会採点システム」を開発しましたが、未だに契約者が一団体にとどまっています。宣伝のために、最初に WordCamp Tokyo 2019 で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p>昨年１１月に「ボールルームダンス競技会採点システム」、今年４月に、「競技会採点システム」を開発しましたが、未だに契約者が一団体にとどまっています。宣伝のために、最初に <a href="https://2019.tokyo.wordcamp.org/">WordCamp Tokyo 2019</a> でのブース出展を思い立ちました。</p>



<div class="wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block761a8884101ae7e846ef41f37ae858e5 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border761a8884101ae7e846ef41f37ae858e5 {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title761a8884101ae7e846ef41f37ae858e5 {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description761a8884101ae7e846ef41f37ae858e5 {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://bdc-scoring.com>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border761a8884101ae7e846ef41f37ae858e5">
			bdc-scoring.com			<div class="simpleblogcard_title761a8884101ae7e846ef41f37ae858e5">
				Ballroom dance competition Scoring System			</div>
							<div class="simpleblogcard_description761a8884101ae7e846ef41f37ae858e5">
					Features of the Service This is a scoring system for ballroom dance competitions. Enter th&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block8fc2a6c9324078c81b19590ab91bae2a {
  float: right;
  padding: 10px;
}
.simpleblogcard_border8fc2a6c9324078c81b19590ab91bae2a {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title8fc2a6c9324078c81b19590ab91bae2a {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description8fc2a6c9324078c81b19590ab91bae2a {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://compe-scoring.com>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border8fc2a6c9324078c81b19590ab91bae2a">
			compe-scoring.com			<div class="simpleblogcard_title8fc2a6c9324078c81b19590ab91bae2a">
				Competition Scoring System – Competition Scoring System			</div>
							<div class="simpleblogcard_description8fc2a6c9324078c81b19590ab91bae2a">
					Features of the Service This service is a scoring system for competitions or contests. Aut&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>
</div>



<h3 class="wp-block-heading">設営</h3>



<div class="wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top alignwide"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="1024" height="768" src="https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_101821-1024x768.jpg" alt="" class="wp-image-1719 size-full" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_101821-1024x768.jpg 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_101821-300x225.jpg 300w, https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_101821-768x576.jpg 768w, https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_101821-1920x1440.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure><div class="wp-block-media-text__content">
<p>写真( <strong>GOUTEN</strong> さんが私のスマホで撮影 )の様なブースです。PC１台と、iPad３台を設置しました。一人なので、<a href="https://www.amazon.co.jp/gp/product/B00ISHCUFA/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&amp;psc=1">セキュリティーワイヤー</a>を設置しています。 タッチ用に<a href="https://www.amazon.co.jp/gp/product/B00THXFOY8/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&amp;psc=1">タッチペン</a>を準備しました。 また、チラシを２００部刷りました。 </p>



<p>※<strong>GOUTEN</strong> さん、撮影ありがとうございました。</p>
</div></div>



<h3 class="wp-block-heading">ブースにて</h3>



<p>ほぼ、ブースに張り付いていました。<a href="https://2inc.org/"><strong>キタジマタカシ</strong></a>さん言うところ「なかなか尖ったシステム」だという事を実感しました。デモを観て、「おお！」と感動してくださるのですが、それをどう自身の仕事に生かせるのかというとクエスチョンマークのようです。WordPress を利用して仕事をしている方向けでは無く、採点の現場にいる方向けのシステムだと感じました。</p>



<p>そんな中、御自身の仕事と採点システムが<strong>つながり</strong>そうな方が４名いました。その中の２名は、実際に採点システムの運用を考えてくださりそうでありがたいです。また１名は通信業者 <a href="https://xmobile.ne.jp/">X-mobile</a> の方で、以前から採点システムの現場での WiFi 接続に関して頭を悩ましていましたが、それが <a href="https://xmobile.ne.jp/">X-mobile</a> さんと提携することで解消しそうです。最後の１名は、北海道から参加された<strong>藤田辰也</strong>さんです。昨年の <a href="https://2018.osaka.wordcamp.org/">WordCamp Osaka 2018</a> 以来で、今回も素晴らしい成果品を見せていただきました。</p>



<p>ブースツアーが午前と午後の２回ありました。午前の部では、まだ説明に不慣れで上手く説明できませんでしたが、午後の部では上手く説明できたと思います。ツアーを盛り上げてくださった<strong>谷合美香</strong>さん、ありがとうございました。</p>



<h3 class="wp-block-heading">会場について</h3>



<p>今回、スポンサーが例年になく多い４０社との事で、配置に苦労したとの事です。スポンサー担当の<strong>中谷智美</strong>さん、初期段階から 大変お世話になりました。また、ありがとうございました。</p>



<p>スポンサーの中で、フリーランスは<strong><a href="https://2inc.org/">キタジマタカシ</a></strong>さんと私だけだったようです。</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="500" data-dnt="true"><p lang="ja" dir="ltr">そういえばフリーランスでブースだしてたのは意外に僕と河森さんだけだった気がする</p>&mdash; キタジマタカシ<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f412.png" alt="🐒" class="wp-smiley" style="height: 1em; max-height: 1em;" />Snow Monkey / unitone開発者 (@inc2734) <a href="https://twitter.com/inc2734/status/1190657375360782346?ref_src=twsrc%5Etfw">November 2, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<h3 class="wp-block-heading">SNOW MONKEY BRAND BOOK</h3>



<p>ほぼ自分のブースに張り付いていましたが、このブログのテーマでもある <strong>Snow Monkey</strong> のブースに行き、冊子をいただきました。凄く綺麗な冊子で冒頭には<strong><a href="https://2inc.org/">キタジマタカシ</a></strong>さんの熱い文章が書かれていました。巻末の奥様の漫画上手すぎです！</p>



<div>
<style type="text/css">.simple-block-gallery-masonry34810 { display: block; column-width: 333px; column-gap: 0; padding: 0; }div.masonry34810 { display: block; padding: 3px; }div.masonry34810 img { display: block; width: 100%; border-radius: 4px; }div.masonry34810 figure { position: relative; }div.masonry34810 figcaption { position: absolute; bottom: 0; left: 0; right: 0; width: 100%; background: rgba(0, 0, 0, 0.6); color: #fff; text-align: center; box-sizing: border-box; font-size: 0.7em; opacity: 0; transition: opacity 0.4s ease; border-radius: 4px;  pointer-events: none; }div.masonry34810 figure:hover figcaption,div.masonry34810 figure.show-caption figcaption { opacity: 1; pointer-events: auto; }div.masonry34810 @media (max-width: 768px) { figure figcaption { opacity: 1; } }.wp-block-image, figure figcaption { margin: 0 !important; padding: 0 !important; }</style><div class="simple-block-gallery-masonry34810"><div class="masonry34810"><figure data-wp-context="{&quot;imageId&quot;:&quot;69cc634629edf&quot;}" data-wp-interactive="core/image" data-wp-key="69cc634629edf" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" width="3120" height="4160" src="https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191103_113108.jpg" alt=""><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure></div><div class="masonry34810"><figure data-wp-context="{&quot;imageId&quot;:&quot;69cc63462a40d&quot;}" data-wp-interactive="core/image" data-wp-key="69cc63462a40d" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" width="4160" height="3120" src="https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191103_113206.jpg" alt=""><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure></div></div>
</div>



<style>
.simpleblogcard_img_blockbf45b9452f1b4aa4274aab7136e45c9e {
  float: right;
  padding: 10px;
}
.simpleblogcard_borderbf45b9452f1b4aa4274aab7136e45c9e {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlebf45b9452f1b4aa4274aab7136e45c9e {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptionbf45b9452f1b4aa4274aab7136e45c9e {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://snow-monkey.2inc.org/>
				<figure class="simpleblogcard_img_blockbf45b9452f1b4aa4274aab7136e45c9e">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 66px;" src="https://snow-monkey.2inc.org/wp-content/uploads/2019/04/snow-monkey.png" alt="Snow Monkey – どんな味付けにも染まる。高級お出汁のような WordPress テーマ、Snow Monkey" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_borderbf45b9452f1b4aa4274aab7136e45c9e">
			snow-monkey.2inc.org			<div class="simpleblogcard_titlebf45b9452f1b4aa4274aab7136e45c9e">
				Snow Monkey – どんな味付けにも染まる。高級お出汁のような WordPress テーマ、Snow Monkey			</div>
							<div class="simpleblogcard_descriptionbf45b9452f1b4aa4274aab7136e45c9e">
					どんな味付けにも染まる。高級お出汁のような WordPress テーマ、Snow Monkey				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h3 class="wp-block-heading">お弁当、カフェラテ</h3>



<p> 美味しいお弁当が出ました。また会場にバリスターコーナーが設けられ、お洒落で美味しいカフェラテをいただきました。  </p>



<div>
<style type="text/css">.simple-block-gallery-masonry93937 { display: block; column-width: 326px; column-gap: 0; padding: 0; }div.masonry93937 { display: block; padding: 3px; }div.masonry93937 img { display: block; width: 100%; border-radius: 4px; }div.masonry93937 figure { position: relative; }div.masonry93937 figcaption { position: absolute; bottom: 0; left: 0; right: 0; width: 100%; background: rgba(0, 0, 0, 0.6); color: #fff; text-align: center; box-sizing: border-box; font-size: 0.7em; opacity: 0; transition: opacity 0.4s ease; border-radius: 4px;  pointer-events: none; }div.masonry93937 figure:hover figcaption,div.masonry93937 figure.show-caption figcaption { opacity: 1; pointer-events: auto; }div.masonry93937 @media (max-width: 768px) { figure figcaption { opacity: 1; } }.wp-block-image, figure figcaption { margin: 0 !important; padding: 0 !important; }</style><div class="simple-block-gallery-masonry93937"><div class="masonry93937"><figure data-wp-context="{&quot;imageId&quot;:&quot;69cc63462aace&quot;}" data-wp-interactive="core/image" data-wp-key="69cc63462aace" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" width="3120" height="4160" src="https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_135126.jpg" alt=""><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure></div><div class="masonry93937"><figure data-wp-context="{&quot;imageId&quot;:&quot;69cc63462afdb&quot;}" data-wp-interactive="core/image" data-wp-key="69cc63462afdb" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" width="4160" height="3120" src="https://blog.riverforest-wp.info/wp-content/uploads/20191103/IMG_20191102_131123.jpg" alt=""><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure></div></div>
</div>



<h3 class="wp-block-heading">アフターパーティー</h3>



<p>場所を移動して、クラブでのアフターパーティーに参加しました。なるべく、大勢の方とお話ししようとしてあちこち動き回りました。私に応じてくださった皆様、ありがとうございました。</p>



<h3 class="wp-block-heading">最後に</h3>



<p>実行委員長はじめ、実行委員、当日スタッフの皆様、本当にお疲れ様でした。そして、ありがとうございました。 </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordCamp Tokyo 2019 でスポンサーとしてブース出展します</title>
		<link>https://blog.riverforest-wp.info/wordcamp-tokyo-2019-%e3%81%a7%e3%82%b9%e3%83%9d%e3%83%b3%e3%82%b5%e3%83%bc%e3%81%a8%e3%81%97%e3%81%a6%e3%83%96%e3%83%bc%e3%82%b9%e5%87%ba%e5%b1%95%e3%81%97%e3%81%be%e3%81%99/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Fri, 13 Sep 2019 09:38:45 +0000</pubDate>
				<category><![CDATA[WordCamp Tokyo 2019]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[ボールルームダンス競技会採点システム]]></category>
		<category><![CDATA[競技会採点システム]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=1651</guid>

					<description><![CDATA[はじめに ２０１９年１１月１日、１１月２日に開催される、WordCamp Tokyo 2019 で Bronze スポンサーとしてブース出展します。ブース出展は、１１月２日です。 内容 昨年より始めたWebサービスのボー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p>２０１９年１１月１日、１１月２日に開催される、WordCamp Tokyo 2019 で Bronze スポンサーとしてブース出展します。ブース出展は、１１月２日です。</p>



<style>
.simpleblogcard_img_blocke78bd3da337032c50ae2339ee21554b1 {
  float: right;
  padding: 10px;
}
.simpleblogcard_bordere78bd3da337032c50ae2339ee21554b1 {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlee78bd3da337032c50ae2339ee21554b1 {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptione78bd3da337032c50ae2339ee21554b1 {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://2019.tokyo.wordcamp.org/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_bordere78bd3da337032c50ae2339ee21554b1">
			2019.tokyo.wordcamp.org			<div class="simpleblogcard_titlee78bd3da337032c50ae2339ee21554b1">
				https://2019.tokyo.wordcamp.org/			</div>
							<div class="simpleblogcard_descriptione78bd3da337032c50ae2339ee21554b1">
									</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h3 class="wp-block-heading">内容</h3>



<p>昨年より始めたWebサービスの<strong>ボールルームダンス競技会採点システム</strong>、<strong>競技会採点システム</strong>のデモンストレーションを行います。PC１台とタブレット３台で行います。お気軽にお立ち寄りください。</p>



<div class="wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block12abbb71f402807861bf6117bcdbe6ea {
  float: right;
  padding: 10px;
}
.simpleblogcard_border12abbb71f402807861bf6117bcdbe6ea {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title12abbb71f402807861bf6117bcdbe6ea {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description12abbb71f402807861bf6117bcdbe6ea {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://bdc-scoring.com/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border12abbb71f402807861bf6117bcdbe6ea">
			bdc-scoring.com			<div class="simpleblogcard_title12abbb71f402807861bf6117bcdbe6ea">
				Ballroom dance competition Scoring System			</div>
							<div class="simpleblogcard_description12abbb71f402807861bf6117bcdbe6ea">
					Features of the Service This is a scoring system for ballroom dance competitions. Enter th&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block0eaeb7f3faf4395b847125a9982c8dfe {
  float: right;
  padding: 10px;
}
.simpleblogcard_border0eaeb7f3faf4395b847125a9982c8dfe {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title0eaeb7f3faf4395b847125a9982c8dfe {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description0eaeb7f3faf4395b847125a9982c8dfe {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://compe-scoring.com/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border0eaeb7f3faf4395b847125a9982c8dfe">
			compe-scoring.com			<div class="simpleblogcard_title0eaeb7f3faf4395b847125a9982c8dfe">
				Competition Scoring System – Competition Scoring System			</div>
							<div class="simpleblogcard_description0eaeb7f3faf4395b847125a9982c8dfe">
					Features of the Service This service is a scoring system for competitions or contests. Aut&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>スケーティングシステムのデモ</title>
		<link>https://blog.riverforest-wp.info/skating-demo/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Tue, 10 Sep 2019 04:21:58 +0000</pubDate>
				<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[スケーティングシステム]]></category>
		<category><![CDATA[ボールルームダンス競技会採点システム]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=1643</guid>

					<description><![CDATA[ボールルームダンス競技会採点システムのスケーティングシステムを独自開発しましたが、難解なスケーティングシステムの信用度の指針として、どなたでもスケーティングシステムを試せるようなデモを公開しました。]]></description>
										<content:encoded><![CDATA[
<p><strong>ボールルームダンス競技会採点システム</strong>の<strong>スケーティングシステム</strong>を独自開発しましたが、難解な<strong>スケーティングシステム</strong>の信用度の指針として、どなたでも<strong>スケーティングシステム</strong>を試せるようなデモを公開しました。</p>



<style>
.simpleblogcard_img_block7281e07f4071b192b287d6903b672bf3 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border7281e07f4071b192b287d6903b672bf3 {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title7281e07f4071b192b287d6903b672bf3 {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description7281e07f4071b192b287d6903b672bf3 {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://bdc-scoring.com/ja/skating-demo-ja/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border7281e07f4071b192b287d6903b672bf3">
			bdc-scoring.com			<div class="simpleblogcard_title7281e07f4071b192b287d6903b672bf3">
				スケーティングデモ – Ballroom dance competition Scoring System			</div>
							<div class="simpleblogcard_description7281e07f4071b192b287d6903b672bf3">
					BDC Scoring で使用している独自開発したスケーティングシステムのデモです。&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<style>
.simpleblogcard_img_block12abbb71f402807861bf6117bcdbe6ea {
  float: right;
  padding: 10px;
}
.simpleblogcard_border12abbb71f402807861bf6117bcdbe6ea {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title12abbb71f402807861bf6117bcdbe6ea {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description12abbb71f402807861bf6117bcdbe6ea {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://bdc-scoring.com/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border12abbb71f402807861bf6117bcdbe6ea">
			bdc-scoring.com			<div class="simpleblogcard_title12abbb71f402807861bf6117bcdbe6ea">
				Ballroom dance competition Scoring System			</div>
							<div class="simpleblogcard_description12abbb71f402807861bf6117bcdbe6ea">
					Features of the Service This is a scoring system for ballroom dance competitions. Enter th&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<style>
.simpleblogcard_img_block42f767eae86d8c384b25aff904f0f0c4 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border42f767eae86d8c384b25aff904f0f0c4 {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title42f767eae86d8c384b25aff904f0f0c4 {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description42f767eae86d8c384b25aff904f0f0c4 {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=http://www.jdsf.or.jp/wp/wp-content/uploads/2018/07/SkatingRule5-1.pdf>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border42f767eae86d8c384b25aff904f0f0c4">
			www.jdsf.or.jp			<div class="simpleblogcard_title42f767eae86d8c384b25aff904f0f0c4">
				http://www.jdsf.or.jp/wp/wp-content/uploads/2018/07/SkatingRule5-1.pdf			</div>
							<div class="simpleblogcard_description42f767eae86d8c384b25aff904f0f0c4">
									</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordCamp Haneda 2019 に参加し登壇しました</title>
		<link>https://blog.riverforest-wp.info/wordcamp-haneda-2019-report/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Thu, 25 Apr 2019 13:21:19 +0000</pubDate>
				<category><![CDATA[WordCamp Haneda 2019]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[WordCamp]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=1189</guid>

					<description><![CDATA[はじめに ４月２０日（土）のセッションデイのみ参加し登壇しました。昨年の WordCamp Osaka 2018 以来の方、ネットでの知り合いでしたが初見の方、人から紹介された方、こちらから話しかけた方等、複数の方と知り [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">はじめに</h3>



<p>４月２０日（土）の<strong>セッションデイ</strong>のみ参加し登壇しました。昨年の <strong>WordCamp Osaka 2018</strong> 以来の方、ネットでの知り合いでしたが初見の方、人から紹介された方、こちらから話しかけた方等、複数の方と知り合いになり、いろいろとお話しし有意義な１日を過ごしました。</p>



<p>登壇ですが、今回スライド内のコードをポインターで指しながら発表しました。以下にスライドを共有しますが、スライド内に説明がほとんど書いてなく、また、発表の動画を見てもわかりづらいかもしれないと思いました。補足説明の必要性を感じましたので、以下で説明させていただきます。</p>



<figure class="wp-block-embed is-type-rich is-provider-speaker-deck wp-block-embed-speaker-deck is-provider-wp-oembed-blog-card-handler wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="WordPress で Web サービスの構築" id="talk_frame_511308" class="speakerdeck-iframe" src="//speakerdeck.com/player/16b655087bcf4cfa8bc5c2845b6e373d" width="500" height="375" style="aspect-ratio:500/375; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe>
</div></figure>



<h3 class="wp-block-heading">補足説明</h3>



<h4 class="wp-block-heading"><strong>１２ページ　予選</strong></h4>



<p>実際の画面です。この例ですと１ヒートに１２～１３組踊ります。画面の下に６ヒートがあります。審査員が、通過者をチェックしていきます。出場７４組中４８組をピックアップします。注意すべきは、ヒート毎に選ぶのではなく全体で選ぶというのが公式のルールです。最後のヒートが終わった後に、アップ数があっていなければならないので、審査員が数合わせができるように、気になった選手の印し用にタップすると黄色になるようにしました。もし数が合わなければ黄色のところにチェックをするという仕組みです。赤文字のカウントは現在チェックしている数です。アップ数の４８以外は赤になり、また４８にならなければ送信ボタンが現れない仕組みにしました。</p>



<h4 class="wp-block-heading"><strong>１５ページ　決勝</strong></h4>



<p>上段番号が背番号、下段が順位です。下段をスワイプして順位を確定します。重複状況が赤で表示されます。重複が無くなると送信ボダンが表示され送信できます。</p>



<h4 class="wp-block-heading"><strong>２１ページ　登録直後の通知メール</strong></h4>



<p>実際にプラグインを動作させて、登録するとこの様なメールが届くしくみです。「複数のユーザーが以下の様に追加されました。」というメッセージ以降にユーザー名とパスワードリセットリンクが複数追加されます。</p>



<h4 class="wp-block-heading"><strong>２２ページ　管理画面とデーターベースの確認</strong></h4>



<p>実際に管理画面と、データーベースを確認してみると、メールアドレスが全て同じになっているのがわかります。</p>



<h4 class="wp-block-heading"><strong>２３ページ　プラグインの管理画面</strong></h4>



<p>親ユーザーと子ユーザーという概念を導入しました。登録する親ユーザーには、採点システムを管理する独自の権限グループを与え、審査員端末のユーザーには購読者の権限グループを与えました。新規ユーザーのデフォルト権限グループは親ユーザーの権限と合わせなければなりません。また、子ユーザーの追加数を課金システムと連動させるために２種類用意しました。</p>



<h4 class="wp-block-heading"><strong>２４ページ　採点システム側の登録時</strong></h4>



<p>action_add_user 関数を、user_register にフックしています。親ユーザーの登録があったら、登録を締め切ります。また６日間でアカウントを削除する BdcScoringAcountHook にフックしています。</p>



<h4 class="wp-block-heading"><strong>２５ページ　Add Multiple User 側の登録時</strong></h4>



<p>登録時のフックに対応する関数です。親ユーザーのデフォルト権限で登録した場合に、auto_insert_users 関数を実行します。</p>



<h4 class="wp-block-heading"><strong>２６ページ　複数ユーザーの登録とメール通知</strong></h4>



<p>パラメータとして、親ユーザーのメールアドレス、ユーザー追加カウント最小数、ユーザー追加カウント最大数、ユーザー名の接頭辞、子ユーザーの権限を持ちます。まずユーザー数だけループさせて、wp_insert_user 関数で登録します。その登録 ID を配列に入れておきます。次に、登録 ID の配列をループさせて、wpdb でそれぞれの子ユーザーの users テーブルのメールアドレス欄に親ユーザーのメールアドレスを書き込みます。</p>



<h4 class="wp-block-heading"><strong>２７ページ　審査員端末のパスワードリセットを試す</strong></h4>



<p>実際にうまく動作するか、ログイン画面の「パスワードをお忘れですか？」リンクから、子ユーザーである審査員端末のパスワードリセットを試しました。無事に親ユーザーであるオペレーターアカウントのメールアドレスにパスワードリセットリンクの入ったメールが配信されました。</p>



<h4 class="wp-block-heading"><strong>２９ページ　課金による端末（ユーザー）追加</strong></h4>



<p>実際の画面です。上部は、５端末で無料の画面で Stripe で課金します。下部は、課金後の画面です。課金用の画面が無くなり、２２端末まで利用可能になっているのがわかります。</p>



<h4 class="wp-block-heading"><strong>３０ページ　課金による端末（ユーザー）追加の通知</strong></h4>



<p>実際のメール通知はこのようになります。この場合は、以前の５ユーザーに１７ユーザー追加され合計２２ユーザーまで拡張されます。</p>



<h4 class="wp-block-heading"><strong>３１ページ　採点システム側の課金時</strong></h4>



<p>simple_stripe_payment_charge、 simple_pyapal_payment_charge というフィルターをプラグイン側で用意しました。このフィルターは課金が成功した場合に動作します。また、Stripe, PayPal ボタンのショートコードをプラグイン側で用意しました。このボタンを押すと課金画面が現れます。フィルターを、paypal_charge、 stripe_charge という関数にフックさせます。それらの関数の中で、Add Multiple User で用意したアクションフック amu_paid_add_user を呼び出します。アクションフックが呼び出されると、設定しておいた子ユーザーの課金済みの追加数を追加する仕組みです。</p>



<h4 class="wp-block-heading"><strong>３３ページ　採点システム側の削除時</strong></h4>



<p>親ユーザー登録時に６日で登録しておいたフック、BdcScoringAcountHook が動作した時に、delete_data_account 関数が呼び出され、親ユーザーのアカウントが削除されます。ここには書いてありませんが、親ユーザーを削除すると子ユーザーも一括削除される仕組みになっています。 action_delete_user 関数は、delete_user にフックしていて親ユーザーが削除された時に動作します。users_can_register オプションを TRUE に戻し外部から登録できるようにします。 念のために BdcScoringAcountHook をクリアしています。</p>



<h4 class="wp-block-heading"><strong>３４ページ　その他の Web サービスとしての機能</strong></h4>



<p>同じ審査員のアカウントで採点はできないので、重複ログインの禁止は必須です。Ban Double
Login は、Facebook で流れていたのを思い出して、使用してみたところ、用途にピタリとあったので採用しました。</p>



<p>Locale Auto Switch は、ブラウザの言語設定で WordPress の言語を切り替えます。</p>



<p>セキュリティ対策は、Loginizer
の他にファイルのパーミッションや.htaccessファイルなどに施しています。</p>



<p>パスワードリセット対策は、パスワードの入力の間違いを軽減させるものです。オペレーターアカウントのPCのブラウザと審査員端末のブラウザの同期ができれば問題ないのですが、そうで無い場合の方が多いです。その際にパスワードを直接入力する事になります。たいていのユーザーは推奨されたパスワードを使用するはずです。その際にエルの小文字とアイの大文字とか、オーの大文字とゼロとかを間違えて何度もパスワードリセットを繰り返すというヒューマンエラーが起こりやすく非常なストレスになります。それらの間違えやすい文字をパスワードリセット画面から除外するプラグインです。</p>



<h3 class="wp-block-heading">終わりに</h3>



<p>セッションを聴きに来てくださった方々ありがとうございました。また実行委員長の又川さん他、実行委員、当日スタッフの皆様、本当にお疲れ様でした。そして、ありがとうございました。 <br></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>WordCamp Haneda 2019 で登壇します</title>
		<link>https://blog.riverforest-wp.info/wordcamp-haneda-2019-speaker/</link>
		
		<dc:creator><![CDATA[Katsushi Kawamori]]></dc:creator>
		<pubDate>Sat, 30 Mar 2019 23:34:17 +0000</pubDate>
				<category><![CDATA[WordCamp Haneda 2019]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[WordCamp]]></category>
		<guid isPermaLink="false">https://blog.riverforest-wp.info/?p=1071</guid>

					<description><![CDATA[登壇概要 昨年１１月から競技会採点システムを始めました。複数のタブレットで採点し、PC 側で集計するものです。その Web サービス部分の機能を、5個の公式プラグインとして公開しました。そのプラグインをどのように採点シス [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">登壇概要<br></h3>



<p>昨年１１月から競技会採点システムを始めました。複数のタブレットで採点し、PC 側で集計するものです。その Web サービス部分の機能を、5個の公式プラグインとして公開しました。そのプラグインをどのように採点システムと関連させて使用しているかを一部コードを混ぜてお話しさせていただきます。</p>



<div class="wp-block-columns has-2-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block12abbb71f402807861bf6117bcdbe6ea {
  float: right;
  padding: 10px;
}
.simpleblogcard_border12abbb71f402807861bf6117bcdbe6ea {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title12abbb71f402807861bf6117bcdbe6ea {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description12abbb71f402807861bf6117bcdbe6ea {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://bdc-scoring.com/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border12abbb71f402807861bf6117bcdbe6ea">
			bdc-scoring.com			<div class="simpleblogcard_title12abbb71f402807861bf6117bcdbe6ea">
				Ballroom dance competition Scoring System			</div>
							<div class="simpleblogcard_description12abbb71f402807861bf6117bcdbe6ea">
					Features of the Service This is a scoring system for ballroom dance competitions. Enter th&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<style>
.simpleblogcard_img_block0eaeb7f3faf4395b847125a9982c8dfe {
  float: right;
  padding: 10px;
}
.simpleblogcard_border0eaeb7f3faf4395b847125a9982c8dfe {
  border-left: solid 8px #cd162c;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title0eaeb7f3faf4395b847125a9982c8dfe {
  line-height: 155%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description0eaeb7f3faf4395b847125a9982c8dfe {
  line-height: 155%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://compe-scoring.com/>
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border0eaeb7f3faf4395b847125a9982c8dfe">
			compe-scoring.com			<div class="simpleblogcard_title0eaeb7f3faf4395b847125a9982c8dfe">
				Competition Scoring System – Competition Scoring System			</div>
							<div class="simpleblogcard_description0eaeb7f3faf4395b847125a9982c8dfe">
					Features of the Service This service is a scoring system for competitions or contests. Aut&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>
</div>
</div>



<ul class="wp-block-list">
<li>メールアドレスのみの登録
<ul class="wp-block-list">
<li>一般的ですが、Web サービスとして重要な機能を付加しています。<strong><a href="https://ja.wordpress.org/plugins/user-mail-only-register/">User Mail Only Register</a></strong></li>
</ul>
</li>



<li>１つのメールアドレスで複数アカウント登録
<ul class="wp-block-list">
<li>これがメインの内容となります。<strong><a href="https://ja.wordpress.org/plugins/add-multiple-user/">Add Multiple User</a></strong></li>
</ul>
</li>



<li>課金方法
<ul class="wp-block-list">
<li>PayPal, Stripe による課金方法。<strong><a href="https://ja.wordpress.org/plugins/simple-paypal-payment/">Simple PayPal Payment</a>・<a href="https://ja.wordpress.org/plugins/simple-stripe-payment/">Simple Stripe Payment</a></strong> </li>
</ul>
</li>



<li>多国語、セキュリティ対策、パスワードリセット
<ul class="wp-block-list">
<li>その他のプラグインについてです。</li>
</ul>
</li>
</ul>



<figure class="wp-block-image aligncenter"><a href="https://2019.haneda.wordcamp.org/schedule/"><img loading="lazy" decoding="async" width="1024" height="574" src="https://blog.riverforest-wp.info/wp-content/uploads/20190331/wchaneda_timetable-1024x574.png" alt="" class="wp-image-1075" srcset="https://blog.riverforest-wp.info/wp-content/uploads/20190331/wchaneda_timetable-1024x574.png 1024w, https://blog.riverforest-wp.info/wp-content/uploads/20190331/wchaneda_timetable-300x168.png 300w, https://blog.riverforest-wp.info/wp-content/uploads/20190331/wchaneda_timetable-768x430.png 768w, https://blog.riverforest-wp.info/wp-content/uploads/20190331/wchaneda_timetable-100x56.png 100w, https://blog.riverforest-wp.info/wp-content/uploads/20190331/wchaneda_timetable.png 1321w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
