Quantcast
Channel: モンキーレンチ
Viewing all 235 articles
Browse latest View live

MW WP Formで個人情報をメールでは送らずにデータベースにだけ保存する方法

$
0
0

セキュリティーの観点から、お問い合わせフォームから受け付けた内容をメールでは送らずに、データベースにだけ保存したい場合があると思います。

MW WP Formでは管理画面で「問い合わせデータをデータベースに保存」にチェックしてあるときに、管理者宛メール設定メタボックスにある「本文」に入力された「{キー}」の値がデータベースに保存されます。そして、実際に送信されるメールの内容はフックで変更することができるので、次のようにすればメールでは送らずに、データベースにだけ保存するということが可能です。

管理画面 管理者宛メール設定メタボックスの本文

データベースに保存したい項目のname属性を{}で囲んで記述します。

...
{お名前}
{ご住所}
{内容}
...

functions.php

/**
 * 管理者宛メール
 * @param  Mail  $Mail  メールオブジェクト
 * @param  Array  $data  データ
 * @return  Mail  $Mail  メールオブジェクト
 */
function admin_mail( $Mail, $data ) {
	// 本文を変更
	$Mail->body = 'お問い合わせがありました。';
	return $Mail;
}
add_filter( 'mwform_admin_mail_mw-wp-form-2899', 'my_admin_mail', 10, 2 );

/**
 * 自動返信メール
 * @param  Mail  $Mail  メールオブジェクト
 * @param  Array  $data  データ
 * @return  Mail  $Mail  メールオブジェクト
 */
function auto_mail( $Mail, $data ) {
	// 本文を変更
	$Mail->body = 'お問い合わせを受け付けました。';
	return $Mail;
}
add_filter( 'mwform_auto_mail_mw-wp-form-2899', 'my_auto_mail', 10, 2 );

logwatch で PHP のログが送られてこないのでなんとかした話

$
0
0

このブログはさくらのVPS(CentOS)で運営しており、logwatch という1日1回アクセスログやエラーログなどが良い感じにまとめて送ってくれるツールを使用しています。

logwatch は各種ログのパスを指定することでそのログをまとめてくれるのですが、デフォルトでだいたいの見たいログはセットされていて、PHPのエラーログももちろん取り込むように指定がされています。しかし、何日たっても PHP のエラーログがまとめられてこない。エラーの一切ないクリーンなコード書いちゃったかなぁとか思って実際にログを見てみると普通にエラーでてる…。

調べてみると、logwatch はログの日付をパースしてその日にまとめるログを判別しているっぽい。だから日付をパースをできないとログはこないということのようです。

設定方法

logwatch の PHP のエラーログの設定ファイルを開き、日付をパースしている部分を実際のログファイルの日付の形式に合わせて編集します。

$ sudo cp /usr/share/logwatch/scripts/services/php /etc/logwatch/scripts/services/
$ sudo vi /etc/logwatch/scripts/services/php
  #my $date_format = '%d-%b-%Y %H:%M:%S';
  my $date_format = '%a %b %d %H:%M:%S %Y';

  #$1 =~ /(\d+)-(\w+)-(\d+) (\d+):(\d+):(\d+)/;
  $1 =~ /(\w+) (\w+) (\d+) (\d+):(\d+):(\d+) (\d+)/;
 
  #$time = timelocal($6, $5, $4, $1, $month2num{$2}, $3-1900);
  $time = timelocal($6, $5, $4, $3, $month2num{$2}, $7-1900);

logwatch に設定されている PHP のエラーログの日付のフォーマットに、わざわざデフォルトで動かないものが指定されているということもないと思うので、環境によってフォーマットが変わる場合があるということですかね。ちょっとそこまではわかりませんでした。。

MW WP Form Ver 1.1.3

$
0
0

MW WP Form をバージョンアップしました(Ver 1.1.3)。今回のバージョンでは以前から気になっていたメソッド名等の修正を行っています。下記は新しいメソッド名、引数名に変更していますが、まだ過去の名称でも動作しますが次回のバージョンアップで古いものは削除する予定です。普通に利用している限りではほとんど影響はないと思いますが、ゴリゴリにカスタマイズされている方は注意が必要かもしれません。

  • div.mw_wp_form_previewは次回のバージョンアップで削除予定(div.mw_wp_form_confirmに置換)
  • MW_Form::previewPage()は次回のバージョンアップで削除予定(MW_Form::confirmPage()に置換)
  • [mwform_submitButton]の引数preview_valueは次回のバージョンアップで削除予定(confirm_valueに置換)
  • [mwform_previewButton]は次回のバージョンアップで削除予定([mwform_confirmButton]に置換)
  • [mwform]の引数previewは次回のバージョンアップで削除予定(confirmに置換)
  • MW_Form::isPreview() -> MW_Form::isConfirm()
  • MW_Form::getPreviewButtonName() -> MW_Form::getConfirmButtonName()

マニュアル

ダウンロード

島原ウインターナイト・ファンタジアに行ってきた。

$
0
0

23日に島原外港で行われている島原ウインターナイト・ファンタジアに行ってきました。点灯は17:30〜22:00、1月11日まで行われているそうです。カップルの方々より子連れの家族の方が多い印象で、小さな子供がたくさん走り回っていました。

外港の駐車場が1時間まで無料となっているのでそこに車を停めてゆっくり見て回れます。

小さいオブジェがいっぱい

小さいオブジェがいっぱい

ペンギン

ペンギン

ジーオくん

ジーオくん

教会的な

教会的な

島原外港にはボートレースの場外発売場があり、ちょっと寄って情報も見ずに1レース買ったところ見事的中。ちょっとしたクリスマスプレゼントになりました。

MW WP Hacks に description の設定機能を追加しました。

$
0
0

WordPressでの開発をちょっと楽にするプラグインMW WP Hacksにdescriptionの設定機能を追加しました。カスタム投稿タイプごとにdescriptionを設定できます。

meta description設定

meta description設定

設定できるのは基本となるdescriptionとそれぞれのカスタム投稿タイプごとのdescriptionです。固定ページやシングルページでは抜粋が入力してあれば抜粋、なければ本文から抽出して使用されますが、カスタム投稿タイプのアーカイブページでは上記で入力したdescriptionが使用されます。未入力の場合は基本descriptionが使用され、それも未入力の場合は一般設定の「キャッチフレーズ」が使用されます。

mw-wp-hacks-descriptionというフックも用意してあるので、特殊なカスタマイズを行いたい場合は下記のような感じで対応できます。

function my_description( $description ) {
    if ( descriptionを変更する場合の条件 ) {
        // ここで $description を変更
    }
    return $description;
}
add_filter( 'mw-wp-hacks-description', 'my_description' );

ダウンロード

スクロールするとコンテンツがフェードインするjQueryプラグイン作った。

$
0
0

スクロールして対象要素が画面に出てきたときにいい感じでフェードインして表示させるjQueryプラグイン「jquery.scrollFade.js」を作りました。文章だとわかりにくいかと思いますので、下記のデモを参照ください。

サンプルコード

jQuery本体、jquery.easing、jquery.scrollFade.jsの3つを読み込みます。そして、フェードさせたい要素に対してscrollFadeメソッドを実行させます。下記の例では「.scrollFade」というクラスを持つ要素を対象にしています。scrollFadeメソッドは、フェードアウト前の透明度(out)、フェードにかける時間:ミリ秒(duration)を引数として設定できます。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
<script type="text/javascript" src="jquery.scrollFade.js"></script>
<script type="text/javascript">
jQuery( function( $ ) {
	$( '.scrollFade' ).scrollFade();
} );
</script>

ダウンロード

MySQLで数値の昇順の後に空値のレコードが並ぶようにする

$
0
0

WordPressで構築したサイトで「カスタムフィールドに入力された金額の昇順に並び替えたい、かつ金額が未入力の情報も表示したい」という要望がありました。通常であれば下記のように金額の昇順に並ぶようにすれば良いのですが、空値がある場合だとその情報が優先して表示されてしまいました。

function my_pre_get_posts() {
    // 条件は状況に合わせて変更してください。
    if ( $query->is_main_query() && !is_admin() ) {
        $query->set( 'order', 'ASC' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'meta_key', '並び替えに利用するカスタムフィールドのキー' );
    }
}
add_action( 'pre_get_posts', 'my_pre_get_posts' );

ORDERBY句を確認してみる

数値として並び替えているので、空値が0と判定されてしまったようです。実行されたSQLを確認してみると、ORDERBYの指定が次のようになっていました。

ORDER BY wp.meta_value+0 ASC

次のようなORDERBY句の指定にすることができれば、初めに数値の昇順のレコードが並び、その後に空値のレコードが続くようにすることができます。

ORDER BY wp.meta_value+0 > 0 DESC, wp.meta_value+0 ASC

フックを使ってORDERBY句を書き換える

WordPressの場合は実行されるクエリのORDERBY句を書き換えるフックがあるので、それを利用してORDERBY句を変更してあげれば良いです。条件などは実行されているクエリを確認して調整してみてください。クエリはDebug Barプラグインで確認できます。

// 下記の例はテーブル名が「wp_postmeta」の場合です。
function price_order( $query, $wp_query ) {
    if ( $query === 'wp_postmeta.meta_value+0 ASC' ) {
        $query = 'wp_postmeta.meta_value+0 > 0 DESC, ' . $query;
    }
    remove_filter( 'posts_orderby', 'price_order' );
    return $query;
}
function my_pre_get_posts() {
    // 条件は状況に合わせて変更してください。
    if ( $query->is_main_query() && !is_admin() ) {
        $query->set( 'order', 'ASC' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'meta_key', '並び替えに利用するカスタムフィールドのキー' );
        // ORDERBY句を変更するための処理を追加
        add_filter( 'posts_orderby', 'price_order', 10, 2 );
    }
}
add_action( 'pre_get_posts', 'my_pre_get_posts' );

我が家にたこ焼き器が来たのでたこ焼きを食べた。

$
0
0

拙作のWordPressプラグイン「MW WP Form」を使って頂いている方から、Amazonのほしいものリストに入れていた「たこ焼き器」が届きました。ありがとうございます!

早速その日の内にたこ焼きを焼いてみました。

アイリスオーヤマの2WAYプレートたこ焼き器

アイリスオーヤマの2WAYプレートたこ焼き器

たこ焼き用のプレート以外にも平らなプレートが付属しているタイプなので、お好み焼きや焼き肉も可能。夢が広がりますねー。

妻曰く「ネギと天かすを中に入れたほうがうまい」とのこと。

妻曰く「ネギと天かすを中に入れたほうがうまい」とのこと。

投入!

ジュ〜

ジュ〜

串ガイド(串を動かすための細い溝)がついているので、はみ出た生地が切り離しやすくなっています。鉄板が焦げ付かず便利です。

たこ焼き奉行

たこ焼き奉行

ひっくり返すときれいな丸型

ひっくり返すときれいな丸型

ソース、マヨネーズ、かつお節でシンプルに

ソース、マヨネーズ、かつお節でシンプルに

たこ焼き器はシンプルなものですが、外はカリッと中はトロっと、とても美味しい感じに作れました。たこ焼き器は今まで家に無く、結構面倒なのかなという印象がありましたが、実際には材料さえあれば混ぜて焼くだけ、片付けも楽ちんとかなりお手軽でした。休日のお昼にぴったりですね。


SyntaxHighlighter Evolvedにオリジナルのスタイルを追加する方法

$
0
0

このブログでは、ソースコードの表示に SyntaxHighlighter Evolved というプラグインを使用しています。このプラグインを使えば、ソースコードを簡単にきれいにスタイリングされた状態で表示することができます。デザインは複数用意されており、その中から好きなものを選んで適用できるのですが、どれもイマイチしっくりこないなぁと思っていました。

プラグインに含まれるCSSを直接触ればデザインを変更することができますが、プラグインのアップデートがあると上書きされて消えてしまいます。

syntaxhighlighter_themesフックを使う

調べてみると、SyntaxHighlighter Evolvedにはスタイルを追加するための「syntaxhighlighter_themes」というフィルターフックが用意されていました。functions.phpに下記のようなコードを追加することで、オリジナルのスタイルを追加できます。

function add_syntaxhighlighter_theme() {
    wp_register_style( 'syntaxhighlighter-theme-テーマ名(半角英数字)', 'オリジナルのcssへのパス', array( 'syntaxhighlighter-core' ) );
}
add_action( 'wp_print_styles', 'add_syntaxhighlighter_theme' );

function my_evolved_theme( $themes ) {
    $themes['テーマ名(半角英数字)'] = 'テーマの名称';
    return $themes;
}
add_filter( 'syntaxhighlighter_themes', 'my_evolved_theme' );

すると、下記のような感じで管理画面から選択できるようになります(My Evolved Themeという名前で登録しました)。

My Evolved Themeというオリジナルスタイルが追加されている

My Evolved Themeというオリジナルスタイルが追加されている

一からオリジナルのCSSを作るのは大変なので、もとから用意されているものから一番イメージに近いスタイルのCSSをコピーして書き換えるのが簡単です。デフォルトのCSSは/PATH/TO/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeXXX.cssとして保存されています。

FacebookのOGP対応はog:localeを外したほうが良いのかもしれない。

$
0
0

FacebookにはURL LinterというOGPのデバッグツールがあり、指定したURLのOGP設定に問題がないか簡単にチェックすることができます。

カノニカルURL と og:url が違うという警告が…

1年ほど前に独自にWordPress用のOGP設定プラグインを開発して使っていたのですが、昨日URL Linterで警告がでていることに気づきました。

Mismatch og:url and canonical url という警告が…

Mismatch og:url and canonical url という警告が…

「解決する必要があるオープングラフの警告」として「Mismatch og:url and canonical url」「og:url tag in the header is not the same URL as rel=’canonical’ link in the html.」という警告文が表示されていました。og:url と canonical url が違うよ、ということのようです。

上記のキャプチャの下の方を見ていただくとわかるのですが、canonical urlが「http://2inc.org/blog/2014/01/20/4022/」となっているのに対し、og:urlは「http://2inc.org/blog/2014/01/20/4022/?fb_locale=ja_JP」となっています。なんだ?fb_locale=ja_JPって!

しかし、実際のHTMLを見てもog:urlには「?fb_locale=ja_JP」は追加されておらず、canonical url と og:url には同じURLが出力されていました。

原因と解決法

OGP関連のメタタグをいろいろ変更したり削除したりして調査した結果、「og:locale」があるとこの警告がでるということがわかりました。og:localeを削除すると以下のように警告が表示されなくなりました。

og:localeを消すとエラーが消えた!

og:localeを消すとエラーが消えた!

以前は og:locale が無いと警告が表示されていたように記憶していますが、現在では og:locale が無くても警告はでないようです。むしろ og:locale があることで og:url で警告がでるようになってしまっています…。og:url の警告がでたり、og:locale を削除することでSEO的にどういう違いが出るかは詳しくありませんが、警告がでているのは気持ち悪いので、とりあえず og:locale は削除しました。

ちなみに、僕がWordPressのOGP設定に使っている自作プラグインは「MW WP Hacks」です。以前は MW OGP というプラグインを作っていましたが、MW WP Hacks に統合しました。MW WP Hacks はOGP設定以外にもいろいろな細かい設定を簡単に行うことができる統合設定ツールです。ぜひ一度お試しください!(熱い自薦)

WordBench長崎04 開催しました。

$
0
0

SDIM3866

第4回目のWordBench長崎を開催しました。事前に、今回のネタは何にしようかと話し合っていたところ、ちょうどWordCafe Fuji開催の記事を見つけました。ワールドカフェと呼ばれる方法でWordPressについて話そうという勉強会で、これはぜひ長崎でもやろうということで同様の形式をとらせていただきました。

AppWorkshop

WordBench長崎の前に、Appworkshopというもくもく勉強会が開催されていたので、そちらにも参加させていただきました。

Debianがインストールされたkoboを発見!

Debianがインストールされたkoboを発見!

各テーブルで出た主な話題を…

3人、3人、4人のテーブルに別れて、30分間いろいろな話題につて話し、計3回のシャッフルを行いました。

  • WordPressの利点は?
    • 多くのテーマ、プラグイン。なんでも一通りある
      • うまく利用すれば開発コストを抑えることができる
    • 情報が多く開発者が変わっても引き継げる、開発者にやさしい
    • PHPだから初心者でもわかりやすい
  • WordPressの導入について
    • どんなサイトにもとりあえず適用すると大変
    • クライアントから「WordPressを使って欲しい」と要望があることもある
  • 自動バージョンアップについて
    • 不具合が起こるかもしれないという不安はある
    • 自動バージョンアップはマイナーバージョンアップだけだからほとんど問題ない
  • プラグインについて
    • 多くのプラグインがあることこそWordPressの利点
    • 多くの人が使っている実績があるものは自作したものよりも信頼できる
    • 機能が過剰だったり逆にちょっと機能が足りなかったりもあるので結局自作することも多い
  • キャッシュ系プラグインについて
    • W3 Total Cacheは設定項目が豊富でCDNにも対応していてオススメ
    • サーバースペックが必要なので注意
    • 副作用があることも考えられるので、キャッシュが必要な規模でない場合は積極的に導入しないほうが良いかも
  • WordPressから別のシステムに乗り換えた
    • 機能が多すぎる
    • 何か不具合があったときにどこのファイルを見れば良いのかわかりにくい
      • コアを見る必要はないという思想なのでは?
      • もしコアにバグがあったときはフォーラム等に報告、世界中の開発者がバグをつぶす体制
    • 重い
    • OctPress、FuelPHPでの自作、Pelican
  • バージョン管理使ってる?
    • Gitを使っている
    • 一人開発が多いのでMaster一本
    • 一人開発なので使っていない
    • 学校でフォルダで管理する習慣がついてしまっていることが多いので、バージョン管理ツールで管理するというのを学生時代から根付かせたほうが良い

運営側もワールドカフェの方法をよく把握しておらずグダった面もありましたが、30分のスパンでシャッフルすることでほとんど話題につまることなく有意義な話を聞いたり話したりできたのではないかなと思いました。WordPressをあまり使ったことがない人も多く、WordPress以外の話題もいろいろと出ましたが、Web制作全般の話しができてとても良かったのではないかと思います。

SDIM3867

ソーシャルログインプラグインGianismのカスタマイズいろいろ

$
0
0

GianismはWordPressにFacebookやTwiterなどのSNSのアカウントでログインできるようにする和製プラグインです。インストールすると管理画面に設定方法が記載されているので簡単に使用することができます。案件の都合でいろいろなカスタマイズを行って使用したので、それらをまとめてみました。

ログインIDを変更する

Gianismで初めてOAuth接続するとOAuth認証したサービスのユーザー名等でWordPressアカウントが作成されます。Gianismで作成したユーザーは既存のWordPressユーザーとは区別し易くしたかったのでユーザーIDを変更するようにしてみました。WordPressの既存ユーザーがOAuth認証したときはユーザーIDを変更したくなかったので、その判定もいれています。

function additional_info( $user_id, $data, $service, $on_creation ){
	global $wpdb;

	// 既存ユーザーの場合は処理をしない(プロフィール編集画面からのOAuth接続)
	if ( is_user_logged_in() )
		return;

	switch ( $service ) {
		case 'facebook' :
		case 'twitter' :
			// ユーザー名を変更(例:facebook_12)
			$new_user_login = $service . '_' . $user_id;
			while ( username_exists( $new_user_login ) !== null ) {
				$new_user_login = $new_user_login . '_';
			}
			$wpdb->update( $wpdb->users,
				array(
					'user_login' => $new_user_login,
					'user_nicename' => $new_user_login,
				),
				array( 'ID' => $user_id ),
				array( '%s', '%s' ),
				array( '%d' )
			);
		break;
	}
}
add_action('wpg_connect', 'additional_info', 10, 4);

アバターにSNSで使用しているプロフィール画像を使用する

WordPressのアバター画像は基本的にgravatarのものが使用されますが、せっかくSNSでログインさせるのであれば、SNSで使用しているプロフィール画像が反映されたほうが良いと思ったのでそのように変更してみました(FacebookとTwitterでのログインを実装したので、画像反映もこの2つのみの検証です)。TwitterはAPIの使用制限があったので、一定時間キャッシュすることでAPIへのアクセス数を減らすようにしています。

/**
 * get_social_avatar
 * ソーシャルログインユーザー用アバター画像
 * @param string $img イメージタグ
 * @param string $id_or_email ユーザーIDもしくはEメールアドレス
 * @param numeric $size 画像サイズ
 * @param string $default デフォルト画像URL
 * @param string $atl alt
 * @return string イメージタグ
 */
function get_social_avatar( $img, $id_or_email, $size, $default, $alt ) {
	$_wpg_facebook_id = get_the_author_meta( '_wpg_facebook_id', $id_or_email );
	$_wpg_twitter_screen_name = get_the_author_meta( '_wpg_twitter_screen_name', $id_or_email );
	// Facebookのとき
	if ( $_wpg_facebook_id ) {
		$img = '<img src="https://graph.facebook.com/' . esc_attr( $_wpg_facebook_id ) . '/picture?type=square" alt="<?php echo esc_attr( $alt ); ?>" width="<?php echo esc_attr( $size ); ?>" height="<?php echo esc_attr( $size ); ?>" class="avatar photo" />';
	}
	// Twitterのとき(API 1.1)
	elseif ( $_wpg_twitter_screen_name ) {
		if ( false === ( $profile_image_url = get_transient( 'twitter_avatar_' . $_wpg_twitter_screen_name ) ) ) {
			$wp_gianism_option = get_option( 'wp_gianism_option' );
			$Twitter_Controller = new Twitter_Controller( array(
				"tw_screen_name" => $id_or_email,
				"tw_consumer_key" => $wp_gianism_option['tw_consumer_key'],
				"tw_consumer_secret" => $wp_gianism_option['tw_consumer_secret'],
				"tw_access_token" => $wp_gianism_option['tw_access_token'],
				"tw_access_token_secret" => $wp_gianism_option['tw_access_token_secret'],
			) );
			$t = $Twitter_Controller->request( 'users/show', array(
				'screen_name' => $_wpg_twitter_screen_name
			) );
			$profile_image_url = $t->profile_image_url;
			// 1時間キャッシュ
			set_transient( 'twitter_avatar_' . $_wpg_twitter_screen_name, $profile_image_url, 60 * 60 * 1 );
		}
		if ( $profile_image_url ) {
			$img = '<img src="' . esc_url( $profile_image_url ) . '" alt="<?php echo esc_attr( $alt ); ?>" width="<?php echo esc_attr( $size ); ?>" height="<?php echo esc_attr( $size ); ?>" class="avatar photo" />';
		}
	}
	return $img;
}
add_filter( 'get_avatar', 'get_social_avatar', 10, 5 );

プロフィール編集ページにOAuth接続のボタンを表示しない

Gianismをインストールすると、管理画面のプロフィール編集画面にOAuth接続ボタンが表示されるようになります。既存のWordPressユーザーの場合とOAuth接続のユーザーは別物として扱いたかったので、既存のWordPressユーザーがOAuth接続できないようにプロフィール編集画面にOAuth接続ボタンが表示されないようにしてみました。

function gianism_user_profile() {
	remove_all_actions( 'gianism_user_profile', 1 );
}
add_action( 'gianism_user_profile', 'gianism_user_profile', 1 );

ソーシャルログインユーザーにはWordPressの管理画面を見せないようにする

SNSでログインしたユーザーには独自の管理画面だけを見せるようにしたかったので、WordPressの管理画面を見れないようにしました。SNSでログインしたユーザーかどうか判別するために、OAuth接続時にオリジナルのユーザーロールを適用するようにしました。オリジナルのユーザーロールは事前にUser Roll Editorなどで作成します(ここでは「social」というユーザーロールを作成した場合の例をあげています)。

// 注意::ログインIDを変更する のコードに追記してください。
function additional_info( $user_id, $data, $service, $on_creation ){
	//
	// 〜省略〜
	//
	switch ( $service ) {
		case 'facebook' :
		case 'twitter' :
			//
			// 〜省略〜
			//

			// 権限グループを「social」に
			$user = get_userdata( $user_id );
			$user->set_role( 'social' );
			break;
		break;
	}
}
add_action('wpg_connect', 'additional_info', 10, 4);

// ソーシャルログインユーザーの場合は管理画面を見せない
function social_no_dasheboad() {
	if ( is_admin() && is_login_social() ) {
		wp_redirect( home_url() );
		exit;
	}
}
add_action( 'admin_menu', 'social_no_dasheboad' );

// ソーシャルログインユーザーは管理バーを表示しない
function social_admin_bar( $return ) {
	if ( is_login_social() ) {
		return false;
	}
	return $return;
}
add_action( 'show_admin_bar', 'social_admin_bar' );

// ソーシャルログインユーザーログイン後のリダイレクト
function gianism_redirect_to( $url ) {
	return home_url();
}
add_filter( 'gianism_redirect_to', 'gianism_redirect_to' );

// ログアウト後のリダイレクト
function my_wp_logout() {
	wp_redirect( home_url() );
	exit;
}
add_action( 'wp_logout', 'my_wp_logout' );

/**
 * is_login_social
 * ソーシャルユーザーでログイン中か
 * @return bool
 */
function is_login_social() {
	$user = wp_get_current_user();
	if ( is_user_logged_in() && in_array( 'social', $user->roles ) ) {
		return true;
	}
	return false;
}

ネット印刷サービス Super Print で個人名刺つくった。

$
0
0

これまではプレイベートで参加した勉強会やセミナーで名刺を交換するときも会社の名刺を使っていたのですが、最近勉強会やセミナーに参加することが多くなってきて、TwitterやFacebookなどの連絡先が載っている名刺が欲しくなってきていたので、個人名刺を作ってみました。

ネット印刷サービス Super Print

今回はネット印刷サービスを行っているSuper Printさんで印刷をしてもらいました。サイト上から入稿用データのAIテンプレートがダウンロードできるようになっているので、それを編集して入稿するだけです。名刺を作るのは初めてで入稿や印刷に対する知識もほとんどありませんでしたが、結構簡単に作ることができました。

僕の入稿したデータと指定した紙質の組み合わせに一部問題があったのですが、サポートの方から丁寧なメールをいただいてすぐに対処できました。細かい注意事項はデータ入稿ガイドにまとめてあるので、よく読んでからデータを作成することをオススメします。

で、肝心の名刺

名刺は入稿してから約10日ほどで届きました。急ぎの場合は注意したほうが良いかもしれません。

こんな感じで届きます。

こんな感じで届きます。

箱に入っていました。

箱に入っていました。

紙質は普通だとつまらないと思ったので「スケッチブック」にしました。適度な厚みもあって質感も良い感じです。僕のデータの作り方が悪くて青いほうの面は少し左にずれてしまいました…。

スケッチブック

スケッチブック

最低100枚〜だったので100枚注文することになり、正直これいつなくなるんだ…という気もしますが、今年はこれを早くさばいてしまうことを目標にいろんなところに参加したいなと思います(ズレが気になるので早くさばいて修正版を作りたい…)。

アクセシビリティの向上に。文字サイズ変更と色反転ができるjQueryプラグイン作った。

$
0
0

学校のサイトや病院のサイトなど、普通よりもアクセシビリティの対応を考える必要があるサイトがあります。サイト構造をアクセシブルにするのはもちろんですが、文字サイズの変更や色反転があると障がいのある方でももっと使いやすいサイトにすることができます。

そこで、文字サイズ変更と色反転ができるjQueryプラグインを作ったので公開します。

ダウンロード

ソースはGitHubにて公開しています。

デモ

jquery.accessibleの基本的な使い方

jQuery、jquery.cookie、jquery.accessible.jsの3つのjsファイルと、jquery.accessible.cssを読み込みます。そして、どの要素をクリックしたときに反転させるかなどの設定を記述します。

※フォントサイズ変更を正しく動作させるには、各要素のフォントサイズを相対指定(%)で指定しておく必要があります。絶対指定(px)の場合は正しく動作しませんのでご注意ください。

JavaScript

jQuery( function( $ ) {
	// #fontsize内の #fontsize-normal、#fontsize-enlarge をクリックで文字サイズ変更
	// ボタンのID名 #fontsize-normal、#fontsize-enlarge は引数で変更できます。
	$( '#fontsize' ).accessible_fontsize();

	// #inverse-btn をクリックで色反転
	// どの要素を反転させるかは引数で変更できます。(デフォルトでは全ての要素 = * )
	$( '#inverse-btn' ).accessible_inverse();
} );

HTML

ボタンには accessible-button というクラスを付与しています。つけるとボタンっぽくなるようにしています。その他に装飾はありませんので、適当にスタイルをあててください。

<div id="fontsize">
	文字サイズ:
	<span id="fontsize-normal">標準</span>
	<span id="fontsize-enlarge">拡大</span>
</div>
<div id="inverse">
	色反転:
	<span id="inverse-btn">黒反転</span>
	<span id="inverse-btn-red">赤反転</span>
	<span id="inverse-btn-blue">青反転</span>
</div>

文字サイズ変更(accessible_fontsize)

次のような引数をあたえることで設定変更が可能です。

$( '#fontsize' ).accessible_fontsize( {
	// 標準文字サイズ
	base_font_size: 13,
	// 標準ボタンのID名
	normal_btn_id : '#fontsize-normal',
	// 拡大ボタンのID名
	enlarge_btn_id: '#fontsize-enlarge'
} );

色反転(accessible_inverse)

次のような引数をあたえることで設定変更が可能です。

$( '#inverse-btn' ).accessible_inverse( {
	// 反転を判別するclass名。初期値は default です。実際には inverse-default というクラスが付与されます。
	inverse_class: 'default',
	// 反転する対象 ( eg: div, a, #contents )
	target : '*'
} );

黒反転以外の色反転ボタンも追加する

色反転ボタンはデフォルトでは黒反転となりますが、下記のようなコードを追加することで別の色の反転も追加できます。下記は赤反転を追加する例です。

JavaScript

$( '#inverse-btn-red' ).accessible_inverse( {
	// ここで red と指定した場合、CSSのほうで .inverse-red のスタイルを定義してください。
	inverse_class: 'red'
} );

HTML

<span id="inverse-btn-red">赤反転</span>

CSS

.inverse-red {
	background-color: #f00 !important;
	color: #fff !important;
}

公式ディレクトリに登録していないテーマやプラグインでもバージョンアップ通知をだしたい!

$
0
0

僕の公開しているのWordPressお問い合わせフォームプラグイン「MW WP Form」には拡張プラグインがあって、有料で販売しています(ちなみに、インストールすると、初期設定が入力された状態でフォーム作成画面を開くことができます。さらにレスポンシブなフォームデザインも組み込まれています)。

WordPressの公式プラグインディレクトリに登録しているプラグインの場合は、バージョンアップがあるとお使いのWordPressの管理画面にバージョンアップ通知が出て、ワンクリックでバージョンアップできるのですが、この拡張プラグインは公式ディレクトリに登録していないため、バージョンアップ通知をだすことができません。

なんとかできないかなーと調べていると、なんとGitHubでずばりなライブラリを公開されている方が!

そのままでも良いのですが、長らくバージョンアップされていないようでしたので、フォークさせていただき、クラス化して使いやすいようにしてみました。

ダウンロード

使い方

APIの設定

プラグインやテーマのバージョンアップ通知を出させるには、まずWordPressがバージョンアップ版があるかどうかを調べられるようにしないといけません。GitHubからファイルをダウンロードしたら、まず /api/package.php を編集します。このファイルは最新のテーマやプラグインのバージョン情報を記載しているファイルです。詳細はファイルのコメントをみていただくとして、必ず設定が必要な箇所について説明します。

テーマの場合

下記は、http://your-api-server/api/ に api を設置する例です。最新版のファイルは /api/update/最新版のファイル名.zip(例では theme.zip) として保存してください。

// /api/package.php

// your-theme-slug の部分を配布するテーマのスラッグにあわせて変更
$packages['your-theme-slug'] = array(
    /* 〜 省略 〜 */
    // 2.0 の部分を最新版のバージョンに変更
    '2.0' => array(
        /* 〜 省略 〜 */
        // version も最新版のバージョンに変更
        'version' => '2.0',

        /* 〜 省略 〜 */
        // api を設置するURLに合わせて変更
        // theme.zip の部分は最新版のファイル名に合わせて変更
        'package' => 'http://your-api-server/api/download.php?key=' . md5( 'theme.zip' . mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) ) ),

        /* 〜 省略 〜 */
        // file_name も最新版のファイル名に合わせて変更
        'file_name' => 'theme.zip',

プラグインの場合

下記は、http://your-api-server/api/ に api を設置する例です。最新版のファイルは /api/update/最新版のファイル名.zip(例では plugin.zip) として保存してください。

// /api/package.php

// your-plugin-slug の部分を配布するテーマのスラッグにあわせて変更
$packages['your-plugin-slug'] = array(
    /* 〜 省略 〜 */
    // 1.0 の部分を最新版のバージョンに変更
    '1.0' => array(
        /* 〜 省略 〜 */
        // version も最新版のバージョンに変更
        'version' => '1.0',

        /* 〜 省略 〜 */
        // api を設置するURLに合わせて変更
        // plugin.zip の部分は最新版のファイル名に合わせて変更
        'package' => 'http://your-api-server/api/download.php?key=' . md5( 'plugin.zip' . mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) ) ),

        /* 〜 省略 〜 */
        // file_name も最新版のファイル名に合わせて変更
        'file_name' => 'plugin.zip',

APIを設置

/api/package.php の編集が完了したら、package.php に記述した URL に合わせてファイルをアップロードしてください。バージョンアップ版を作成した場合は都度この package.php を更新することになります。

テーマにバージョンアップ通知機能を組み込む

バージョンアップ通知機能をつけたいテーマのディレクトリに theme-update.php を入れ、テーマから読み込ませます。functions.php あたりに下記のコードを追加してください。

// functions.php

require_once( './theme-update.php' );
// 引数に api の URL を指定
$ATPU_Theme = new ATPU_Theme( 'http://example.jp/api/' );

バージョンアップ版の確認は、通常、毎回行われるわけではないようなので、テストする場合は下記のコードを追加してみてください。

@set_site_transient( 'update_themes', null );

プラグインにバージョンアップ通知機能を組み込む

バージョンアップ通知機能をつけたいプラグインのディレクトリに plugin-update.php を入れ、プラグインから読み込ませます。

require_once( './plugin-update.php' );
// 引数に api の URL と、スラッグを指定
$ATPU_Plugin = new ATPU_Plugin( 'http://example.jp/api/', 'your-plugin-slug' );

プラグインの場合もバージョンアップ版の確認は毎回行われるわけではないようなので、テストする場合は下記のコードを追加してみてください。

@set_site_transient( 'update_plugins', null );

// plugin-update.php の下記の2行もコメントアウト
//if ( empty( $checked_data->checked ) )
    //return $checked_data; 

注意点

一点、公式ディレクトリに登録しているものとの違いがあり、テーマの場合もプラグインの場合もそれ自体にバージョンアップ版があるか調べるライブラリを組み込むため、有効化している場合にしかバージョンアップが通知されません。。ただ、納品物の場合は有効化しているのが前提だと思いますので、バージョンアップを行っていくようなものの場合はとても重宝すると思います!


Grunt + Sass + Compassでつくるナウいフロントエンド開発環境

$
0
0

Grunt、Vagrantなどの制作作業を効率化するツールがいろいろとでてきていますね。存在はしっていたものの、今の環境で著しく不便を感じているわけでは無いし、面倒だし…と手を出さずにいたのですが、OS Xでの環境構築について手順をまとめてくださっている記事があったので、通してやってみました。

上記の記事を見て一通り設定はできたのですが、GruntやCompassの設定に戸惑ってしまいました。設定作業中もいくつかエラーが出たりしたので、そのあたりも考慮して僕の行った環境構築の手順についてまとめてみました。僕のようにまだこのあたりのツールに興味はあるけど手を出していないという方は参考にしてみてください。

もろもろをインストールする

Xcode

まず、AppStoreからXcodeをインストールします。コマンドラインツールも必要なので、下記のコマンドでインストールします。

xcode-select --install

homebrew

homebrewはOS X用のパッケージ管理ツールです。僕は気づいたときには入っていましたが、入っていない場合もあるかもしれないので、下記で確認・インストールします。

# 確認
$ brew -v

# 入ってなかったらインストール
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"

# 最新のバージョンに更新
$ brew updage
$ brew upgrade
$ brew cleanup

# エラーがないか確認
$ brew doctor

僕はここで大量のWarningが…。全て解消させないとhomebrewを正しくインストールできませんので、1つずつ確認して修正していきます。僕の環境ででた主なエラーと解決方法をまとめておきます。

# なんかいっぱいエラーでるので直す

Warning: パス isn't writable.
# 書き込み権限を付与する
$ sudo chown -R ユーザー名 パス

Warning: gettext was detected in your PREFIX.
# gettextがhomebrew以外でインストール済み。とりあえずbrewの管理から外す
$ brew unlink gettext

Warning: Unbrewed dylibs were found in パス
# Unexpected files: として不要なファイルが羅列されるので全て削除する
rm -rf ファイル名
Warning: Broken symlinks were found. Remove them with `brew prune`:
# 壊れたシンボリックリンクがある。下記コマンドで解消させる
$ brew prune

brew doctor でエラーが出なくなればOKです。

Node.js

Node.jsも僕の環境では既に入っていましたが、入っていない場合もあるかもしれないので、下記で確認・インストールします。

# 確認
$ node -v

# なければインストール
$ brew install node

Grunt

下記のコマンドでGruntをインストールします。

$ npm install -g grunt-cli

Sass、Compass

Sass、Compassはruby gemというRubyのパッケージ管理システムで管理するので、まずはruby gemをインストールします。例によって僕の環境には既に入っていましたが、確認して入っていなかったらインストールしてください。

# 確認
$ ruby -v

# なかったらインストール
$ sudo gem install rubygems-update
$ sudo update_rubygems

# Sassインストール
$ sudo gem install sass
$ sass -v

# Compassインストール
$ sudo gem install compass
$ compass -v

上記でうまくいくはずなのですが、僕の場合は既に入れていたSassと新しく入れようとしたCompassのバージョンの相性が悪くエラーが出てしまいました。その場合は一旦両方削除してインストールし直すと良いようです。

# エラーが出た
/Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:135:in `require': cannot load such file -- sass/script/node (LoadError)

# 両方共削除して再度インストール
$ sudo gem uninstall sass compass
$ sudo gem install sass compass

wp-cli

wp-cliはコマンドでWordPressの操作をすることができるツールです。Gruntの実行には関係ありませんが、WordPressの開発に便利なので一緒にいれておきます。

$ curl https://raw.github.com/wp-cli/wp-cli.github.com/master/installer.sh | bash

# .bash_profileにパスを通してくださいと出るので、出たメッセージ通りに貼り付け
$ vi .bash_profile

# WP-CLI directory
export PATH="/Users/inc/.wp-cli/bin:$PATH"
export WP_CLI_PHP=/Applications/MAMP/bin/php/php5.3.14/bin/php

Vagrant + VCCW

Vagrantは単一のファイルを用意するだけで、コマンドから仮想環境を簡単に立ち上げることができるようになるツールです。様々な環境のVagrantファイルが公開されており、WordPress用にもVCCW(vagrant-chef-centos-wordpress)というVagrantファイルが公開されています。

僕の普段の開発環境はMAMPですが、ちょっとしたテストにはVagrant + VCCWを使っています。詳細な説明は公式サイトを見て頂くとして、基本的なインストール方法を紹介しておきます。

VirtualBox、Vagrantのインストール

下記からインストーラーをダウンロードしてインストールします。

Vagrantプラグイン、VCCWのインストール

VirtualBoxとVagrantのインストールができたら、VCCWと、必要なVagrantプラグインをインストールします。

# Vagrant確認
$ vagrant ―version

# Vagrantプラグインインストール
$ vagrant plugin install vagrant-hostsupdater

# VCCWをGitHubからclone(例として vagrant-wpディレクトリに保存)
$ git clone https://github.com/miya0001/vagrant-chef-centos-wordpress.git vagrant-wp

VCCWをダウンロードしたvagrant-wpディレクトリに移動し、設定ファイルを設定して立ち上げます。

$ cd vagrant-wp

# 設定ファイルをコピー。書き換えることでいろいろ設定できます。
$ cp Vagrantfile.sample Vagrantfile
$ vi Vagrantfile

# 起動!
$ vagrant up

# 終了!
$ vagrant halt

バージョンアップ用シェルスクリプト

これまでのステップでインストールした各ツールのバージョンアップを楽にするために、バージョンアップ用のシェルスクリプトを作成します。これでコマンド一発で全てのツールをバージョンアップできるようになります。

$ vi update_brew.sh
#! /bin/bash
 
# Homebrew
echo -e "\n####### Homebrew Update #######\n"
brew update
brew upgrade
echo -e "\n####### Homebrew Clean Up #######\n"
brew cleanup
echo -e "\n####### Homebrew Check #######\n"
brew -v list
brew doctor
 
# WP-CLI
echo -e "\n####### WP-CLI Update #######\n"
cd ~/.wp-cli
php composer.phar self-update
php composer.phar require 'wp-cli/wp-cli=@stable'
cd ~
 
# Ruby
echo -e "\n####### Ruby #######\n"
ruby -v
 
# RubyGem
echo -e "\n####### RubyGem #######\n"
sudo update_rubygems
sudo gem update
echo -e "\n####### gem clean #######\n"
sudo gem clean
echo -e "\n####### gem list #######\n"
gem list
 
# npm
echo -e "\n####### node.js npm Update #######\n"
sudo npm update -g grunt grunt-cli grunt-init
echo -e "\n####### node.js version #######"
node -v
echo -e "\n####### grunt-init version #######"
grunt-init --version
echo -e "\n####### grunt version #######"
grunt --version
 
# Vagrant plugin
echo -e "\n####### Vagrant plugin Update #######\n"
vagrant plugin update vagrant-hostsupdater
vagrant plugin update vagrant-global-status
echo -e "\n####### Vagrant plugin List #######\n"
vagrant plugin list

$ chmod 700 update_brew.sh

# 実行
./update_brew.sh

Gruntの実行

Gruntを適用するには、まず、必要なGruntプラグインをインストールしたり設定ファイルを作成したりする必要があります。これらの作業はコマンドで自動的に行わせることができるようになっています。1つずつコマンドを実行しても良いのですが、Gruntは各プロジェクトごとに設定ファイルが必要であるため、シェルスクリプト化して使い回せるようにしておくと便利です。ここでは例としてSass・Compassの自動コンパイルが行えるようにしてみます。

# Compassの設定ファイルを用意(とりあえずの例です。詳細は調べてみてください。)
$ vi config.rb
# プロジェクトルート
http_path = "/"

# CSSファイル出力ディレクトリ
css_dir = "css"

# Sassディレクトリ
sass_dir = "scss"

# 画像ディレクトリ
images_dir = "images"

# jsディレクトリ
javascripts_dir = "js"

# 出力するCSSのスタイル(:compressed = 圧縮版の出力)
output_style = :compressed

# Grunt環境作成用のシェルスクリプトを作成
$ vi gruntinit.sh
npm init
npm install --save-dev grunt grunt-contrib-compass grunt-contrib-watch

$ chmod 700 gruntinit.sh

# Gruntfile.js(設定ファイル)を作成
$ vi Gruntfile.js
module.exports = function(grunt) {
	// load task
	grunt.loadNpmTasks('grunt-contrib-compass');
	grunt.loadNpmTasks('grunt-contrib-watch');

	// Project configuration.
	grunt.initConfig({
		// compassの設定
		compass: {
			dist: {
				options: {
					config: 'config.rb'
				}
			}
		},
		// 監視内容
		watch: {
			scss: {
				files: ['scss/*.scss'],
				tasks: ['compass']
			}
		}
	});

	// Default task
	grunt.registerTask('default', ['watch']);
};

# Gruntプロジェクトの構築を実行。いろいろ聞いてくるので適当なものを入力。
$ ./gruntinit.sh

# Grunt実行(ファイル監視)
grunt

成功すると「Running “watch” task」的なメッセージが表示されるはずです。表示されていない場合は、何らかのエラーの可能性がありますのでメッセージを確認して修正してみてください。

参考

大名古屋に行ってきた!

$
0
0

2月28日

3月1日に静岡浜松に義兄の結婚式に出席してきました。浜松には前日入り。ホテルにチェックインしたのが夕方前くらいだったので、日本三大砂丘の一つ、中田島砂丘に行ってみることに。

中田島砂丘は浜松駅からバスで15分ほど。バスターミナル裏には浜松市のゆるキャラの姿が。

浜松市のゆるキャラ、出世大名家康くん。

浜松市のゆるキャラ、出世大名家康くん。

中田島砂丘は東西約4kmに渡って広がる砂丘。夏にはウミガメが産卵にやってくるそうです。砂丘を見たのは初めてだったので、すごく広いと感じたのですが、毎年少しずつ後退してしまっているそうです(Wikipediaによると、なんと毎年平均5mほど後退し続けているそう)。

中田島砂丘。広い!

中田島砂丘。広い!

防風林。海風の影響か、すごくのけぞってる。

防風林。海風の影響か、すごくのけぞってる。

ところどころに埋まっている竹垣は堆砂垣とよばれるもので、砂が飛ばされて痩せるのを防いでいるそう。

ところどころに埋まっている竹垣は堆砂垣とよばれるもので、砂が飛ばされて痩せるのを防いでいるそう。

砂丘を進みゆるやかな丘を登ると目の前には海。

砂丘を進みゆるやかな丘を登ると目の前には海。

手前で急に深くなっているらしく、かなり波が高かい。

手前で急に深くなっているらしく、かなり波が高かい。

この日はあいにくの曇り空。晴れていれば夕焼けがきれいそう。

この日はあいにくの曇り空。晴れていれば夕焼けがきれいそう。

3月2日

先に長崎に帰る義父母と義叔母を名古屋駅まで送り、僕と妻は名古屋観光へ。名古屋についた時点で3時を回っていたので、宿泊先のホテルまでゆっくり歩いていくことに。

名古屋駅を出ると目の前にはいくつもの大きなビル。とにかく街がデカい!名古屋についてすぐに長崎とのスケールの違いを実感。

名古屋駅を出ると目の前にはいくつもの大きなビル。とにかく街がデカい!名古屋についてすぐに長崎とのスケールの違いを実感。

名古屋駅から歩いて30分ほどで名古屋城へ。時間があまりなかったので、入口付近から大天守を撮って移動。

名古屋城大天守

名古屋城大天守

名古屋城入り口付近にある加藤清正像

名古屋城入り口付近にある加藤清正像

このあたりで気づいたのですが、路上駐車が多い!道も4車線とかでとにかく広いので、路上駐車しやすいというのも原因なのかな?結構駐禁の紙が挟めてありましたが…。

名古屋城から歩いて10分ほどのところにある愛知県庁本庁舎。そのすぐ隣には名古屋市役所。派手!このあたりには行政機関がいくつも集まっていました。ここでも規模の違いを実感。

愛知県庁本庁舎

愛知県庁本庁舎

名古屋市役所

名古屋市役所

久屋大通公園を抜ける。ここを抜ければホテルはすぐ。久屋大通公園は約2kmにわたる都市公園。名古屋市と姉妹都市関係を結んでいる各都市のモニュメントが置かれています。

久屋大通公園のモニュメント

久屋大通公園のモニュメント

公園途中の橋から撮影した大名古屋。

公園途中の橋から撮影した大名古屋。

公園の中心部エリア、セントラルパークで地下への入り口を発見。地下には地下街が広がっていました。ぐるっと1周したあと、「コメダ珈琲」で休憩。妻は旅行前から食べたいと言っていた「シロノワール」というコメダ珈琲の看板メニューを注文。

妻。

妻。

夕食は「世界の山ちゃん」で食べることにしていたので、混む前に行こうということになり、ホテルに行く前に夕食へ。世界の山ちゃんは手羽先が有名な居酒屋チェーン。手羽先は辛味が強い感じでしたが、アルコールにはぴったりでした。

ホテルに荷物をおき、荷物をおいて一息入れた後、夜景を見ようともう一度外出。ホテルからすぐのオアシス21という商業施設へ。地下はショッピングモールになっていて、地上は公園になっているようでした。

よくわからない大きな建造物が光っている。

よくわからない大きな建造物が光っている。

しばらくすると色が変わる。

しばらくすると色が変わる。

本当はそこからすぐのテレビ塔から夜景を見る予定だったのだけど、行く時間が遅すぎて閉店してしまっていました。諦めて帰ろうとしていると、TSUTAYAに観覧車が隣接しているのを発見!乗車してみました。

社内では謎のアイドルグループの音楽とおみくじのサービスが。

社内では設置モニターから謎のアイドルグループの音楽とおみくじのサービスが。

夜は以外に人も車も少ない。場所によるのかな?

夜は以外に人も車も少ない。場所によるのかな?

3月3日

今回の名古屋旅行はグルメ旅にしようと計画をしていたので、2日目は飲食店を中心にまわりました。

まず向かったのは洋菓子喫茶ボンボン。名古屋の喫茶店では「モーニングサービス」としてトーストやゆでたまごがサービスされるという情報を妻が仕入れていたので、せっかくならと昭和24年創業の老舗喫茶店である洋菓子喫茶ボンボンに行ってみました。朝一番で行ったのですが、店内はいつも来られていると思われる中高年の方々で賑わっていました。

なんと自社ビル!

なんと自社ビル!

モーニングサービスのトーストとゆでたまご

モーニングサービスのトーストとゆでたまご

朝からケーキ。美味!

朝からケーキ。美味!

次に向かったのは名古屋名物ひつまぶしのお店、しら河。ひつまぶしを食べるのは初めてでしたが、外はカリッと、中はふわっとした食感でとても美味しかったです。1杯目は普通に、2杯目は薬味を添えて、3杯目はお茶漬けにという真っ当な食べ方で堪能しました。

お腹を空かすため、ウインドウショッピングでもしようと近くの松坂屋へ。そしたらなんと、「ポケモンセンター」なるものがあるのを発見!店内を埋め尽くすポケモングッズの数々に、それほどポケモンに興味が無い妻もテンションが上がり、2人でわいわい楽しめました。ブラック・ホワイトまでしか知らなかったけど、続編とか、新作もでてるんですね、対戦シーンもえらいことになってますねー。

次の店に行こうかとしていると、屋上に遊園地があるではないですか!長崎浜屋の屋上にも遊園地があり、なかなかに楽しめたので松坂屋の屋上遊園地にも行ってみました。長崎浜屋はなかなかの寂れ具合だったのですが、大名古屋ともなればどうだろうとドキドキしながら行ってみると、こちらもなかなかの寂れ具合…。でも時代から取り残されて時間が止まっているこの感じが良いんですよね。

やはりメインは乗り物

やはりメインは乗り物

妻はばいきんまん、僕はバイクに搭乗。楽しい!

妻はばいきんまん、僕はバイクに搭乗。楽しい!

ここから大須商店街へ移動。さすが大名古屋、この商店街も広い広い。僕はショッピングがあまり好きではないのですが、いろいろなものがたくさん売っていて、こういうところなら週末にふらっと出かけても楽しいかもなーと思ったり。。

商店街内にあるお寺、万松寺

商店街内にあるお寺、万松寺

こちらも商店街内にあるお寺、大須観音

こちらも商店街内にあるお寺、大須観音

お昼をまわり、小腹がすいてきたので次なる名古屋名物のお店へ。向かったのは「みそかつ」のお店、矢場とん。チェーン展開されているお店ですが、創業60年にもなる老舗だそう。みそかつも初めてでしたが、思っていた以上に食べやすく、結構ボリューミーでしたがペロリと完食。福岡にも店舗があるようなので、近くに行ったときはまた食べたいなーと。残念ながら写真は撮り忘れ。。

本当はこのあと名古屋駅のホームで食べられるという「きしめん」も食べたかったのですが、飛行機までの時間がなかなかシビアだったので断念。。いつも旅行は歴史的な観光スポットなどをゆっくりと見て回ることが多いのですが、グルメ旅もなかなか満足度が高くて良かったです。またどこかでやりたいなぁ。

Facebook的なスマホナビゲーションを実現できるレスポンシブなjQueryプラグイン作った。

$
0
0

レスポンシブなサイトの場合、グローバルナビゲーションの表示をどうするか悩む方は多いと思います。そんな方に便利なjQueryプラグインを作成しましたので公開します。jquery.responsive-nav は、グローバルナビゲーションをレスポンシブにし、スマートフォンの場合はFacebookのような横からニュッとスライドしてくるナビゲーション(オフキャンバスナビ)に変化させるjQueryプラグインです。

ダウンロード

ソースはGitHubにて公開しています。

デモ

jquery.responsive-nav の基本的な使い方

jQuery、jquery.responsive-nav.js の3つのjsファイルと、jquery.responsive-nav.css を読み込みます。そして任意の要素に対して responsive_nav() を実行します。

JavaScript

jQuery( function( $ ) {
	// 例として #global-nav に対して responsive_nav() を実行します。
	$( '#global-nav' ).responsive_nav();
} );

HTML

<div id=”responsive-btn”></div> は任意の場所に設置できます。PC用のナビゲーションを表示するかスマートフォン用のナビゲーションを表示するかは、<div id=”responsive-btn”></div> が display: block か displya: none かで判断されます。display: block だとスマートフォン用ナビゲーションを表示、display: none だとPC用のナビゲーションを表示します。デフォルトは display: none となるので、メディアクエリーで一定の幅より狭くなったときに display: block にするように設定します。

ナビゲーション自体は、ul・li の入れ子でマークアップする必要があります。その外側は特に指定はありませんが、responsive_nave() を実行するための要素で囲む必要があります。

<div id="responsive-btn"></div>

<div id="global-nav">
	<ul>
		<li><a href="">ホーム</a></li>
		<li>
			<a href="">会社案内</a>
			<ul>
				<li><a href="">組織図</a></li>
				<li>
					<a href="">部署案内</a>
					<ul>
						<li><a href="">営業部</a></li>
						<li><a href="">経理部</a></li>
						<li><a href="">システム開発部</a></li>
						<li><a href="">サポート</a></li>
					</ul>
				</li>
			</ul>
		</li>
		<li><a href="">よくあるご質問</a></li>
		<li><a href="">お問い合わせ</a></li>
	</ul>
<!-- end #global-nav" --></div>

CSS

スマートフォン用のCSSはガチガチにあたっていますが、PC用のナビゲーションはデザインに自由度をもたすため、最低限のスタイルのみあてています。上記のデモではPC用のナビゲーションのデザインを行うために、下記のスタイルを追加であてています。また、メディアクエリーで幅が939px以下になったときにスマートフォン用のナビゲーションに変化するように設定しています。

#global-nav {
	background-color: #3886FC;
}
#global-nav ul li a {
	color: #fff;
	background-color: #3886FC;
	font-size: 12px;
	padding: 5px 20px;
	text-decoration: none;
}
#global-nav ul li a:hover {
	background-color: #5093F8;
}
#global-nav ul li ul {
	display: none;
}
@media screen and ( max-width: 939px ) {
	#responsive-btn {
		display: block;
		position: absolute;
		right: 20px;
		top: 10px;
	}
}

WordPress標準のカテゴリーウィジェットを拡張してカスタムタクソノミーも選択できるようにする

$
0
0

WordPressで企業サイトの制作を行っていると、通常の「ブログ」だけではなく「新着情報」や「商品」など独自の投稿タイプを作成することが少なくありません。その中で、新着情報にもカテゴリーをもたせたい、商品もカテゴリーで分類したいとなることがあり、そのような場合はカスタムタクソノミーを作成して適用します。

ブログの場合は標準で「カテゴリーウィジェット」が用意されているので、ウィジェットエリアにそれをドラッグするだけでカテゴリーの一覧を表示することができますが、このカテゴリーウィジェットはカスタムタクソノミーに対応していないため、独自に作成した「新着情報」や「商品」のカテゴリーも表示したいと思っても、ブログのカテゴリーのように簡単にウィジェットで表示することができません。

標準のカテゴリーウィジェットを継承して拡張ウィジェットを作成する

そこで、標準のカテゴリーウィジェットを継承してカスタムタクソノミーにも対応したカテゴリーウィジェットを作成してみました。標準のウィジェットを継承することでウィジェットを初めから作る必要がなく、標準のウィジェットに機能追加する形で作成することができます。

標準のカテゴリーウィジェット。「投稿」のカテゴリーしか表示できない。

標準のカテゴリーウィジェット。「投稿」のカテゴリーしか表示できない。

カスタマイズしてカスタムタクソノミーにも対応したカテゴリーウィジェット。

カスタマイズしてカスタムタクソノミーにも対応したカテゴリーウィジェット。

functions.php

下記のコードをfunctions.phpにコピペすればカテゴリーウィジェットがカスタムタクソノミー対応版に拡張されます。少しコードが長く感じますが、標準のウィジェットを継承することで一から作成するより少ないコード量ですんでいます。

function override_widget_categories() {
	class WP_Widget_Categories_Taxonomy extends WP_Widget_Categories {
		private $taxonomy = 'category';

		public function widget( $args, $instance ) {
			if ( !empty( $instance['taxonomy'] ) ) {
				$this->taxonomy = $instance['taxonomy'];
			}

			add_filter( 'widget_categories_dropdown_args', array( $this, 'add_taxonomy_dropdown_args' ), 10 );
			add_filter( 'widget_categories_args', array( $this, 'add_taxonomy_dropdown_args' ), 10 );
			parent::widget( $args, $instance );
		}

		public function update( $new_instance, $old_instance ) {
			$instance = parent::update( $new_instance, $old_instance );
			$taxonomies = $this->get_taxonomies();
			$instance['taxonomy'] = 'category';
			if ( in_array( $new_instance['taxonomy'], $taxonomies ) ) {
				$instance['taxonomy'] = $new_instance['taxonomy'];
			}
			return $instance;
		}

		public function form( $instance ) {
			parent::form( $instance );
			$taxonomy = 'category';
			if ( !empty( $instance['taxonomy'] ) ) {
				$taxonomy = $instance['taxonomy'];
			}
			$taxonomies = $this->get_taxonomies();
			?>
			<p>
				<label for="<?php echo $this->get_field_id( 'taxonomy' ); ?>"><?php _e( 'Taxonomy:' ); ?></label><br />
				<select id="<?php echo $this->get_field_id( 'taxonomy' ); ?>" name="<?php echo $this->get_field_name( 'taxonomy' ); ?>">
					<?php foreach ( $taxonomies as $value ) : ?>
					<option value="<?php echo esc_attr( $value ); ?>"<?php selected( $taxonomy, $value ); ?>><?php echo esc_attr( $value ); ?></option>
					<?php endforeach; ?>
				</select>
			</p>
			<?php
		}

		public function add_taxonomy_dropdown_args( $cat_args ) {
			$cat_args['taxonomy'] = $this->taxonomy;
			return $cat_args;
		}

		private function get_taxonomies() {
			$taxonomies = get_taxonomies( array(
				'public' => true,
			) );
			return $taxonomies;
		}
	}
	unregister_widget( 'WP_Widget_Categories' );
	register_widget( 'WP_Widget_Categories_Taxonomy' );
}
add_action( 'widgets_init', 'override_widget_categories' );

長崎から WordCamp Kansai 2014 に参加した話

$
0
0

6月7日、8日に大阪にて WordCamp Kansai 2014 が開催されました。大阪、神戸、京都、奈良、和歌山の方々が協力して開催されたイベントで、参加者はなんと500人!とても熱気あふれるイベントで、僕は長崎から、前日入りして参加しました(単に飛行機の都合…)。

1日目 セッション・アンカンファレンス

基調講演

Automattic の Matt Mullenweg氏 が来日しての公演でした。内容については Gigazin に掲載されています。印象に残ったのは Matt の「言い続ければそうなる」「有名になるまで嘘をつけ」という言葉。うーん、なるほど。ということで僕も自分が有名だと嘘をつき続けたいと思います(笑

アンカンファレンス 伝えたい!俺のテーマ&プラグイン

当日申し込みでまだあまり知られていない自慢のテーマやプラグインを紹介するというアンカンファレンスでした。実は僕もここで話したくて WordCamp 前日までに新しいプラグインを公式ディレクトリに登録していたのですが、ちょっとした手違いで参加申請が間に合いませんでした…。こういうのはなるべく早く行動しないといけませんね。

ここでいくつか気になった、というかすごいプラグインをいろいろ知れたのでご紹介。

Google Maps Photogallery
写真のGPS情報を読み込んでGoogleMap上に表示させるプラグイン。
Feedly Insight
Feedly の購読者数の推移をオシャレなグラフで見れたり、購読者数ボタンを設置できるプラグイン。
Check Copy Contents(CCC)
ブログ上でコピーされた文章をメールで受信できるプラグイン。

WordPressサーバの運用 (冗長化、高速化)

Nginx、MySQLチューニングによるWebサーバーの高速化や、WordPressを複数台構成で運用するときのノウハウ、そのときに役立つプラグインの紹介がありました。僕は仕事でも複数台構成にしなければいけないような大きなサイトに関わった経験がほとんど無いので、とても勉強になりました。いつか必要になるときがくるかしら…?

WordPressをMVCフレームワークとして使用する

WP Router とうプラグインを使って WordPress を MVC として使うというセッション。なんと登壇者は外国人の方。冒頭の「簡単な英語で話すからみなさんわかると思います」というのは聞き取れましたが、その後はほとんどわかりませんでした(泣

ファイル構成の例とかを見ると、WordPress内でわざわざやるにしては結構ヘビーな感じがしたんだけど、どうなんでしょう、ほとんど聞き取れなかったのでなんともわかりません。。これは翻訳版をもう一度しっかり見たいんだけど…公開されないのかなぁ。

Docker で Immutable Infrastructure な WordPress を考える

Vagrant は VCCW でよく使っているし、先日参加した「ぺちぱな。∞」でも勉強したけど、Docker は難しそうで避けてきたので聴講してみました。登壇者の方のトークが軽快だったせいか、お、以外に簡単そうじゃね?という気もしたんですが、データの永続化とか考えるとちょっとややこしそうな感じがしました。だれか VCCW みたいに知識がなくてもうまいことやれるパッケージをお願いします!

WordPressのプラグイン、テーマ開発のビジネスモデル研究

有料プラグインサイトを運営する宮下さんのセッション。世界のテーマ・プラグイン販売サイトの事例などを紹介されていました。僕もいくつかプラグインを販売しているけどほとんどお金にはなっていなくて、多分多くのプラグイン開発者の方はそうなんじゃないかなーと思います。話の中で「ThemeForestには100万ドル以上売るデザイナーが17人いる」という話が出てとても驚きました。テーマ作ろ…。

閉会後…

閉会式の後、鹿児島・熊本・長崎の WordBench の運営者で集まって写真を撮ってもらいました!長崎から一人で参加して、終始アウェーで心が折れてしまったらどうしようと思いながら参加しましたが、WordBench をやっている、というだけでこうやって普段は会えないような方達とも仲良くしていただいてとても楽しかったです。

Photo by @webboyjp

Photo by @webboyjp

OWL OSAKA での懇親会

閉会式の後、OWL OSAKA というクラブで懇親会が開かれました。こちらも300人という大人数が参加!僕は全然詳しくありませんが OWL というところはすごい感じのところなんですかね?結構 Twitter で「あの OWL!」みたいなのをみかけました。

lt で、なんと僕はこの場で LT をさせていただきました。WordCamp 開催前、「懇親会でのLT申し込みは本日まで」というツイートを見かけ、締め切りぎりぎりまで申し込むか、内容をどうするかで悩み、結局いいネタも浮かばぬまま、まぁどうせ落ちるだろうし「自作プラグインの紹介させてください」でいいやーと応募したところ、何の間違いか当選してしまったのでした。相当応募者が少なかったんだろうなーと思っていたのですが、当日スタッフの方にお伺いしたところ、それなりの応募があったみたい。とても緊張したし、ネタもゆるゆるだったけど、参加して良かったです。僕は楽しかったです。

実はちょっとした機材トラブル?がありまして、ステージでちゃんとスライドを操作できるかギリギリまでわからない状態だったのですが、組長サイトの作り方で会場を大いに盛り上げた@lilyfanjpさんに色々とサポートしていただき、何とか僕も無事に LT を行うことができました。改めて、ありがとうございました!

2日目 コントリビューターデイ

2日目はコントリビューターデイ。海外製のテーマやプラグインを翻訳したり、フォーラムに解答したり、テーマやプラグインを公開したり、WordPressのコア開発に関わったり、参加者みんなで WordPress に Contribute(貢献)しようというイベントです。

コアにパッチを送るのにも興味があったのですが、それまでにまだまだ足りないものがあるし、プラグイン開発の次のステップはテーマ開発だと思っていたのでそちらのほうに参加させていただきました。世話役は hinagata 作者の平田さん。僕は公開しようと準備しているテーマが無かったので、このブログで使用している自作テーマを公式ディレクトリ登録用にカスタマイズするということを行いました。時間内でとりあえずエラーは潰せたので、細かい不具合を調整してなるべく早く登録申請を出したいと思います。

僕の向かいの席にも偶然公式ディレクトリテーマ開発者の方が座っていらっしゃいました。もしかして…と声をかけてみると、なんと Chocolat の作者である@Mignon Styleさん でした。ここぞとばかりに疑問に思っていたことなどいろいろ教えていただきました。とても参考になりました、ありがとうございました!

懇親会

その後、僕は翌日に帰ることにしていたので、一次会、二次会と懇親会にも参加させていただきました。初めてお会いした方も多かったですが、皆さんとてもフレンドリーに接してくださり、また色々と深い話もできてとても刺激的でした。長崎にいるとこのような機会は本当に少ないので、参加して良かったなーと改めて思いました。

WordBench長崎もここしばらく開催できていませんが、WordCamp Kansai で僕が感じたような感覚を参加者の皆さんに感じてもらえるような、そんな場所にできればなーと思っています。といっても僕では力不足なので、長崎の WPer の皆さん、ぜひ一緒に何か楽しいことをやりましょう!

Viewing all 235 articles
Browse latest View live