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に変更すると良いようです。
実際に送料無料が発生しなくなったので、これで間違いないかと。
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();
以上。