トランスビット
トランスビットの開発ノート Webサイト制作に役立つTipsやトラブルシューティングなどの備忘録

WordPressのギャラリーのカラム数を変更したり色々

世の中の皆さんはGW中ですね。
私は、仕事以外での想定外のイベント事……っていうかトラブルが多すぎて、その分回り回ってぐるぐるして、今年は半分GW、半分仕事って感じです。

さて、結局仕事では使わなかったけど、今後使うかもしれない程度に便利そうなのでメモ。
function.phpに記述。

/*********************************************************************************
// ギャラリーの設定を変更
*********************************************************************************/

function amethyst_gallery_atts( $out, $pairs, $atts ) {

    $atts = shortcode_atts( array(
        'columns' => '4',
        //'size' => 'thumbnail',
         ), $atts );

    $out['columns'] = $atts['columns'];
    $out['size'] = $atts['size'];

    return $out;

}
add_filter( 'shortcode_atts_gallery', 'amethyst_gallery_atts', 10, 3 );
/*********************************************************************************
// アイキャッチ画像がある場合はアイキャッチ画像を、ない場合は記事のギャラリーに入っている一番最初の画像を表示
*********************************************************************************/

function print_post_image($size = 'thumbnail'){
	if ( has_post_thumbnail() ) {
		the_post_thumbnail($size);
	} else {
		$attachments = get_children(array(
			'post_parent' => get_the_ID(),
			'post_type' => 'attachment',
			'post_mime_type' => 'image',
			'order' => 'DESC'
			));
		if(!empty($attachments)){
			$img = array_shift($attachments);
			echo wp_get_attachment_image($img->ID ,$size);
		}
	}
}

Filed under:

PHPで値が「ひらがな」のみか調べる(正規表現)

WordPressで、Wp_User_Query関数を使ってmeta_queryで絞込みしようとしたら、抽出結果が予想外で盛大にハマりました……orz
あーでもないこーでもないと色々試したものの、どうにも糸口を見つけ出せず、やさぐれてネットサーフィンしてたら、ふと、クエリそのものに頼りすぎてることに気づきました。

フォームから受け取った変数の中身の文字列が「ひらがな」のみか否か。それによってmeta_queryをちょこちょこっと変更してやればいいだけだったわけです。
というわけで、下記がUTF-8で長音も含める場合の正規表現。

if(preg_match("/^[ぁ-んー]+$/u",$str)){
  // 「ひらがな」のみの時の処理
}else{
  // 「ひらがな」だけじゃない時の処理
}

いつも思います。
たったこれだけのことで……バカ!(TT

Filed under: ,

PHPでディレクトリを扱う

随分前に桜が散ったというのに、連日寒くて涙目のトランスビットの中の人です。
冬に底値で買ってきて、今満開を迎えている庭のビオラの花が、ナメクジの食害にあっています。
ゆ る せ な い !
奴らは夜行性で、日中は土の中に潜っているそうです。
そんなわけで、夜な夜な割り箸と酢のはいった容器を持って見つけ次第捕殺しているのですが、見つけるたびに「オオナメクジ が あらわれた! →たたかう」って感じでDQ2の戦闘を思い出します。
ナメクジを捕殺している私の姿が、道行く人々を驚かせていないことを願います。

さて、PHPではdirname()を使うと、ディレクトリ名がとれます。
一階層上のディレクトリ名を取得したい場合、さらにdirname()。もう一階層(ry

$dir = dirname( $_SERVER["REQUEST_URI"] ); // URIの最後のディレクトリ

$dir1 = dirname( $dir ); // 一階層上
$dir2 = dirname( $dir1 ); // 二階層上
$dir3 = dirname( $dir2 ); // 三階層上

地味に便利です。

Filed under: ,

Dreamweaverを捨てきれない理由

お陰様で、昨日子供が卒園しました。
幼稚園で使っていた制服だとか物だとかは半分以上片付けたのですが、捨てることができない物って意外とたくさんありますね。特に、絵なんかは親から見て微笑ましい物が多いので、月替わりで飾ろうかなーとか思って、クローゼットの上の方にしまっておきました。額買わないと……!(親馬鹿)

捨てきれないと言えば、Dreamweaver。
Dreamweaverは、私がSublime Text 2(今は3使ってますが)を使い始めるまでのメインエディタでした。使用暦は、12年くらいになるかも。
確か、cs4あたりからZen-Coding(後継はEmmet)を入れて使ってました。

さて、まずはDreamweaverの欠点から。

  1. 重い
  2. 落ちる

どっちも開発ツールとしては致命的。
保存時にエラー出して固まったりするので、洒落になりません。頻度も多すぎました。

次に、Dreamweaverの良いところ。

  1. プレビュー機能
  2. 強力なサイト管理機能(リンク保持や単体ファイルの検出、テンプレート機能)

プレビュー機能は、マルチディスプレイ環境ならブラウザを常に表示しておく領域が確保できるから要らないって人もいるでしょうが、そうでない場合、どのみちブラウザで確認するとはいえ、あったら便利です。

ただ、フォントサイズの指定にremを用いていると、デザインビューは崩壊としか言いようのない状態になります。
私がメインで使っていた最後のバージョンはCC無印で、ライブビューからの編集はできなかったし、あまり正確でないプレビュー(css3の対応がいまいち)だったので、ブラウザで確認とっていましたが、CC (2014)ではライブビューからの各種修正もできるようになっています。もちろん、css3の疑似セレクタもきちんと理解してくれます。

今ではWordpressの案件がほとんどなのと、それ以外の案件は数ページの小規模サイトが多いのであまり起動することもありませんが、静的ファイル全体のリンク構成を保ちつつ、特定ファイルを別階層に移動……みたいな作業が必要なときは、Dreamweaver一択です。きっと、替わりになるものはないんじゃないでしょうか。
これまでにたくさんのサイトをテンプレート機能を使って作ってきたので、それらサイトの修正にも必要……ということで、Dreamweaverは当分ランチャーの隅に居座りそうです。

Filed under:

WordPressのtime()はちょっと違う

3月って、やらないといけないことがたくさんありますね。確定申告は、3月頭に終わらすことができました。
毎年e-Taxサイトで申告データ作成しているのですが、今年はとある箇所の自動計算で引っかかってしまい、どうやっても自動計算の値がおかしいのでe-TaxサイトのサポセンにTELし、あーだこーだ状況説明。
30分くらい調べてもらって「上司と話してわかりました!」とかいう結論が……。

「今年はそういう仕様です。あとは所轄の税務署と相談してください」
ちょ、仕様とかwwそんなわけないやろwwwww

幸い、丸投げされた所轄の電話相談窓口の税理士さんはとっても親切な方だったし、e-taxソフトでの申告データ作成(紙申告に限りなく近い)で事なきを得ました。
……来年はちゃんとバグ潰しといてよね!(怒)

長い前振りでしたが、今日のテーマは仕様。
Advanced Custom Fields(以下ACF)のDate and Time Picker アドオンを使って、日付+時刻をカスタムフィールドで入力できるようにしました。
ACFのDatePickerの解説にある例(Query posts based on date)のように、現在日時より開始日時が早くて終了日時が遅い投稿を絞り込みたい場合、meta_queryを使って開始日時と終了日時それぞれを現在日時で比較し、andでくくって取ってくればいいわけです。
そこで、現在日時をdate_i18n(‘Y/m/d g:i a’);として絞り込もうとしたんですが、何も引っかからない。
データベースをのぞいてみたら、案の定、日時はACFから指定したフォーマットではなく、UNIXタイムスタンプ形式で格納されていました。
それならtime()使えばいいやと現在日時をtime()にするも、何も引っかからない……。
何が悪いのか全くわからず色々ググッていると、Codexでcurrent_time()とかいう関数のページを見つけました。
current_time(‘timestamp’) は、ブログのローカルタイムを受け取りたい場合に time() の代わりに使うとよい。WordPress では、PHP の time() は常に UTC 時刻を返す。これは、 current_time(‘timestamp’, true) を呼び出すのと同じ結果となる。
これ。これですよ。普通、こういうのを仕様って言うんですよね!!?

// $today = date_i18n('Y/m/d g:i a');  誤:データはUNIXタイムスタンプで格納されている
// $today = time();                    誤:current_time('timestamp', true)と同じで、 UTC 時刻を返す
$today = current_time('timestamp'); // 正:Wordpressではtime()の代わり

$args = array (
    'post_type' => 'post',
    'meta_query' => array(
		array(
	        'key'		=> 'start_datetime',
	        'compare'	=> '<=',
	        'value'		=> $today,
	    ),
	     array(
	        'key'		=> 'end_datetime',
	        'compare'	=> '>=',
	        'value'		=> $today,
	    )
    ),
);

今回もCodexのお陰で無事解決。
current_time(‘timestamp’)を使うことで、思い通りのqueryを得ることができました。

Filed under: