トランスビットの開発ノート

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

- Wordpress -

Event OrganiserのカレンダーウィジェットのタイトルをY年Fにする

Event Organiserのカレンダーウィジェットのタイトル……っていうかキャプションの日付表示が、’F Y’なのを、’Y年F’にする

要は、こういうことです。
widget_calendar

方法:1 直接プラグインをいじる。

編集するファイルは event-organiser/classes/class-eo-calendar-widget.php です。
プラグインアップデートの度に作業が必要な愚策ですが、一応目的は果たせます。

 
// 編集ファイル:event-organiser/classes/class-eo-calendar-widget.php

// $title = sprintf( '<caption> %s </caption>', esc_html( eo_format_datetime( $month, 'F Y' ) ) );
$title = sprintf( '<caption> %s </caption>', esc_html( eo_format_datetime( $month, 'Y年F' ) ) );

方法:2 function.phpでフィルターフックをかける。

やるなら断然こちらですね。
eo_format_datetime関数を調べると、フィルターフックがeventorganiser_format_datetimeということと、その使い方までわかります。
本当、コーデックス様々です。

ちなみに、同じようにしたいと思った人と、それができた人を見つけました。
WordPress プラグイン Event Organiserの日付表示について

上記プラグインにてウィジェットでカレンダーを表示しています。

カレンダーの日付部分が ◯月 2016といった表示になってしまいます。これを 2016 ◯月という風に年・月に表示を変更したいのですがプラグインのファイルを探してみても変更場所がみつかりません。
変更箇所がわかる方、どうかお教えいただけませんでしょうか

(captionの部分です)
—–
回答:こんな感じですかね。

// functions.php
function my_eventorganiser_format_datetime( $formatted_datetime , $format, $datetime ) {
    if ( $format === 'F Y' ) {
        return eo_format_datetime( $datetime, 'Y年 F' );
    } else {
        return $formatted_datetime;
    }
} // 未テスト
add_filter( 'eventorganiser_format_datetime', 'my_eventorganiser_format_datetime', 10, 3 );

残念ながら、質問者さんは実現できなかったようです。
私もやってみたんですが、すぐにはダメでした。後でできました。
というのも、ウィジェットを置きなおしてみたら、それまで効いていなかったフックが効いたんで。

別にオチをつけたかったわけじゃないんですけど……色々やってみるもんですね。

Filed under:

Event Organiser覚書

珍しく間を開けずに投稿。ちょっと忘れそうなので走り書き。
……そうだ、これが本来の使い方だった。(゚Д゚)

カスタム投稿タイプ利用の、イベントカレンダープラグインとしてなかなか優秀らしいEvent Organiserを使うことに。

Event Organiserの特徴

パーマリンクは個別設定可

設定→Event Organiser→パーマリンクから、各種見本パスの太字にあたる部分を変更することで、パーマリンクを設定することが出来ます。
今回ネックとなったのは、変更できない部分。太字じゃないとこ(=_=;

個別記事ページのパーマリンクは、他に合わせてpost_idにしたいのに、Event Organiserではslug…。
固定ページならしっかり付けますが、投稿記事のslugは面倒でわざわざ変更しないので、そのままタイトル流用になっちゃう場合が多いと思います。
プラグインそのものを編集してしまおうかとも思ったんですが、slugにpost_idベースの名前をいれてやれば良いんだ!と気づけたので、いつも一方的にお世話になっているjim912さんのサイトでコード発掘。
投稿スラッグを自動的に生成する
……今後はどのサイトにもこれを入れとこうかな。

各ページ用に専用テンプレート利用可

設定→Event Organiser→基本 で、どんなテンプレート名のものを用意すればいいか、書いてくれてます。
ちょっとしたことだけど手間が減ります。

カレンダー表示用等、各種ショートコード有

別に固定ページを用意して、そこにショートコード書いても良かったんですが、Event Organiserのarchiveページにカレンダーを表示させればURL的にも美しくおさまるので、カレンダー表示用のショートコードをアーカイブテンプレートに書きました。

エラーになりました。orz

仕方ないのでevent_fullcalendarでreadme.txtに検索かけたら、eo_get_event_fullcalendar();とかいう元関数を発見。ああよかった。

// ↓これは駄目
<?php echo do_shortcode('[eo_fullcalendar]'); ?>

// ↓これが正解
<?php echo eo_get_event_fullcalendar(); ?>

——————————–
2016/02/11 追記

Event Organiser Codexを発見!!

Filed under:

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:

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:

Custom Post Type UIとAdvanced Custom Fields

椿さんが終わったのに、なんで春がやってこないんでしょう……毎日寒い。
そう言えば、皆さん縁起物に買う順番があるって知ってました?
熊手で掻き集め、それをザルですくい、扇子で広げ、最後に俵にして積み上げるんだと、露店のおばちゃんが教えてくれました。
去年は知らなかったので、掻き集めた後、いきなり俵にしてましたwwwww

さて、最近使って便利だと思ったWordpressのプラグイン、そして必要に駆られてできたコードを書いてみます。

カスタム投稿タイプをとカスタムフィールドをプラグインで管理してみる

カスタム投稿タイプもカスタムフィールド(以下CF)も、function.phpに直接ゴリゴリ書いた方が使い回しやすくていいんじゃないのかと思っていたのですが、3つ以上カスタム投稿タイプが必要な案件では、流石に管理が面倒なのでCustom Post Type UIというプラグインを使ったりします。
いろんなサイトで紹介されているだけあって、本当に簡便極まりないですね。
ついでにCFもAdvanced Custom Fields(以下ACF)というプラグイン使ったりするようになりました。
これもまた、いろんな(ry

でもACFの場合、カスタムフィールドを含めた絞り込み検索を実装しようとすると、高確率で煮え湯を飲まされます。超危険!
なぜなら、チェックボックスのように複数値を配列で保存するものは、データがシリアライズされて保存されるため、meta_queryでINが使えないのです。LIKEを使ってもいいのですが、複雑な検索要件ならお手上げです。
ACFにこだわらず、配列をシリアライズせずに値をユニークに保存してくれる別のプラグイン(例えばSmart Custom Fields)などもあるので、大人しくそっちを使っとけば万事解決なわけですが、ユーザープロフィールへのCF配置ができるプラグインって、ACFくらいしか見かけません……。

そこで、よーく考えてみました。

要は、ACFでチェックボックスのCFを実現しようとするからいけないんです。
チェックボックスのCFは、function.phpにゴリゴリ書けばいいんです。

ということで、ユーザープロフィールにチェックボックスのCFを設置するコードの中で、個人的に一番悩んだ保存方法を覚書き。

// ユーザー情報追加項目(好物情報)の保存
add_action( 'edit_user_profile_update', 'update_extra_profile_fields' );
function update_extra_profile_fields( $user ) {
  $user_id = $_POST['user_id'];
  $food = $_POST['food'];

  if( !empty( $food ) ) {
    delete_user_meta( $user_id, 'food', '' ); // まずは全消し
    foreach ( $food as $foods )
      if( $foods != '' ){
        add_user_meta( $user_id, 'food', $foods, false );
      }
  } else {
    delete_user_meta( $user_id, 'food', '' );
  }
}

要は、値の個数分add_user_meta()してやればいいんですね。表示する場合も同じように、個数分get_user_meta()すればいいわけです。
今回もwordpressのCodecとフォーラムの過去ログにお世話になりました。
毎回質問してみようかと思うんだけど、答えの近似値って探せばある……ありがたいことです。

Filed under:

WordPressのカスタマイズ時に便利なvar_dump()

はじめまして、トランスビットの中の人です。

トランスビットのサイトリニューアルから、早半年以上・・・。
この開発ノートのページデザインは随分前(多分リニューアル後一週間以内w)に外の人が上げていたようですが、忙しさにかまけて作るのをほったらかしにしてたら、今日の昼食後、トランスビットの外の人に諌められました。

外)「そろそろ、ウチのサイトのブログ仕上げて書き始めて」
中)「なんで?やっぱブログ書いとくと『サイトに箔が付くっ!』とか?」
外)「……『前どうやったっけ?』ってことがなくなるやろ」

……ついに、「忘れた」とか「覚えてない」とかの言い訳が使えなくなるようです。むごい。
とりあえずデザインの再現ができた気がするので、テスト投稿でない一発目の記事を投稿してみます。

PHPの関数 var_dump()

説明:この関数は、指定した式に関してその型や値を含む構造化された情報を 返します。配列の場合、その構造を表示するために各値について再帰的に 探索されます。
PHP 5 では、オブジェクトのすべての public、private および protected なプロパティが出力されます。

WordPressのカスタマイズで、queryで取れているデータの詳細な内容を知りたい時、<pre>タグを使って確認すると、改行が入って便利。
カテゴリ名やら親子関係やら取れたデータの総数やら、色々なことがわかります。
$argsについては省略。

<?php $the_query = new WP_Query($args); ?>
<pre>
<?php var_dump( $the_query ); ?>
</pre>

これで、『……前どうやったっけ?ってことがなくなる』ハズ。

Filed under:

さくらのライトプランでSQLite+WordPress

通常、WordPressではMySQLを使うけど、MySQLが使えないサーバ……例えば、さくらインターネットのライトプランなら、SQLiteでのWordpress導入が可能。

必要なのは、最新版のWordPress本体(投稿時は3.9.1)と 、プラグインの SQLite Integrationのみ。SQLite Integration配布サイトではインストール方法の詳しい説明もあるので、あっという間にWordPressのインスコ終了。

実は、SQLite Integrationの他に、PDO for WordPressというプラグインもあるけど、最後にバージョンアップされたのは2年以上前。2年以上前というと、WordPress2.9.2辺り(!)なので、鮮度の良いSQLite Integrationを使うようにする。(ちなみに両方試してみたけど、SQLite Integrationを使ってインストール作業する方が、体感としては速かった。)

インスコはできた。
だがしかし、このままではサイト管理どころか閲覧すら重くて、とてもじゃないが使い物にならない。MySQLが一気に恋しくなる瞬間。
ということで、以下導入してみたプラグイン。これで快適~。
ただ、キャッシュが効き過ぎてスーパーリロードすらままならない時があるので、テーマの編集をしたりした場合は、一度プラグインを無効にすると吉。
—————————————-
■キャッシュ系

  • Quick Cache
  • MO Cache
  • WP Hyper Response
  • WP File Cache

■画像系

  • Lazy Load //遅延読み込み
  • EWWW Image Optimizer //画像圧縮・リサイズ

————————————

Filed under: