Habakiriのカスタマイズ

Wordpressのテーマ「Habakiri」で、entry-metaをカスタマイズした。entry-metaは、投稿記事の更新日とかカテゴリとかある部分のところ。
マニュアル https://habakiri.2inc.org/manual/filter-hooks/では、フィルターフックが使える。
実際、たとえば空タグの追加なんかはこっちでもテストできた。
functions.php

function my_habakiri_entry_meta( $entry_meta ) {
	$entry_meta .= '<li></li>';
	return $entry_meta;
}
add_filter( 'habakiri_entry_meta', 'my_habakiri_entry_meta' );

ただ、すでに入っている$entry_metaの中身を空にするのはできても、そこから新しく入れなおすのにちょっと失敗した。
クラスの外ということでか、inc/class.entry-meta.phpの中身をコピーしても動かない。
動かなかった例(たぶん)

function my_habakiri_entry_meta( $entry_meta ) {
	$entry_meta  = $this->published();
	$entry_meta .= $this->updated();
	$entry_meta .= $this->author();
	$entry_meta .= $this->categories();
	$entry_meta .= $this->tags();
	$entry_meta .= $this->taxonomies();
	return $entry_meta;
}
add_filter( 'habakiri_entry_meta', 'my_habakiri_entry_meta' );

根本的に書き方が間違ってるだけかもしれないが、おそらくはpublished()などはprotectedのため、クラスの外からは使えない、ということだろう。たぶん。
自力で$entry_metaの中身を書けばいいとも思ったが、どうせだったらすでにあるものを利用したい。
なので、思い切って、class:Habakiri_Entry_Metaを上書きしてみることにした。
まず、modules/entry-meta.phpを子テーマディレクトリにコピー。
中身を

class my_Habakiri_Entry_Meta extends Habakiri_Entry_Meta {
	public function display() {
		do_action( 'habakiri_before_entry_meta' );
		?>
		<div class="entry-meta">
			<ul class="entry-meta__list">
				<?php
				$entry_meta = $this->published();
				$entry_meta .= $this->categories();
				$entry_meta .= $this->tags();
				$entry_meta .= $this->taxonomies();
				echo apply_filters( 'habakiri_entry_meta', $entry_meta );
				?>
			</ul>
		<!-- end .entry-meta --></div>
		<?php
		do_action( 'habakiri_after_entry_meta' );
	}
}

$EnetryMeta = new my_Habakiri_Entry_Meta();
$EnetryMeta->display();

とすると、とりあえずうまく動いたっぽい。
これ、よく考えたら、リストじゃなくって定義タグにしたい、とかいうときにも使えるかも。

タグに紐づいている記事一覧をショートコードで出す(v4.6.1)

「タグの一覧」ではなく「タグに紐づいている記事一覧」。関連記事一覧ですな。
参考:http://zero.edition.jp/archives/207
ただし、いろいろと動かなかったので、最終的には変えています。
functions.php

function tag_article_list( $atts) {
	extract( shortcode_atts( array(
		'mytag' => '',
	), $atts));
	$mytags = get_term_by('name', $mytag, 'post_tag');
	$mytag_id = $mytags->term_id;
	$args = array(
		'tag_id' => $mytag_id,
		'posts_per_page' => -1,
		'post_type' => 'post',
		'orderby' => 'date',
		'order' => 'DESC'
	);

	if($mytag_id){
	$my_query = new WP_Query($args);

	if($my_query->have_posts() ){
		$html = '';
		$html .= '<dl class="dl_actlist">' . "\n";
		while ($my_query->have_posts() ){
			$my_query->the_post();
			$html .= '<dt>' . esc_html( get_the_date() ) . '</dt>' . "\n";
			$html .= '<dd><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></dd>' . "\n";
		}
		$html .= '</dl>' . "\n";
	}
	wp_reset_postdata();
	return $html;
	}
}
add_shortcode('taglist', 'tag_article_list');

1.ショートコードに記述のタグを読み取る
2.タグ名からタグのIDを引っ張る
3.ループ作成
4.出力
 
参考と変えているのは、複数のタグに非対応にしたこと(実装時にはひとつで十分だったので)、タグIDで引っ張る形にしたこと。あと、get_template_partでループ内を記述するのではなく、$htmlに入れる形にしたこと。
変数に入れてreturnで出力する形にしたのには理由があって、変数での記述でないと、出力がなぜか固定ページの本文よりも上に出力されるので。ショートコードを記述したところに出したいのに、無関係にトップに出されると困る。
ショートコードの呼び出しは[taglist mytag="タグ名"]みたいな形で、タグ名をmytagに入れる形。日本語可。
追記:該当するタグ名がなかった場合、全クエリが表示されたため、タグIDがあった場合のみループさせるように修正。

簡単アニメーション

ワンポイントで見出しをフェードインさせたいときなんかに。
作ればいいのでしょうが、まぁワンポイント程度だと作り込むのは面倒くさい。
参考:http://qiita.com/stkdev/items/62c9f55500eff729fe4a
CSSをダウンロードして、クラスを指定する。
ディレーションとかそのあたりは、適宜上書きしていく感じで。
中身は、animation-durationとかanimation-nameとか対応するkeyframesとかその辺のセット。

Lightbox系?モーダルウィンドウとか

レスポンシブ対応だそうです。実際に使ったときは、モックアップ的なやつなのでレスポンシブ関係ねえ!でしたが、まぁ今後使うこともあるかもしれないので。
参考:http://blog.8bit.co.jp/?p=14459
参考:http://kwski.net/jquery/1201/
DL:https://github.com/FormstoneClassic/Boxer
Boxerというそうで。画像だけでなく、動画、コンテンツも使えるみたいなので。
ちなみに参考サイトにはありませんでしたが、実装に際してはjQueryプラグインですので、

<script type="text/javascript">
$(".boxer").boxer({
});
</script>

の記入が必要です。気づかず苦戦しましたが…。
2016年11月現在からは2年以上前のプラグインなので、もしかしたらそろそろ消える系かもしれない。そういう意味ではちょっと要注意ではある。

無料設定していないのに送料が無料になる(ver.2.13)

2万円以下は送料無料と管理画面で設定しているのに、なぜか購入金額1万円でも送料が無料となるパターンが発生。
あれこれ試してみた結果、注文時の購入商品が14種類だとセーフ、15種類だとアウトと判明。(個数は関係ない)
どうも、大量購入→セッションデータが保存しきれない→/(^o^)\ となるらしいです。
参考:http://itoben.com/blog/1291.html
 
PHPMyAdminでセッションのデータ型を変更すれば、きちんと保存できる→送料無料になったりしない、ということで処理してみました。
具体的には、dtb_sessionテーブルのsess_dataフィールドをTEXTからLONGTEXTに変更すると良いようです。
実際に送料無料が発生しなくなったので、これで間違いないかと。

メールタイトルを変更する(2.13.2)

デフォルトの状態だと「【店舗名】メールタイトル」となる。
基本的に気にはならないが、人によっては店舗名を後につけたい、あるいは店舗名が長いのでメールには省略した店舗名を入れたい、ということもあるかもしれない。
data/Smarty/templates/default/mail_templates/mail_titl.tpl

【<!--{$tpl_shopname}-->】 <!--{$tpl_mailtitle}-->

部分がメールのタイトルの中身になってるので、ここを変更する。

Transmit Mail.ver2のカスタマイズ

入力内容によって送信先などを変更するカスタマイズ。
実際にやったのは、返信メールのテンプレートを変更するということですが、参考にしたのは送信先の変更です。あまり変わりはないですが。
参考:http://qiita.com/dounokouno/items/21dcf87f2e43a73be551
実際にやったことは、ほぼこの通りです。
1.input.htmlに普通にラジオボタンを入れる

<dt>ご指定<span class="color_1">※</span></dt>
<dd><input type="radio" name="ご指定" value="文面A" id="radio1" {$checked.ご指定.文面A} {$checked.default} />文面A<br />
	<input type="radio" name="ご指定" value="文面B" id="radio2" {$checked.ご指定.文面B} />文面B</dd>

 
2.config/config.phpに以下追記する

$config['mail_body_a'] = 'config/mail_body1.txt';
$config['mail_body_b'] = 'config/mail_body2.txt';
$config['mail_auto_reply_body_a'] = 'config/mail_auto_reply_body1.txt';
$config['mail_auto_reply_body_b'] = 'config/mail_auto_reply_body2.txt';

メールテンプレートは、configファイルからではなく、lib/transmitmail.phpからの位置を記述することになるので注意。
つまるところ、transmitmail.php内にあるデフォルトの指定に沿ったフォーマットにするということ。
 
3.libディレクトリにexTransmitMail.phpを作成する

<?php
class exTransmitMail extends TransmitMail
{
    public function afterSetTemplateProperty()
    {
        if ($this->page_name === 'finish') {
            switch ($this->post['ご指定']) {
                case '文面A':
                    $this->config['mail_body'] = $this->config['mail_body_a'];
                    $this->config['mail_auto_reply_body'] = $this->config['mail_auto_reply_body_a'];
                    break;
                default:
                    $this->config['mail_body'] = $this->config['mail_body_b'];
                    $this->config['mail_auto_reply_body'] = $this->config['mail_auto_reply_body_b'];
                    break;
            }
        }
    }

switchで振り分けているので、ラジオボタンがふたつ以上あっても問題ない。
今回はcheckedであらかじめ何かの値が入っている状態にしているが、switch defaultで「何も値が入っていない」状態でも問題ない形にすることはできる。
 
3.index.phpを修正する

require_once 'lib/TransmitMail.php';
require_once 'lib/exTransmitMail.php';
$tm = new exTransmitMail('config/config.php');
$tm->run();

以上。