フォーム作成時、inputのnameに予約語を使うと404になる

IMG_2141

先日からカスタマイズで会員サイトの新規ユーザー登録、ユーザー情報変更、掲示板投稿などの画面をフォームで作成しててはまったのでメモ

仕様は

  • フォームで情報を入力後確認ボタンを押すと確認画面が表示または登録される。
  • PHPファイルは1つ。
  • POSTで入力されたデーターを渡す。
  • 当然ですが、1ファイルでやるのでSubmit後は同じページが表示される。

と言う内容で何画面か作成しているのですが、入力後、submitボタンをクリックすると404ページが表示される。原因は、タイトルにも書きましたが、inputのnameに予約語を使うと404になるんです。
つまり、以下のような感じ↓
input type="text" name="ここに予約後は使えない" id="user_login" value=""
ってわかっててもなんか使ってしまっているのか404ページが出まくる!

ちなみに、予約語って何?という方にざっくり言うと、「この名前使うから使わないでね!」って感じのものです。PHPにもありますし、WordPress自体にもあり、ちなみにcoreファイルにちゃんと書いてある。
こんな感じ↓
/**
* Public query variables.
*
* Long list of public query variables.
*
* @since 2.0.0
* @access public
* @var array
*/
public $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type');
/**
* Private query variables.
*
* Long list of private query variables.
*
* @since 2.0.0
* @var array
*/
public $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in' );

フォーム作ってて何もおかしいところがないのになぜか404ページが出るときは疑ってみてもいいかも!
あと、回避するのは簡単!
以下のように、何かつけるだけで回避できます。
input type="text" name="user_login" id="user_login" value=""

結構、当たり前なの事なんだけど、いざとなると忘れてしまっている内容でした。

wp_update_user 使ってて

 今、取りかっかている案件でパスワード再発行のページを作っている。作っててなんで?と思った事があったのでメモ!!

ユーザー名またはメールアドレスで登録されているユーザーかどうか確認後、登録されていれば、乱数のパスワードを自動生成させてメールでユーザーに送った後にwp_update_userでデータベースのパスワードを発行した乱数に書き換える。
ここまで、問題なく作ったけど、テストすると「Warning: Cannot modify header information – headers already sent by 〜」のエラー

えっ???
ヘッダーに何もスペースとかないけど???
と思ったのでグッグッてみたら海外のWordPressフォーラムに書いてあった!
「wp_update_userは、パスワードを更新した際に、クッキーをリセットしようとします。
PHPの関数setcookie()クッキークリアとクッキー・リセットは、ページのヘッダーに追加されます。したがって、get_header()の前にwp_update_user()を呼び出す必要があります。 」
みたいなことが書いてあった。

なるほど・・・・
wp_update_userの後にget_headerやらなきゃいけないのね!
ということで、無事に完成!!

WordPressチーム開発のあれこれ Part2

  
以前にWordPressをチーム開発する事でブログ書きましたが、今回はそのパート2です。

以前、仕事でWordPressの構築をチームでやってましたが、私の担当はカスタマイズしたり案件専用のプラグインを作ったりでした。

普通に構築すると流れは

デザイナーさんがデザイン作成

コーダーさんがコーディング

そして私がテーマファイル作成!

プロジェクト開始から私の仕事がスタートするまでメッチャ時間があります。コーディングが終わらないと何にも出来ないので結局、プログラム開始から納期までが短い(´×ω×`)
当然ですが、ジーッと待ってたら納期前に明けてもくれても残業になるので、開発手順を以下の手順でやってます。

①デザイナーさんがデザイン作成

②同時に私もプラグイン開発スタート

③コーダーさんがコーディング開始

④同時にテーマテンプレートのプログラムだけ組む。

⑤コーディング完了と共にテーマテンプレートにHTMLのソースを流し込む

⑥出来上がり٩(●˙▿˙●)۶…⋆ฺ

でも、今までこれでやってると不便な事があって・・・・
それは工程④の時にテーマテンプレート作るのはいいけどちゃんと出来ているのかなんなのか全くわからない。エディタにデバック機能も無いし、でもHTMLのソースが無いので何が何だか(;^_^A
なので、ある程度ソース書かきながら書いてましたが、これって時間がかかる!
スケジュールの予定工数が足りなくなって良く困ってました。

でも、最近、Bootstrapというものを噂に聞き、調べてみたら

あ〜フレームワークね?!

と理解!でも使った事が無かったので今回、ちょっと使ってみました!

ライブラリを入れたらフォント色が変わって・・・おぉー(o゚▽゚)oと喜んだのですが、
で???
全くコーディング力ゼロの私はそこで終わりました
ちゃんと本買って勉強しても、2日で吐き気がして挫折(´×ω×`)

普段、Bootstrap使っている方に
「全く出来ませんでした〜(´•ω•̥`)」
と言ってみたところ、Bootstrapとはお作法通りに使わないとダメ!らしい・・・

ちゃんと決まったidやclass名を使ってルール通りに枠組みしないとちゃんと出来上がらないみたいです。
なので、「今、出来上がっているコーディングをBootstrapに置き換える」と言うのには向いていない = WordPressの一部修正とかデザイン変更ぜずに再構築とかは使えない(´•ω•̥`)
こう言う案件も多いんだけど・・・・

とりあえずチーム開発の場合、最終的にコーダーさんが書いたソースに置き換えるから、BootstrapでもOK
なので、しばらくはBootstrapと共に頑張りたいと思います。チーム開発をなんかもっとスッキリ出来ればいいんだが・・・・

WordPressnのチーム開発について

  
先日、WordBench神戸に参加した時、「WordPressでサイトを作る時にテスト環境でお客様に見てもらって、本番にアップするが、このテスト環境と本番の同期に関して」の質問がありました。
その時にチーム開発や開発の方法と管理について私自身、それでここ数年間、四苦八苦しながら開発してきた事をもっと伝えればよかったかも?と思ったので今回まとめてみました。

私は普段、WordPress専属で開発をしているのですが、関わる案件のほとんどが規模が大きいサイトで、チーム開発になります。

当然、規模が大きいので、開発も1次開発、2次開発と多岐に渡るます。だから環境は開発用のサーバー、テストサーバー、本番サーバーと複数あり、それぞれGitで管理してます。

当然、チーム開発になるのですが、Webチームなので、デザイナーさん、コーダーさんの数が多くエンジニアは多くて2人、大概は私一人(;^_^A
なので、サーバー構築や設計、WordPress構築、サイト設計、プラグイン開発と私がやります。それはいいんですが、難しいのがバージョン管理=Gitで、WordPressをバージョン管理しようと思うと、めんどくさい事が多いil||li (っω-`。)il||li

まず、各サーバーで設定が違うのでwp_config.phpは管理対象外。当然ですね(笑)それ以外のコアファイルは全く問題なしなんです。問題は管理画面上で設定するカスタムメニューとかなんです。

なんで?データベース流し込めばいいやん!と思うんですが、1次開発と2次開発でデータベースに差分が出ると下手に流し込めない。
開発サーバーのデータベースにはこのテーブルあるけどテストサーバーはないよ!っていう事も当然あります。

じゃぁ、開発サーバーで開発したメニューはどうやってテストサーバーに持っていくの?(´・ω`・)エッ?もしかして毎回管理画面で設定作る?でもそれは事故になる可能性が高いので、却下です。
じゃぁ、WordPressにあるimporterで移行すれば!と思うかもしれませんがメニューだけをエクスポートってできないのです。
(これもこないだちょっとだけWordBench神戸で話題になってました。)

じゃぁどーすんのさっ!
そうですね、イケてないですが、わかってますが、テンプレートに直書きするしかありません。直書きすればGitで上げれるので事故は起こりませんね。

こうなると、何の為のWordPressや!となりますが、でも、事故はダメ!

結局、最終的にはデータベースには差分が出るので、データとして登録されない様に開発しないといけなくなってくる。
メニューやウィジェットも使わずに直書きしないといけない。
それってWordPressでやる意味あるのか、チーム開発でバージョン管理すべきなのか、難しいところです。

リスクを最小限に抑える為には、構築の仕方CMSの選択を良く考える必要があるかもしれませんね。

MTS Simple Bookingビジネス版をちょいとカスタマイズ!

もう1年以上前の事ですが、仕事でMTS Simple Bookingビジネス版を購入後、カスタマイズしまくった時の記事があったのであげてみました。
いっぱいカスタマイズしましたが、一部だけブログに書いてたみたいです。

ちゃんと開発者のエムティシステム様に連絡を取りカスタマイズしました。
勝手にやってないよ(笑)
エムティシステム様、ありがとうございます。
<ここから昔書いた記事>

予約品目にカテゴリー追加してみました!
ソースコードはこちら
wp-content/plugins/mts-simple-bookingにある「mtssb-article.php」の71行目?

私は54行目なんだけど・・・

そこをちょいとカスタマイズ

protected function _register_post_type() {

$labels = array(

'name' => __('Booking Articles', $this->domain),

'singular_name' => __('Booking Article', $this->domain),

'add_new' => __('New Booking Article', $this->domain),

'add_new_item' => __('Add New Booking Article', $this->domain),

'edit_item' => __('Edit Booking Article', $this->domain),

);
$args = array(

'label' => 'Articles',

'labels' => $labels,

'public' => true,

//'publicly_queryable' => false,

'rewrite' => array('slug' => 'article'),

'hierarchical' => FALSE,

'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'page-attributes'),

'taxonomies' => array('article_category', 'article_tag'),  //ここを書き換え

'register_meta_box_cb' => array($this, 'register_meta_box'),

);

register_post_type(self::POST_TYPE, $args);

それが終わったら、オリジナルテーマのfunction.phpに下記を追加

add_action( 'init', 'create_article_taxonomies');

function create_article_taxonomies() {

// カテゴリを作成

$labels = array(

'name' => '予約品目カテゴリ', //複数系のときのカテゴリ名

'singular_name' => '予約品目カテゴリ', //単数系のときのカテゴリ名

'search_items' => '予約品目カテゴリを検索',

'all_items' => '全てのWebカテゴリ',

'parent_item' => '親カテゴリ',

'parent_item_colon' => '親カテゴリ:',

'edit_item' => '予約品目カテゴリを編集',

'update_item' => '予約品目カテゴリを更新',

'add_new_item' => '新規予約品目カテゴリを追加',

'new_item_name' => '新規予約品目カテゴリ',

'menu_name' => '予約品目カテゴリ' //ダッシュボードのサイドバーメニュー名

);

$args = array(

'hierarchical' => true,

'labels' => $labels,

'rewrite' => array( 'slug' => 'article_cat' )

);

register_taxonomy( 'article_category', 'mtssb_article', $args );

}

これでカテゴリーが付けれるようになり、

<?php wp_list_categories(array('title_li'=>'', 'taxonomy'=>'article_category', 'show_count'=>1)); ?>



でカテゴリーの一覧表示が出る様になります!

時間が正確に表示されなくなってしまう
オリジナルテーマのfunction.phpに下記の記述はさけましょう。

//*****************************************

//date.timezone設定

//*****************************************

//date_default_timezone_set('Asia/Tokyo');


上記はWordPress上で「date」関数を使うと、9時間ずれて取得されるので設定する為に使用するのですが、

この関数を使用するとMTS Simple Bookingで時間が正確に表示されなくなってしまいます。

だから、コメントアウト!

<ここまで昔書いた記事です>

と、タイムゾーンは微妙(;^_^A
なんでわざわざfunctions.phpにタイムゾーン書いてたんだろう?それさえも記憶がない。

外部認証でWordPressにログイン

これをやる時にやり方を調べても全然出てきませんでした。
(-_-;)ホントカ・・・オイとなったので(o^-^)φメモ

普通はWordPressにユーザーを作成し、そのユーザでログインしますが、以前、会員サイトを構築した時に以下の仕様を作りました。

「外部のDBに会員情報を置きそのDBにAPIで接続、そして、外部で認証後、データ取得しWordPressにログイン」

まずは、仕様を詳しいく説明。

外部のAPIにログイン情報を渡してそこで認証させログイン情報があっていれば会員情報を渡してくれる間違ってたら「違うよ〜」と言われる。そして、ログイン情報が正しくて会員情報が帰ってきたら、ここでWordPressにログイン!

とまぁ、こんな感じで開発。
なのでログインにはWordPressの関数は使えない。
PHPでフツーにログイン処理

次にAPIにログイン情報を渡す処理

やっとここからWordPress側に!
ログイン処理は普通にPHPでごにょごにょ書いてあるので、それを使ってログイン!


if( isset($_POST['loginid'])){
if ($login_member->login_validation($_POST) === false) {
$message = 'ログインに失敗しました';
}elseif(Login_member::login($_POST) === false){
$message = 'ログインに失敗しました';
}else{
$url = site_url('member');
header("Location: {$url}");
exit;
}
}

とログインまで完成!と思いきや、なんか動作がおかしい(´・ ・`)?

なんかログアウトしてまたログインしようとしたらログインしてないのにすでにログイン済みになってるんですけど。
しかも、違うユーザーでログインしても前回のユーザー名が出てるし(;^_^A

キャッシュが残ってる?(ーー;)
しかも高速化考えてNginxにしてるのでめちゃくちゃキャッシュ残ります。
だからNginx側でログインしたらキャッシュ取らないように設定すればいいのです。
じゃぁWordPressコアファイルがどうしてる?と思ったので調べました。

コアファイルはログインしたらCookieにを保存してるんです。
いつもお世話になっているこの本「WordPressプラグイン開発のバイブル」を書かれたあの方のサイトにも書いてある。(あざっす!)
WordPressのCookieのナゾ
なのでこれをそっくりそのままやりました。

wordpress_logged_in_xxxx
私の場合はログインを自作しているのでこっち側だけでOK!(本当か?)

そしてNginx側で設定(※他のクッキーと一緒に設定してます)

# コメント書き込み中、ログイン中、パスワード保護コンテンツはキャッシュしない
if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
set $do_not_cache 1;
}

そして、Nginxの設定を変えたら再起動もしくは再読み込み

/etc/init.d/nginx restart
もしくは
/etc/init.d/nginx reload

これで完了!

コアファイルよく考えてある。素晴らしい!

WordCamp Kansai2015 終了しました〜。

   

今日でWordCamp Kansai2015が終了しました。

実はWordPressを触り始めてもう12年ぐらいになりますが(多分そのくらい)今年初めて実行委員として参加させていただきました。

家の事や自分の仕事と両立しての実行委員活動、分からない事が多く、話について行けなくなったりで、あまりお役に立てなかった!もっとできたら!と言う思いを持ったまま当日を迎えましたが、同じ実行委員の皆様、当日スタッフの皆様が本当にいい方ばかりで!初めてお会いする方が多かったにも関わらず、皆様とってもフレンドリーに接して下さいました。

    

スタッフとしての参加だったので、聞けなかったセッションや参加出来なかったハンズオがたくさんありましたが、スタッフだったからこそ普段ではお会い出来ない方、もっとレベルの高い仕事をされている方のお話を聞けてとっても充実した二日間でした。

  

  

そして、以前から思っていた「今まで培ってきた事で少しでも多くの方のお役に立てれば!」と言う想いも今回はハンズオンの世話役、事前準備のスタッフとして叶いました。
 

今回、「参加して楽しかった!」その一言につきます。そして、素敵な二日間でした。また、これからもどんどん活動参加していきたいと思ってます。(おばちゃんですが、頑張ります。笑)そして、せっかく仲良くなれた方々を大切にしていきたいと思っています。

本当にありがとうございました。