Moral Hazard!!

ドラマーが音楽やホームページやガラクタを作るよ。

wordpressで管理画面に設定しているタイムゾーンとずれる問題

No Comment wordpress,駄日記,

2.7くらいからアップデートして使っているwordpressの管理画面でタイムゾーンの設定を「'UTC+9'」(日本時間)にしているのに、タイムゾーンがUTC(グリニッジ標準時)のまま。query_postsで投稿を直接日時指定しても上手く反映されない困った。

wordpressのフォルダ直下「wp-settings.php」が

// WordPress calculates offsets from UTC.
date_default_timezone_set( 'UTC' );

と、UTCのままになっていることがある。
これを

// WordPress calculates offsets from UTC.
date_default_timezone_set( 'UTC+9' );

にすることで、日本時間になる・・・のだが!

wp-settings.phpはコアファイルなので勿論アップデート時には上書きされてしまう。
なので上記方法はNG。

hetemlなどのtimezoneを変更できない&UTCのレンタルサーバーは、date関数をwordpress内で用意された
「date_i18n」
という関数に置き換える事で解決できる。

wordpressに挿入したyoutube動画がz-indexを突き破る件

No Comment wordpress,

youtube動画のurlを張り付けるだけでサイトに動画を表示できるwordpressだが、SafariやIEなどのブラウザでは、lightboxでポップアップした画像にyoutube動画が覆いかぶさってしまう。

解決には、ヘッダにでも以下をぶち込む。

<script type="text/javascript">
jQuery(function($){
$('iframe').each(function(){
$(this).attr('src',$(this).attr('src')+'&amp;wmode=transparent');
});
});
</script>

WP-Cycleで透過画像をフェードさせたいのにIE8以下では透過出来てない件を解決する

No Comment wordpress,

とても便利なスライダープラグインWP-Cycleですが、IE8以下ではpng画像が透過しません。(ver.0.1.13現在)

■解決策■

外人さんが頑張ってくれてます。

こちらで、
「wp-cycle.phpの438から446行を書き換えればいいのさHAHA」
と書かれてます。
具体的には以下。

jQuery(document).ready(function($) {
$("#<?php echo $wp_cycle_settings['div']; ?>").cycle({
fx: '<?php echo $wp_cycle_settings['effect']; ?>',
timeout: <?php echo ($wp_cycle_settings['delay'] * 1000); ?>,
speed: <?php echo ($wp_cycle_settings['duration'] * 1000); ?>,
pause: 1,
fit: 1
});
});

を、

jQuery(document).ready(function($) {
$("#<?php echo $wp_cycle_settings['div']; ?>").cycle({
fx: '<?php echo $wp_cycle_settings['effect']; ?>',
timeout: <?php echo ($wp_cycle_settings['delay'] * 1000); ?>,
speed: <?php echo ($wp_cycle_settings['duration'] * 1000); ?>,
cleartypeNoBg: true
});
});

に書き換え。具体的には最後の2項目「pause: 1,fit: 1」を「cleartypeNoBg: true」に置き換えたらOK。

※最終Updateが去年の8月だけど、もしアップデートしたらこの部分を再度修正しないといけない。

これで背景は透過したかに見えたんだけど、今度はフェードの時に透過画像の縁にへんな黒いノイズがのってしまう。

なので今度はVIVID Labs.さんから知恵を拝借、IE用のフィルタ・AlphaImageLoaderを使用して回避する。

<!--[if lte IE 8 ]>
<script language="javascript">
jQuery(function() {
if(navigator.userAgent.indexOf("MSIE") != -1) {
jQuery('img').each(function() {
if(jQuery(this).attr('src').indexOf('.png') != -1) {
jQuery(this).css({
'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' +
jQuery(this).attr('src') +
'", sizingMethod="scale");'
});
}
});
}
});
</script>
<![endif]-->

WP-Cycleのタグ直後にでも、「IE8以下だったらこのフィルタをpng画像に適用する」と指定。
wordpressなので$をjQueryに変更しています。

これでIEでも(多少ジャギるけど)透過でフェード表示させることが出来ました。

カスタム投稿でアーカイブページを作った時の分岐方法。

No Comment wordpress

wordpress3.1からカスタム投稿タイプを設定する時に、register_post_typeに「'has_archive' => true」を設定する事で、カスタム投稿用のアーカイブページがスラッグ名で作れるようになってる。

カスタム投稿タイプの設定方法

そして最近は「pre_get_posts」「is_main_query」を使って、メインのループを
「テンプレートがスッキリ綺麗」

「クエリ数が減らして速度UP」
なんて書き方がクールだとかなんとか。

ちなみに「カスタム投稿のアーカイブページ」を分岐するのには
is_post_type_archive('投稿タイプ名')
を使う。

function main_loop_check( $wp_query ) {
	if ($wp_query->is_main_query() && is_post_type_archive('movie')) {
        $wp_query->set('posts_per_page','10');
	$wp_query->set('order','ASC');
    }
}
add_action( 'pre_get_posts', 'main_loop_check' );

とすると、投稿タイプ「movie」のアーカイブテンプレートは

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><?php the_title();?></h2>
<?php the_content(); ?>
<?php endwhile; endif; ?>

とquery_postsなど書かなくても反映される。

素敵。

wp_mailでBccが届かなくて焦った件(Gmail)

No Comment wordpress,サイト製作,,

wp_mail()を使って簡単にメールフォームを作ろうと思ったら、ヘッダの引数にBccを指定した途端に届かない!Ccには届く!という摩訶不思議な現象に困った。

wp_mail()の基本設定(公式リファレンス)

$to = 'mail@mail.com';
$subject = 'タイトル';
$headers[] = 'From: 送信元名前 <sousinmoto@mail.com>';
$headers[] = 'Cc: Cc宛先<ccatesaki@gmail.com>';
$headers[] = 'Bcc: Bcc宛先<bccatesaki@gmail.com>';
$message = '本文'

wp_mail($to,$subject,$message,$headers);

と書けば送信先、Cc、Bccを含んだメール送信が可能なわけだ。簡単。
Ccとかいらね!って場合は第4引数(アタッチメント、この場合はヘッダ)を除いたらいい。

単に送信先を複数にしたければ、

$to = array('mail@mail.com','second-mail@mail.com');

と配列にすればOK。

とにかくシンプルに!って時はソースに

wp_mail('mail@mail.com','タイトル','本文');

これ書くで届く。素晴らしい。
で、何故か自分の環境ではBccだけが届かない。

おかしいな?と調べたところ、Gmailでは送信先とBccを同じGmail受信ボックスで受信した場合、重複を防ぐためかBccをPopしないようだ。

つまり僕は、同じGmailアカウントで2つのメール、「mail@mail.com」「bccatesaki@gmail.com」を受信していたので、mail@mail.comだけが受信された形になっていた。

なので、試しにBccのみGmailアカウントで受信してみたら、「非公開の受信者宛」という宛先でこのメールが届いた。(Googleに詳細)

送信テストする時は注意しないとね。