2017年11月16日木曜日

LogBook プラグインを使って WordPress の重要操作ログを手軽に取ってみよう

LogBook プラグインは、WordPressの操作をログとして保存するプラグイン LogBook をリリースしました(TaroSky)で紹介されている通り、ログ関連のプラグインです。

開発した宮内氏は、筆者も WordPress 管理運用をする上で欠かすことのできないコマンドラインツール WP-CLI チームの日本唯一のコミッターです。WP-CLIのコミッターになってからの4週間でやったことと感じたこと(Capital P)での宮内氏の発言をみるだけでも、ものすごく沢山のコミットを積極的にされているのが伺えます(というか GitHUBみたら、最近の1年間は少なくても毎日なにかの更新されてます @@!)。

また見逃していましたが、「WP-CLIをつかってWordPressのDBをコマンド1回で別のサーバーに引っ越す」ってのは、すごすぎですよね!

また WP-CLI で引っかかるメモリ問題に関してもしっかり記事「WP-CLI でメモリ不足のエラーが出る時の対処法(Quiita)」をかいていて、これも活用させてもらってます。

さらには、最近 Google Analytics を埋め込むプラグインが Jetpack と相性が悪いのが動作しなくなったサイトがあったときに、宮内氏が開発されている WP Total Hacks にもお世話になってます。

その宮内氏が、サイトの重要なイベントに対して負荷をあまりかけずにログを記録するというプラグインを開発したとなれば、これはもう使ってみなくちゃいけません!

WP-CLI からプラグインのアップデートしたら





フムフム、サーバー上(127.0.0.1)から、WP-CLI にてプラグインを2度アップデートしたと記録に入っていますネ!その通り!

管理画面からプラグインを停止・有効化してみたら




ホウホウ、筆者端末のIPアドレスから、ユーザー kitani (筆者)で Antivirus プラグインを停止したと。

あれ、「なし」が入っているのはバグかな (^^; って思ったら、こちらの特定1サイトのみの現象でした。これはこのプラグインではなく別の何かに原因がありそうですね。

WP-CLI から バックアップ > プラグイン更新 > コア更新 > 翻訳更新 > プラグイン更新 をしてみたら




むむ、コア更新 > 翻訳更新しか記録されていませんね。
なぜかを検証してみましょう。

まずバックアップから翻訳更新までは、ちょっと特殊な更新方法をしています。
(wp は /usr/local/bin/wp)

  1. wp backwpup --jobid=ID番号
  2. wp plugin list | cut -d '|' -f 2 | awk '{print "/usr/local/bin/wp plugin update "$1}' | sh
     ※アクティブプラグインだけ更新
  3. wp core update 
  4. wp core update-db
  5. wp core language update
  6. wp plugin list | cut -d '|' -f 2 | awk '{print "/usr/local/bin/wp plugin update "$1}' | sh 

という流れになっていて、赤文字のところだけが記録されています。

これを次のコマンドに変更して実行してみました。
  1. wp backwpup --jobid=ID番号
  2. wp plugin --all 
     ※アクティブプラグインだけ更新
  3. wp core update 
  4. wp core update-db
  5. wp core language update
  6. wp plugin --all 
するとプラグインも認識しました。
6番目は更新プラグインがないのでログには記録されていません。
※2度目のプラグイン更新の意味は、時々 WordPress の新バージョンのみ更新可能なプラグイン(プラグイン新バージョンが新しい WordPress を求めている場合)があり、新バージョンにしてから更新リストに出てくる時があるため。



個別のプラグイン更新(wp plugin update ◯◯)はちゃんと登録できているので書き方なんですかねぇ。まぁもうcut を使ってアクティブプラグインだけ更新するのはやめたのでいいんですけどね。
※なお cut などを間に挟むようなことをしていたのは、特定プラグインを除くなどの目的だったのだが、wp plugin update --all --exclude=logbook などで logbook 以外のプラグインすべてをアップデートとかできちゃうので、もう不要なのですよね。

2,3のサイトで数日テストして問題ないようなら、
【備忘録】WP-CLI エイリアスを利用したリモートサーバーの WordPress 管理 #wckyoto2017
を参考に、
wp @all plugin install logbook
wp @all plugin activate logbook
で手持ち端末から WordPress やサーバーにログインせずに、一括インストールと有効化するかなー

ってことで終わりにしようと思いましたが、このプラグイン、日本語化されていないのですよねぇ。個人的には翻訳不要なのですが、翻訳する分量が 70ぐらいなので翻訳してみるかぁと思ってやってみました。

LogBook プラグインの翻訳




最近の WordPress プラグイン翻訳は、https://translate.wordpress.org より手軽にすることができます。自分のプラグインならどのような場面でその言葉を使っているかわかっていますが、他人が開発したプラグインは、その利用場面によって翻訳内容が変わるときがあります。
また翻訳するにあたっては、


を参考に、長音文字、受動態はできるだけ能動態へ変換する、半角文字と全角文字の間には、半角文字1字分のスペースを入れる、などのよくあるものに特に注意を払いながら訳していくことになります。
翻訳(実際には提案)が完了したら、日本語版 WordPress Slack の #requests チャネルで翻訳の承認を依頼します。そうすれば、翻訳の達人の皆さんがチェックをしてくださることでしょう、きっと。最終的には、承認権限をもっている方によって承認されれば、めでたくみんなが使えるようになるってことです。

各プラグインの翻訳トップページに移動するには、各プラグインのダウンロードページにアクセスし、下記のように出てくれば、まだ日本語翻訳されていないことになります。


下図のように表示されれば、少なくても一度は翻訳済みになります。
ただし、プラグインが更新されていくなかで、翻訳が不十分になっているケースもあります。「Help translate it!」あるいは「翻訳の改善のご協力ください」のいずれかのリンクをクリックすることでそのプラグインの翻訳トップに移動します。


LogBook は翻訳して承認待ちなので、Waiting に入っています。



すでに 100%翻訳されていて、承認済みの場合には下記のように 100% の表示になります。



確か 95% を超えて、これが承認されればプラグイン本体に翻訳が反映されるようですね!


2017年11月16日 @kimipooh

2017年10月31日火曜日

コマンドツールで MAMP を SSL 対応しよう! - macOS High Sierra 編 -

筆者は、長らく MAMP を利用してきました。
しかし WordCamp Kyoto 2017 を契機に、 valet というツールも積極的に使うようになりました。この valet のいいところは、VCCW, Wocker などの優れたツール同様、WordPress をインストールしたり削除したりする機能が盛り込まれているので、テスト環境を作成しやすいことです。また標準で 下図のように自己証明書エラーにならない常時SSL(https://◯◯.dev) が利用できます!




valet では .htaccess が使えない


valet は Apache ではなく Nginx が利用されているので、 .htaccess が利用できません。WordPress を動作させるだけなら、それでも十分なのですが、SiteGurad プラグインなど、.htaccess が利用できることを前提に作成されたプラグインのテストが出来ません。また WordPress にかぎらず、Apache でテストしたいこともあるでしょう。

そういった場合には他のツールを利用する必要があります。

MAMP に欠けているもの


  1. WordPress の自動インストールと削除
  2. 常時SSL対応
MAMP PRO だとSSLには対応していたと思いますが、それもコマンドでできるわけではありません。コマンド一発でできることが重要なのです!

なお SSL化した場合、しなかった場合、いずれにおいても WordPress の自動インストールと削除ができるツールを
に置いてます。
詳しくはそちらをチェックしてみて下さい。

また MAMP で SSL を利用するためには、 Apache Port を 80 にしなければなりません。macOS の MAMP はデフォルトで 8888 なので、これを変更することになります。


そうするとこれまで http://localhost:8888 にアクセスしていたのが、 http://localhost になり、WordPress をインストールしていたら引っ越ししないと動かなくなります。

まぁそういう場合には、 アプリケーション > MAMP を別名にしておいて、再度 MAMPをインストールし、 2つの MAMPフォルダをつかいわけるとよいかと思います。
アプリケーション > MAMP とフォルダが決め打ちになっているので、利用したいMAMPフォルダをこのフォルダにもっていきます。

MAMP を SSL 対応するコマンドツール 「mamp-enable-ssl.csh」


にある mamp-enable-ssl.csh になります。

なんでそこまでやるのかという問いには、
  • 開発環境を変えるよりは簡単だから
と答えておきましょう。まぁ半分は趣味です。
Chomre 58 以降で必須になった SAN (SubjectAltName) にも対応してみました。

どうやって利用するの?


MAMPがインストールされていることが条件になります。
また openssl がインストールされている必要があります。
HomeBrew か Macports であらかじめインストールしておいてください。

mamp-enable-ssl.csh を仮にデスクトップに置いたとします。

ターミナルアプリを起動して

$HOME/Desktop/mamp-enable-ssl.csh

をタイプすると、

Generating a 2048 bit RSA private key
......+++
.......+++
writing new private key to 'private/ssl.key'
Enter PEM pass phrase:

とパスフレーズを聞いてきます。
これは CA認証局用のパスワードです。
まぁ自分しか使わないのでなんでもいいです。入力したら Enter を押して下さい。

Verifying - Enter PEM pass phrase:

と今入力したパスワードの確認が必要になりますので、入力して Enter を押します。

-----
Country Name (2 letter code) [JP]:

次に、CA認証局用の情報入力画面が出てきます。
予め openssl.cnf にて入力済みなので、7回 Enter を押してそのままにしましょう。

State or Province Name (full name [LOCAL]:
Locality Name (eg, city) [LOCAL]:
Organization Name (eg, company) [MAMP]:
Organizational Unit Name [MAMP]:
Common Name (eg, YOUR name) [localhost]:
Email Address []:
Generating a 2048 bit RSA private key
.....................................+++
..............+++
writing new private key to 'server.key'
Enter PEM pass phrase:

すると、またパスフレーズ入力画面で止まります。
先程入力したパスフレーズを入力して Enter を押してください。

Verifying - Enter PEM pass phrase:

と今入力したパスワードの確認が必要になりますので、入力して Enter を押します。

-----
Country Name (2 letter code) [JP]:

次に、SSL証明書のための情報入力画面が出てきます。
予め openssl.cnf にて入力済みなので、9回 Enter を押してそのままにしましょう。

State or Province Name (full name [LOCAL]:
Locality Name (eg, city) [LOCAL]:
Organization Name (eg, company) [MAMP]:
Organizational Unit Name [MAMP]:
Common Name (eg, YOUR name) [localhost]:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from openssl.cnf
Enter pass phrase for ./private/ssl.key:

すると、またパスフレーズ入力画面で止まります。
※これによって、作成した SSL証明書にCA証明局による署名をします。
先程入力したパスフレーズを入力して Enter を押してください。

Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :ASN.1 12:'LOCAL'
localityName          :ASN.1 12:'LOCAL'
organizationName      :ASN.1 12:'MAMP'
organizationalUnitName:ASN.1 12:'MAMP'
commonName            :ASN.1 12:'localhost'
Certificate is to be certified until Oct 29 08:13:51 2027 GMT (3650 days)
Sign the certificate? [y/n]:

すると、署名をしてよいかどうか聞いてくるので、y をタイプして Enter を押してください。

1 out of 1 certificate requests certified, commit? [y/n]

すると、署名を有効にしてよいかどうか聞いてくるので、y をタイプして Enter を押してください。

Write out database with 1 new entries
Data Base Updated
Enter pass phrase for server.key:

これで署名完了です。
最後にまたパスフレーズを聞いてきます。先程入力したパスフレーズを入力して Enter を押してください。

※これは、Apache に埋め込む証明書のパスワードを削除するためです。
そうしておかないと Apache を起動しようとしたときに、最初にいれたパスフレーズを毎回いれなければなりません。それを回避するためです。

writing RSA key

これで設定は完了です。

次に、CA証明書ファイル「MAMPフォルダ > conf > apache > ssl > ssl.crt 」 を macOS のキーチェーンに登録します。

CA証明書ファイル「MAMPフォルダ > conf > apache > ssl > ssl.crt 」を開いて下さい
下図のような画面になりますので、そのまま「追加」してください。
次に追加した CA証明書ファイルを「信頼」する設定をします。
アプリケーション > ユーティリティ > キーチェーンアクセス を開いて下さい。

そして「localhost」で検索すると先程インストールした「証明書」があると思います。
この時点では証明書は信頼されていません。


これをダブルクリックして設定を開いて下さい。
そして「信頼」にある SSL (Secure Sockets Layer) を「常に信頼」に変更してください。


すると、今 macOS にログインしているユーザーのみ、この証明書を信頼したことになります。



MAMPを起動してみよう!


問題なく起動したら、 https://localhost にアクセスしてみてください。


と出てきたら成功です。


と出てきたら、Cookieやキャッシュが残っている可能性があるので、それらを削除した上でブラウザを起動しなおしてみてください。あるいはそれが面倒なら、ゲストモードやプライベートモードを利用してみてください。

もし下記のようなエラーが出た場合には、「キーチェーンアクセス」にインストールした自己証明書が存在しないか、「常に信頼」設定をしていないことになります。再度チェックしてみてください。


もし途中でパスフレーズを忘れてしまった場合


再度

$HOME/Desktop/mamp-enable-ssl.csh

をしてやり直せばよいです。
初期化してやり直してくれます。

SSL 対応をやめたい場合にどうすれば?


いくつか方法があります。

  1. MAMPフォルダ > conf > apache > httpd.conf の下記をコメントする
     # Include /Applications/MAMP/conf/apache/httpd-ssl.conf
     と先頭に # を入れる。そして MAMPを再起動
  2. MAMP設定で nginx に変更する
     ※ nginx は SSL非対応
  3. MAMPを再インストールする
    1. MAMPフォルダの db と htdocs フォルダをバックアップし、 MAMPフォルダをまるごと削除
    2. MAMPをインストールし、バックアップした db と htdocs を戻す

Appendix. このツールはどういう動作をするの?


大まかな流れを説明します。
  1. openssl がインストールされていることを確認(Homebrew or MacPorts or /usr/local/bin/openssl が存在するかどうか)
  2. MAMP の conf/apache/httpd.conf を書き換え、conf/apache/httpd-ssl.conf を読み込むようにする
  3. conf/apache/extra/httpd-ssl.conf --> conf/apache/httpd-ssl.conf にコピーし、必要な置換を行う
    1. 証明書関連
    2. ログ関連
  4. CA 認証局 & SSL 証明書を発行(sha256, 2048bit)
    1. conf/apache/ssl フォルダを作成(存在したら削除し、作成)、サブフォルダ等作成
    2. conf/apache/ssl/openssl.cnf を生成
      ※中身は、本スクリプト内に埋め込み
      ※ここの localhost を別の名前にしたら、独自ドメインなども利用可能です。もちろん別途 /etc/hosts に 127.0.0.1 に対して 独自ドメインを有効にする設定が必要です。
    3. 各種証明書の発行

2017年10月31日 @kimipooh

2017年10月15日日曜日

第69 回 WordBench 大阪「WordPress ログインに Google 認証を使ってみよう」で登壇して #wbosaka #wordpress #google


今回は登壇者として参加しました。
セッションとハンズオン合わせて 3時間ほど時間をもらっていましたが、みんな優秀で 1時間強でセッションとハンズオンが終わってしました @@!
ハンズオン自体はおかげさまで好評だったようで、それぞれの実環境やクライアント環境で導入するというと言ってくださった方々がいたのでやったよかったかなと思います。

雨が降る中、会場となるファーストサーバー大阪本社へ、参加登録していただいた19名(内メンターが2名)について、全員参加していただきました。ありがとうございます!




登壇者って凄いのって思われるかもしれませんが、WordBench 勉強会に関してはそうでもありません。発表することでより深く WordPress について勉強することができるので、◯◯についてもっと詳しくなりたいな!と思ったら、発表者になってみるのもよいですよ!昔、「1週間後にクライアントに納品する WordPress はあるけれど、手持ちには 静的HTMLで作ったデータしかない、どうやって WordPress にしたらいいですか」を参加者に聞くために登壇者になった強者もいました。実際その場で逆ハンズオン(参加者が登壇者に教えていく)をしたわけですが、そういうのもありじゃないかなーと思います。

今回の反省点はこれだけ時間的余裕があるなら、「WordPress のローカル環境を手軽に作成してみよう!」なんてのを合わせてやってもよかったなぁと思いました。人によっては vagrant 環境を以前入れていたが、久しぶりに動作させようとすると動かなかったりした方もおられました。ので、そういうのを合わせてやるといい感じかなと。また機会があれば、WordCamp 等でやってみたいですね。

特に今回のために、 MAMP にコマンド一発で WordPress をインストールしたり、削除したりするツール(GitHUBで公開)を作成したので、MAMPとツールを使ったハンズオンもよいかなと思いました。ただMacしか試してないので、今回のように参加者全員が Mac ユーザーでないかぎり、Windows のことを考えないといけないので、そこはいろいろ試さないといけませんよね。

スライド




セッションとハンズオンの内容もすべて網羅しています。
これを見れば問題なく導入可能かと思います。
ただ2,3戸惑った方がおられたので、そのケースについて下記の紹介しておきます。

スライド19〜21において、Google Developer Console (Google Cloud Console内)のAPI設定におけるいろいろなケースについて紹介しています。
そこで漏れていたのが、ポート指定されたURLです。

http://localhost:8888/demo/  の場合にはどういう指定がしたらよいか


認証済みのJavaScript生成元:http://localhost
認証済みのリダイレクト URI:http://localhost:8888/wp-login.php


となります。
認証済みのJavaScript生成元については、 http://localhost:8888 をいれて保存すると自動的に、http://localhost に修正されます。

Appendix. WP-CLI コマンドで WordPress の自動メンテナンス


時間が余ったので何名かとこの話題について話しました。
ssh ログインが出来るサーバー なら出来る可能性があります。
実際には、WP-CLIコマンドをインストールできて(パスのある場所にダウンロードした WP-CLIを置くだけでいい)、cronが使えたら完璧です。当方は AMIMOTO のマネージドホスティングを使ったりします。ssh でログインできれば大抵のところはインストールできるんじゃないでしょうか。
それができれば上記のように、コマンド一発で、WordPressのバックアップ > プラグイン更新 > 本体更新を自動化できるので、多数の WordPress のメンテナンスを抱えている方々にとっては管理がとても楽になります。

wp @all  core version

なんてのを手持ちの Mac なんかでターミナルから叩くだけで、設定した全サイトの WordPress のバージョン情報が出てきます。これって深刻なセキュリティ脆弱性が報告された際、メンテナンスが必要な WordPress にログインしなくても、それぞれの現在のバージョンが一括で表示できるので超便利ですよ!

これもハンズオンしたら面白いかもしれませんね!

昼食&懇親会


昼食は会場であるファーストサーバー大阪本社から近い所にあるガストで肉を食べました。

ちょっと肉がかたい感じがしましたが、まぁやすいのでそれもまたよし。

懇親会は、GOTENさんが音頭を取って開始!懇親会費は1000円なり〜


結構はやくおわったせいで、ピザがなかなか届かずに、お菓子と飲み物で楽しく歓談できました!


2017年10月15日 @kimipooh

2017年9月17日日曜日

WordCamp Tokyo 2017 に参加して(二日目 コントリビューターDAY) #wordcamp #wctokyo

台風が関西に近づいてます...
その影響でコントリビューターDAYは午前中のみにして、昼から帰ることにしました。
ちょっと残念ではありますが、明日は外せない用事があるので安全を取ることにしました。だからといって、コントリビューターDAYで手を抜くわけではありませんよ!



会場にはお菓子も結構な種類用意されてました!



楽しそうにやってますね!
結構な人数が参加したなぁという感じです。

複数の公開 Google カレンダー をマージして 一覧表示するプラグインを公式プラグインにアップしてみよう!


様々なプロジェクトなどに関わっているとイベントも盛り沢山で、1つの Googleカレンダーで管理するには限界が生じます。ならばマージして一覧表示してしまえばいいんじゃね?という発想です。仕事では現時点では1つの Googleカレンダーの各イベントにハッシュタグを作って、言語判別(#lang)、主催者(#organizer)、種別(#type)などをどんどん追加することで管理するようにしてます。しかし、いずれは破綻するでしょう。そのため複数カレンダーをマージするのは必須なのです。

そこで筆者が仕事で利用するのに開発し公式プラグインにアップしているプラグイン「Google Calendar List View」について公開された複数 Google カレンダーからデータを取得し、それをマージして一覧表示する機能を付与してみたいと思います。

本当は一日あれば、List View for Posts という、これまた筆者が仕事で利用するのに開発した公式プラグイン(固定、投稿、カスタム投稿を纏めてマージして一覧表示、さらにカテゴリーやタクソノミーによるカテゴリー表示もできる)について、RSSもマージしてやるかぁとおもっていたのですが、それはまた別の機会にすることにします。

どうやって実装する?


すでに1つのカレンダーからの一覧表示は完成しています。
そこに複数のカレンダーをいかに設定してもらうかがキーになります。
手軽にやるには、ショートコードにカレンダーIDを複数設定してもらうことですね。できれば Calendar APIもカレンダーごとに複数設定できればよしです。なぜなら、Calendar APIの一日のクエリが 100万クエリと制限(無料で利用できる範囲)されているためです。

[gc_list_view g_id="Google カレンダー ID"  g_api_key="Google Calendar API"]

が基本的なショートコードの形です。
これを複数設定できるようにするためには、次のようにするとよいかなと思います。

[gc_list_view g_id="Google カレンダー ID"  g_api_key="Google Calendar API" g_id_2="Google カレンダー ID 2"  g_api_key_2="Google Calendar API 2" ]

つまり、 g_id_任意  と g_api_key_任意 で名前がユニークならそれをもってGoogleカレンダーからのデータ取得を試みるっていう実装方法ですね。これなら苦労はしなさそうです。

新幹線から参戦!




12時過ぎに大枠では実装できました。
しかし台風が近づいているのでタイムリミット。WordSlack の #plugin に上記コメントを残して 会場を後にしました。

でもふと思いました。新幹線からでも参戦できるじゃん!

そして Twitter に参戦するぜ!ってコメントして、実際に参戦しました。

ネット遅すぎる・・・

と悶ながらも、
  1. プラグインのアップデート
  2. プラグインの翻訳(アップデートしてから20〜30分ぐらいで翻訳可能になる .. GlotPress に対応している場合)
  3. ドキュメント書き換え(日本語と英語)
  4. 本ブログの作成と公開
「4」以外は 15時30分の発表までに間に合ったぜぃという感じです。


で実際のスライドはこちら


そのうち SlideShareに移動するかも。とりあえず時間がなかったので、Google スライドのやつをそのまま公開しました。

なんとか公開までいけてよかったです。。。

2017年9月17日 @kimipooh

2017年9月16日土曜日

WordCamp Tokyo 2017 に参加して(一日目 セッションDAY) #wordcamp #wctokyo

今回の WordCamp Tokyo 2017 の会場は西新宿にあるベルサール新宿グランドコンファレンスセンターでした。
ホテルは少し高いですが近場がいいなぁと思って、ホテルローズガーデン新宿にしました。ちょうど期間限定の安いプランがあったので、それに乗っかりました。西新宿駅(メトロ)の1番出口から左手に少しいったところにあります。新しい別館ではなかったのは残念でしたが、部屋は小さいものの、夜も静かで快適に過ごせました。ただ、「Wi-Fi の暗号が WEP かい!?」「ベッド付近は届きにくいぞ〜」ということはありましたが、まぁ許容範囲です。しかし高いので、次回以降同じ会場なら遠くてもいいので、もう少し安いところにしようと思ったのでした。

前日入り



朝からでようと思うと辛い(一日のイベントならまだしも二日あるので)ので、前泊することに。夕方に、六本木にあるスヌーピーミュージアム東京ってところを見てきました。夕食は、知人がオススメしていた池袋にある美そ乃で焼肉を堪能しました。いろいろな部位を楽しめるということで、19部位を食べたのですが、とてもジューシーで美味しかったです!予算は5000円ぐらいを見ておくとよいです。確かに高いですが霜降り肉を含む焼肉をお腹いっぱい堪能するなら、リーズナブルだと思います。一人でぶらっと入っても大丈夫というのがいいですね! 


9月16日(セッションDAY)



朝から近場のジョナサンでモーニングセット!

WordCamp は東京、関西、京都の3つだけしかいってませんが、いずれも会場までの道順をストリートビューのような形で案内してくれるのは、超方向音痴な筆者にとってありがたいです!前日から何度か迷いましたよ! 西新宿駅からホテルローズガーデン新宿までいくのに、Google Map くんの現在位置がかなりずれていて、目の前にホテルがあったにも関わらず、通過して警察署付近で「あれ〜おかしいなぁ」とかいってました。思わず警察署の外にいた警察署の方に聞いてしまいそうになるのをぐっとこらえて探しましたとさ....





スポンサーブースで配っている粗品の質が高すぎる!!
モバイル充電器やTシャツまで配っているところがありましたよ!

YAT さんに久々にあってまずは一言、「他の人が壺セッションやってますよ!」でした。何?って人は「YAT 壺」で検索してみてね (^^;(本人の名誉のために一言、真に受けないでください、よく知る仲間達の冗談ツイートです)




ランチチケットは売り切れたらごめんという配布方法なので早速ゲット!

ネットが接続できないのが痛かった。WEB認証のようですが、それが通らない。おそらくコネクション数がオーバーしたのでしょう。仕方なしに手持ちの Wi-Fi を使ってみるも電波競合でおそすぎる〜。

開会挨拶




実行委員長からの挨拶。日本でこれまで開催された WordCamp は 8つ!
東京は横浜と合わせて10回目だそうな。

さて以下のセッションはいつもどおり、発表された内容、発言を筆者の理解の元、速記したものです。#や→ は筆者のコメントになります。そのため、筆者の理解がおかしくて発表者の意図しない内容になってしまうことがあるかもしれません。

2017年9月9日土曜日

【備忘録】WordPress の カスタムフィールドの日付で、日別アーカイブを生成するには

WordPress.org 日本語フォーラムで
という質問があり、実際に試して回答しました。
これについての情報が見当たらなかったので、ここで備忘録としてメモしておきます。どういう考えて修正してうまくいったのかも書き出しておきます。SQL文の勉強になるかもですよ! それに筆者も、またどこかで使えるかもしれませんので、残しておくのは役立ちます。

やりたいこと


記事のアーカイブを、各記事に設置した カスタムフィールド(date_field)に沿って、日別アーカイブ表示したいというもの

2017/09/02 (1)
2017/08/19 (2)
2017/07/02 (3)

とかそういう感じに出すってことです。
そして日付をクリックしたら、カスタムフィールド(date_field)の日付が一致したものの一覧がでるということですね。


がちょうど年月のアーカイブができるので、これに日をたせればできるんじゃない?ってことで実際にやってみました。

前提


管理ダッシュボード > 設定 > パーマリンク
で投稿に対して、日付(年月日)が付与されるようにしてください。



利用方法


Step 1. テーマの functions.php に下記のソースコードを追加


ソースコード:https://ideone.com/BavQDi

Step 2. 表示するコードを追加(例  index.php)


ここでは説明のために デフォルトテーマ「Twenty Seventeen」の index.php に書き込み、トップページの記事の一番上に表示するようにします。


下記のコードを図のように if ( have_posts() ) : の下に追加してみてください。

my_get_year_archives( array(
'date_field' => 'date_field',
) );




そうすればトップページに日付一覧が降順に表示されるはずです。

【WordPress】カスタムフィールドの日付でカスタム投稿の年月別アーカイブ(pronet)では、カスタムフィールド(date_field)は、YYYY/MM/DD (2017/07/02)を元にしていました。このあたりはいろいろ変更できます。
さて備忘録なので、実際にどういう変更をしたのかも説明しておきます。

変更点


変更1)カスタムフィールドの値から 年月だけでなく 日も取り出すSQL文に書き換える


$select = "SELECT SUBSTRING($field,1,4) AS `year`, SUBSTRING($field,6,2) AS `month`, SUBSTRING($field,9,2) AS `day`, count(p.ID) AS posts";

$query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4), SUBSTRING($field,6,2), SUBSTRING($field,9,2) ORDER BY $field DESC $limit";


赤い部分の追加です。
YYYY/MM/DD 、1文字 = 1バイト(1バイト英数記号)と仮定すると、
  • 1,4 = 1文字目から4文字分(YYYY)
  • 6,2 = 6文字目から2文字分(MM)
ときたらもうわかりますよね。
  • 9,2 = 9文字目から2文字分(DD)
を付与すればよいということです。

※全角(日本語)のように 2017/08/19 とした場合に、SQLクエリの方でなんとかしたいなら、CATをつかうとよいようです。


変更2)HTMLコード出力に日データを追加


$url = add_query_arg( array( 'meta_key' => $date_field ), get_day_link( $arcresult->year, $arcresult->month, $arcresult->day) );

$text = sprintf( '%d', $arcresult->year ).'/'.sprintf( '%02d', $arcresult->month ).'/'.sprintf( '%02d', $arcresult->day );

->year, ->month, ->day の year, month, day については、変更1)の AS `year`、 AS `month`、AS `day` に紐付いています。

<li><a href='https://demo.dev/2017/09/02/?meta_key=date_field'>2017/09/02</a>&nbsp;(1)</li>
<li><a href='https://demo.dev/2017/08/30/?meta_key=date_field'>2017/08/30</a>&nbsp;(1)</li>
<li><a href='https://demo.dev/2017/07/02/?meta_key=date_field'>2017/07/02</a>&nbsp;(1)</li>

のようなコードが出力されます。

変更3)WordPress の検索クエリのカスタマイズに日を追加


下記の赤文字の部分が追加分です。
WordPress での投稿日付は、年 = year、 月 = monthnum、日 = day に保存されます。
ので下記のような追加になります。

function my_pre_get_posts( $query ) {
    if ( $query->is_day ) {
        $meta_query = array(
            array( 
                'key'     => $query->get( 'meta_key' ),
                'value'   => $query->get( 'year'     ).'/'.sprintf('%02d', $query->get( 'monthnum'     )).'/'.sprintf('%02d', $query->get( 'day'     )),
                'compare' => 'LIKE'
            ),
        );
        $query->set( 'meta_query' , $meta_query );
        $query->set( 'year'             , ''          ); 
        $query->set( 'monthnum'   , ''          );
        $query->set( 'day'   , ''          );
        $query->set( 'date'       , ''          );
        $query->set( 'meta_key'   , ''          );
        $query->set( 'post_type'  , 'post');
    }
}

2017.9.9 @kimipooh

2017年9月3日日曜日

「REST祭 - WordBench大阪&京都&長野@さくらインターネット大阪本社」に参加して #wordbench #wb_rest

今回は遠隔会議(Google Hangouts)を使った三拠点同時開催。
筆者は WordBench大阪(第67回)会場である、さくらインターネット大阪本社へ訪れました。



グランフロント大阪タワーAの35階から眺める景色はなかなかいい感じですね!

プログラム

個人的には「WordPress ログインにVoice Overな2段階認証をつけてみる」あたりに興味ありですが、そろそろ REST API についても詳しくなりたいなぁと思って参加しました。

以下、発表された内容を筆者なりの解釈をして速記したメモです。
筆者自体のコメントは # を付けます。

2017年9月1日金曜日

WordPress 公式プラグインに PHP 対応バージョンを表記できるように(でもまだ必須じゃない)


まだ単なる表記だけのようですが、そのうち必須になる流れなのかなと思います。
現状 PHP7 以降しか使えない三項演算子「??」が使いたくてウズウズしていたので、必須になったら気兼ねなく使えそうですね!




書き方


WordPress公式プラグインリポジトリが対応PHPバージョンの表記に対応(@高橋 文樹 氏)

などに詳しく説明されていますが、筆者自身への備忘録のためここでも説明しておきます。

readme.txt に「Required PHP: バージョン」を追加せよ!
ってことですね。実際には下記のような感じです。
このプラグインは PHP 5.3 以降(三項演算子 ?: 使っているので)が必須ですが、PHPのサポート状況を考えることとテスト環境が PHP 5.6.x と 7.0.x と 7.1.x なので、表記するなら PHP5.6 からかなぁと。




これが Required at least (WordPress のバージョン)のようにインストール時の必須項目になったら、三項演算子「??」をつかいまくってやる!!


と密かに思っているのでした。
ちょうど、 PHP カンファレンス 関西 2017 で三項演算子についてまともに話を聞いて、それから三項演算子ファンになってしまったのでした。ただ PHP 5.3や 5.6では ?? が使えないのですよね。

もし $hoge["foo"] が確実に存在するなら、
$hoge_foo = $hoge["foo"] ? $hoge["foo"] : "none";


$hoge_foo = $hoge["foo"] ?:  "none";

とかけるのだけど、存在しない場合があるなら未定義エラーになります。
ので、下記のように書かざるをえないわけですが、

$hoge_foo = isset($hoge["foo"]) ? $hoge["foo"] : "none";

PHP7から実装された ?? を使えば、

$hoge_foo = $hoge["foo"]) ?? "none";
とスマートになるわけですよね。

そんなわけで、「Required PHP: バージョン」が必須になる日が待ち遠しいのでした。

2017年9月1日 @kimipooh

2017年8月30日水曜日

WordPress プラグイン 「List View for Posts」を公式プラグインで公開! #wordpress #plugin

カスタム投稿、投稿、固定ページ、ついでに The Event CalendarのイベントをWPMLプラグインに対応しながら一覧表示するショートコードが使えるようになるプラグイン。もちろんどれを一覧表示に含めるかは設定できます。一覧表示プラグインはいくつかありましたが、一年以上更新されていないものもあり、特にWPMLという特殊なものが入っていてややこしいので必要に駆られて作っちゃいました。

公式プラグイン




ドキュメント


となります。ドキュメントにかけることは全部書いたので、あとは適当に触ってもらったら使えるかなと思います。

TiPS


出力されたHTMLを表示したら、見栄えがわるんだけど?


出力コードは、CSSでデザイン・レイアウト変更できるようにしています。
見栄えに関するCSSコードは一切入っていません。筆者はデザイン力0なので、そのあたりのフォローはしません。そのCSS部分は、テンプレート側のCSSに追加するなどして調整してください。

class の接頭文字を変更してみよう


まぁここはちょっと譲れないところがありますよね。
デフォルトは、 list-view-posts_◯◯ って class が各項目に付きますが、ここの list-view-posts を変更できます。
  • [list-view-posts  html_tag="hogehoge"] 
ってすると、 hogehoge_◯◯ になります。

投稿全部とカスタム投稿(news と faq)を一覧に載せたいんだけど?)


まぁよくあるパターンかと思います。
  • [list-view-posts  post_type="post,news,faq"]
です。基本は降順にソートされて作成日時順に並びます。

予定など未来の記事を載せたいんだけど?


メンテナンス予定などは一番トップに出すために、公開日時をメンテナンス日にして予約投稿を解除するなんて設定をして公開してませんか。そういった場合にでも
  • [list-view-posts  post_status="publish,future"]
で公開済みに加えて、予約済みの記事も一覧表示の対象にします。
これでメンテナンス日の一覧表示もばっちりです。

カテゴリー表示したいんだけど?



上図のように、記事のカテゴリー(お知らせ とか)ごとに色を変えるなどして見せるのはよくやってるサイトありますよね。大丈夫できます。
  • [list-view-posts enable_view_category="true"]
特定の記事に複数のカテゴリーが設定されると、一番最初に取得したカテゴリーを表示します。

別途タクソノミーを追加設定しているけど、それもカテゴリー表示できるの?


はいできます。
種類(追加のタクソノミー):type

をカテゴリー表示に加えたい場合には、既存のカテゴリー(投稿):categoryを加えて次のように記述します。

  • [list-view-posts enable_view_category="true"  category_taxonomy="category,type"]

カテゴリー自体を複数設定(タクソノミー設定)している場合には、それぞれのカテゴリーで指定した最初のカテゴリーを表示します。上図の「お知らせ」のような分類分けがタクソノミー設定しただけ増える可能性があるってことですね(まぁ記事にチェックした場合のみですけど)

どのカスタム投稿の記事か知りたいんだけど?


わかります。複数のカスタム投稿を纏めて一覧にした場合にはややこしいですよね。
できます。
  • [list-view-posts enable_view_post_type="true"]
です。これでカスタム投稿のみ上図「お知らせ」の分類のところに、「カスタム投稿名」が追加されます。

パスワード保護された記事が一覧に出てこないんだけど?


デフォルトでは非表示になっています。
表示したい場合には、次のようにします。
  • [list-view-posts enable_password_protected_post="true"]


ページ送りってできるの?


ページ送りのHTML出力自体はサポートしていませんが、30〜50、50〜70など特定の項目の一覧を出すことができます。
  • [list-view-posts max_items=50  page=1]   =  1〜50
  • [list-view-posts max_items=50  page=2]   =  51〜100
のように、 ($page - 1) * $max_items + 1 〜    $page * $max_items のデータがとれます。これをテンプレートのループで使えば、いけるんじゃない?って感じです。

出力されるHTMLコードを変更したいんだけど?


デフォルトでは、4つのテンプレートが用意されています。
  • [list-view-posts  html_tag="li"]  = <li><span> 系
  • [list-view-posts  html_tag="p"]  = <p><span> 系
  • [list-view-posts  html_tag="dd"]  = <dd><span> 系
  • [list-view-posts  html_tag="pli"]  = <li><p><span></span></p> 系
まぁでも自分のサイトに合わせて変更したいですよね!
そのときにはフックが使えます。
詳しくはドキュメントの「フックの使い方」に事例とサンプルコードを載せたので参考にしてみてください。

2017年8月30日 @kimipooh


2017年7月4日火曜日

【注意】WordPress プラグイン「Responsive Lightbox by dFactory」にXSS脆弱性あり(要更新)

JVN#39819446
WordPress 用プラグイン Responsive Lightbox におけるクロスサイトスクリプティングの脆弱性 が出てるよ〜うち入れてたっけ?

という同僚の声が聞こえてきたので、早速先日導入した WP-CLIのエイリアス機能を使って調べてみました。
手持ちのMacマシンから、

  1. ターミナル起動
  2. script check-plugins-wps.txt
  3. wp @all plugin list
  4. exit

で、check-plugins-wps.txt をテキストエディタで開き、lightboxは使われていないことを確認。

  • wp @all plugin list |grep lightbox 

だけでもいけるが、じっくり見たほうが良さげかなぁと思って一度ファイルへプラグインリストを書き出してみた。

プラグインアップデートは、

wp @all  plugin update responsive-lightbox 

をすれば一発でできちゃいますね!
このアップデート状況を保存しておきたければ、 script を使って

script update-responsive-lightbox.txt
wp @all  plugin update responsive-lightbox 
exit

ってしておけば、exitするまでにターミナルに出てくる文字や入力した文字も含めて、 update-responsive-lightbox.txt に保存できるから、後から見直すのが楽です。

もし該当プラグインが入ってなければ、
Warning: The 'responsive-lightbox' plugin could not be found.
Error: No plugins updated.
が出るので一括でやってしまっても問題なし。

便利なエイリアスについては


に纏めてます。

2017年7月4日 @kimipooh

2017年6月30日金曜日

【備忘録】WP-CLI エイリアスを利用したリモートサーバーの WordPress 管理 #wckyoto2017

WordCamp Kyoto 2017 のセッション「WP-CLI入門」で miya0001 氏が、「WP-CLIのエイリアスを使ったら管理楽だよ〜」っておっしゃっていたのをついに実現。そのときのスライドは下記の通り。



発表動画はこちら(wordpress.tv) >>> 

これ知っていたら、バックアップ > プラグイン更新 > コア更新 という一連の流れについてわざわざ独自スクリプト作る必要なかったじゃんって感じですね。

以下前提として、WP-CLI の wpコマンドの最新版が入ってることを前提とします。

準備(パスワード確認をスルーして ssh接続)


2017年6月26日月曜日

WordCamp Kyoto 2017 に参加して #wckyoto2017

今年は職場である京都大学(国際科学イノベーション棟)でやるってことで、実行委員の会場チームに入って会場周りのサポートをしていました。まだ出来て2年ほどしかたっていないこともあり、機能的でバリアフリーでなかなかよいところです。




出町柳から京都大学へ。このまままっすぐ進むと正門に到達します。
会場では京都らしい傘が用意されてました。



大盛り上がり!!


開始直後こそ、パラパラときていた参加者も少し立てば大混雑。
セッションも全部立ち見がでるぐらいだったそうな。



今年のスタッフ Tシャツ


今年のスタッフ Tシャツは、なかなかユニークです。さらに手ぬぐいもありますね!


昼食&懇親会は無料だぜ!


昨年の WordCamp Kansai 2016同様、ランチは無料提供です!
さらに懇親会まで無料。委員長挨拶で、参加者一人当たりにかかった費用は 7000円を超えるということでした。それがすべて無料にできるほどスポンサーも集まり、また参加チケットもあっという間に無くなるぐらいの盛況ぶりでした。



懇親会も賑わってました!


二日目は、カンフォーラにいってステーキカレーを初めて食べました。
ココナッツミルクの入っていないタイカレーみたく辛かったのですが、美味しかったです。

コントリビューターDAY(2日目)


先にコントリビューターDAYの話をします。
コントリビューターDAYへの参加者の約半数が、初めて参加ということに驚きました。


私は当初の予定通り、プラグインチームに入って、自身の公式プラグイン(Google Calendar List View)の利用マニュアルを中心に、問題点の改善に取り組みました。結局、日英のマニュアルを整備できたところで終わりましたが、次の点を改善できました。

コード自体は、帰ってからと翌日かけて修正しました.. よしこれでつかえるぜ〜。

翻訳コードの部分は、変数を入れたらダメ


printf, sprintf などを使って、翻訳コードのための関数(__や_e)に渡す引数は文字にしてしまうこと。。という基本的なことを理解できたのが良かったです。

つまり例を上げると
  • _e ('hogehoge ' . $hogege . ' dayo.',  'hohoho');
なコードはGlotPressでの翻訳をしても適用されないってことです。
  • _e (printf('hogehoge %s dayo.',  $hogege),  'hohoho');

にしろってことですね。
同じく __ をつかう場合には

  • $hoge = __('hogehoge ' . $hogege . ' dayo.',  'hohoho');
ならば
  • $hoge = __(sprintf('hogehoge %s dayo.',  $hogege),  'hohoho');
ってな感じですね。

WordPress Importer でアップロード失敗する問題


プラグインチームの1つの柱として別の人があれこれやっていたら、「それって、ブラウザのタイムアウトなんかの問題じゃない?」ってツッコミが。たしかにいくらサーバーのアップロード制限を緩和したところで、ブラウザのタイムアウトを超えるデータ通信をするとどうにもなりませぬな。。ってことで終了したのでした。。。

あと初めてプラグイン開発をした方が、
  • ギャラリーの挙動変更(スライドさせたり〜)
  • エディタの文字に対して Google検索のサジェスト候補がでてくるようにする
なんてのを開発されていました。後者は申請まで出来たとか!

他のチームの発表をみていると、

WordPress ユーザーズマニュアル
https://wckansai2016.github.io/wordpress-document/

を含めて、皆さんかなり濃密な一日を過ごされたようです。
はしゃいでいる声もすくなく、結構もくもくと作業されているのが印象的でした。
もちろん歓談を楽しんでいた方もいて、全体的によい雰囲気でした!

 WP-CLI入門(の呪い)


一日目ガッツリ聞いたのは、このセッションでした。

ここで話に出てきた、WP-CLIで valet を操作しようでハマってしまい、いつも速攻でブログ書いているのに書けませんでした.. これは、普段 MAMP を対応している筆者に、MAMPはダメダメ〜って miya0001 から何度か言われている筆者への呪いということにしておきましょう (^^;  その後解決〜。

VCCWWP Total Hack でも有名な miya0001 さんが登壇。WP-CLIでもかなり貢献されています。WP-CLIは、WordPress をコマンドラインで自由自在に操作できる、インフラを含む WordPress 管理者によっては、WP-CLIは救世主ツールです。

筆者も、バックアップ → プラグイン更新 → コア更新 → 言語更新 という一連の流れを WP-CLIで実装したり、WordPressの新規構築の初期設定を一括処理するときにも重宝超重宝しています。ただ、細かい機能については追っていなかったので、ここで話をお聞き出来たのはよかったです。

ここでは備忘録として残しておきたいものをメモしておきます。

WP-CLI で valet を操作しよう!


ズボラな筆者は、MAMPばっかり使っては miya0001 さんに突っ込まれたりしてましたが、そろそろ環境を変えてみようかなということで、valet を使って見ることに。

valet インストール と W-CLI連携


MacOS Sierra な環境では
  1. Homebrew の導入
     https://brew.sh/index_ja.html (bash シェルをつかうこと)
  2. valet のインストール
    https://laravel.com/docs/5.4/valet#installation を参考に
    1. brew install homebrew/php/php71
    2. brew install homebrew/php/composer
    3. composer global require laravel/valet
    4. brew install mysql
    5. brew services start mysql 
    6. ~/.composer/vendor/bin と /usr/local/opt (mysql用)のパスを入れる
      1. echo 'export PATH="~/.composer/vendor/bin:/usr/local/opt:$PATH"' >>  ~/.bash_profie
      2. 一旦ターミナルを閉じて開き直す
    7. brew link php71
       エラーがでたら、sudo chown -R 自分のユーザ名 /usr/local/ に権限を与えておく(これは、valet install で[DomainException] Brew was unable to install [nginx] とエラーがでるときの対処)
    8. valet install
    9. ~/.bash_profile に
      export WP_CLI_PHP_ARGS='-d memory_limit=-1'
      alias wp="php -d memory_limit=-1 /usr/local/bin/wp"
      を入れておく。
      ※あとからmiya0001 さんからの指摘:WP-CLI でメモリ不足のエラーが出る時の対処法(Qiita - miya0001)
      open -a textedit  /usr/local/php/etc/7.1/conf.d/php-memory-limits.ini
       ; memory_limit = 128M
      memory_limit = 512M
    10. wp package install aaemnnosttv/wp-cli-valet-command

<ハマった点>

wp package install aaemnnosttv/wp-cli-valet-command をしたときに、
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1028096 bytes) in phar:///UNIX/local/bin/wp/vendor/composer/composer/src/Composer/Util/RemoteFilesystem.php on line 386

とエラーが出てしまう。/usr/local/php/etc/php.ini のmemory_limit をいじってもダメだったこと。

wp valet new demo


  1. mkdir demo
  2. cd demo
  3. valet park
  4. wp valet new demo

ちゃんと wpコマンドに valet が紐付いていたら、

Don't go anywhere, this should only take a second...
Success: demo ready! https://demo.dev

と出るはず。もし、wp core download せよとかいっていたら、紐付いていないという証拠。

https://demo.dev
404 - Not Found

telnet demo.dev 443 は接続できるのに何故だ。
~/.valet 内の nginx 設定をみても間違いが探せぬ。
ping demo.dev は 127.0.0.1 だし。。
これは miya0001さんの呪いと命名しよう(時間切れ)。

2日後にわかったが、valet park を叩いて、該当フォルダを valet として使えるように pathに含めておかねばならなかった。

なお、 nginx の restartは
sudo brew services restart nginx
でできるみたい。brew はあまり本格的に使っていなかったのでした。

また削除は
wp valet destroy demo
とかでできる。

MAMPと併用するためには(追記)


もし MAMPを 80/tcp で動作させている場合には、nginx とバッティングします。
  • valet stop 
でnginxも自動停止しますので、使わない時には上記コマンドを叩いておきましょう。
ただ brewで起動した mysqld は残ります。若干でもバッテリーを気にするなら、
  • brew services stop mysql  

としてサービスを停止しておきましょう。
次に利用する時には

  • valet start
  • brew services start mysql 
で利用できます。



2017年6月26日 @kimipooh

Google+ Badge