[WordPress]カスタム投稿のシングルページを条件分岐させるにはis_singular()を使う。

カスタム投稿タイプのシングルページかどうかの判定をしたい場合、該当ページで下記コードを実行すると真偽値が返却されます。

<?php is_singular( $post_types ); ?>

引数$post_typesには、判定したいカスタム投稿名を入力します。

例:

<?php if(is_singular('hoge')): ?> //hogeというカスタム投稿タイプを指定
    <?php get_template_part( 'loop-hoge' ); ?>
<?php else: ?>
    <?php get_template_part( 'loop' ); ?>
<?php endif; ?>

関数リファレンス/is singular

「商品名のエイリアス」投稿タイトルをif~else文で出し分ける。(AdvancedCustomFields使用)

ちょっとした小ネタです。

投稿名を商品名として表示するページを作ったのですが、数点だけ異なるルールの商品があることが後から判明し、回避策として対応したときのコードです。

対応方法

 
「商品名のエイリアス」をカスタムフィールドで作ってif文で出し分ける方法で逃げました。

サンプルコード

※カスタムフィールドの設定等の説明は省略します。

<?php if(have_posts()): while(have_posts()): the_post(); ?>

	<div class="item-name">
	<?php //商品の別名があれば取得して表示する

		$item_alias = get_field('item-alias'); //商品の別名を取得

		if($item_alias){
			echo $item_alias; //商品の別名がある場合はそれを出力する
		}else{
			the_title();
		}

	?>
	</div>

<?php endwhile; endif; ?>

get_field()で値を取得し、if文の条件として使います。
「商品名のエイリアス」がある場合のみそれを出力し、無ければ通常の投稿タイトルを出力します。
get_field()はAdvancedCustomFields用の関数です。

[WordPress][wp_localize_script()]WordPressで外部JSファイルにテーマファイルのURLを渡す方法。

WordPressで、ブラウザのウィンドウサイズを判定して、サイズにより異なるjsファイルをロードさせる方法を調べてみました。

その際、wp_localize_script()という関数の存在を知り、調べたことをまとめてみます。

global.js

global.jsというjsファイルを作り、以下の記述でウィンドウサイズを判定してjsフィアイルをロードします。

// global.js
jQuery(function() {

    //PC環境の場合
    if (window.matchMedia( '(min-width: 769px)' ).matches) {
        jQuery.ajax({
            url: pc.url,
            dataType: 'script',
            cache: false
       });

    //モバイル環境の場合
    } else {
        jQuery.ajax({
            url: mobile.url,
            dataType: 'script',
            cache: false
        });
    }
});

参考:レスポンシブデザイン対策!デバイスのサイズに応じてjava scriptを呼び変える

window.matchMedia()でウィンドウサイズを判定(IE9以下は未対応のようです)。

ajax()を使い、ロードしたいjsファイルのパスを記述するのですが、WordPressだと通常はテーマフォルダの中にjsファイルを置くと思ので、動的に記述する必要がありますよね。

jsファイルの中にパスを呼び出すテンプレートタグは記述できないので、以下のようにhead要素でwp_localize_script()を使ってglobal.jsに渡します。

head要素

<?php // ※head要素内に記述
    wp_deregister_script('jquery');
    wp_enqueue_script('jquery', get_template_directory_uri().'/js/jquery-2.1.1.min.js','2.1.1');
    wp_enqueue_script('global', get_template_directory_uri().'/js/global.js',array('jquery'));
    wp_localize_script('global', 'pc', array('url' => get_template_directory_uri().'/js/pc.js'));
    wp_localize_script('global', 'mobile', array('url' => get_template_directory_uri().'/js/mobile.js'));
?>

参考:Javascriptでサイトのデータを扱う方法

wp_localize_script()とは?

WordPressには、PHPからJavaScriptにデータを渡すwp_localize_scriptという関数がある。元々は多言語対応のために、JavaScriptに翻訳文字列を渡すための関数だった。現在では翻訳文字列にかぎらず、さまざまなデータをPHPからJavaScriptに渡す用途で用いられる。

引用:wp_localize_scriptの生成するJSONはHTMLエスケープされない

今回初めて知りましたが、なかなか便利な関数ですね。JavaScriptに渡したいデータをJSON形式に変換するそうです。エスケープされていないので注意する必要があるようです。

JSONはあまり使ったことが無いので詳しくないのですが、フォームから入力されたデータをJavaScriptに渡すような場合、変換されたJSONデータをを無害化した方がよい、ということでしょうか。

[メモ]WordPressの投稿(ビジュアルとテキスト切り替え)で、sectionタグを使用可能にする。

WordPressの投稿でsectionタグを入力したあと、コンテンツエディタのビジュアルとテキストを切り替えるとsectionタグが消えてしまいます。今まで知らなかった。(汗)

回避方法をググって見つけたのでメモしておきます。

以下のコードをfunctions.phpに記述する。

//投稿でsectionタグの使用可能にする
add_filter('content_save_pre','set_allowedposttags');

function set_allowedposttags($content){
  global $allowedposttags;
  $allowedposttags['section'] = array();
  return $content;
}

参考:WordPress : 入力した ruby タグが消えてしまうので何とかする。
http://freefielder.jp/blog/2013/01/wordpress-ruby-tag-fix.html
※助かりました!

ただし、PS Disable Auto Formattingが有効になっていると、このコードは効かないようです。
自分は泣く泣く無効にしました。

「WordPress」loop.phpの中で条件分岐するときの論理演算子の使い方。

テンプレートファイルの管理をしやすくするアイデアとして、テンプレートファイルをまとめる方法を考えてみました。
例えば、以下のような条件の時、

  • 現状使用しているテンプレートはhome,single,page,archive,index,loop,loop-single
  • 必要なループは2パターン。「(1)single,page」用と、「(2)それ以外」用
  • loop.phpにふたつのループをまとめて記述して管理したい。

loop.phpに(1)と(2)に適したループを記述して、そのふたつを条件分岐で分岐するという方法でまとめてみました。
そのとき、論理演算子の使い方を調べました。

必要になる条件分岐のタグは下記になります。

<?php if(!is_single() && !is_page()): ?>//single.phpではない場合とpage.phpではない場合が、両方成り立つ場合
//loopタグ
<?php endif; ?>

<?php if(is_single()||is_page()): ?>//single.phpまたはpage.phpである場合
//loopタグ
<?php endif; ?>

注意すべき論理演算子の使い方としては、

<?php if(!is_single() && !is_page()): ?>

で使われている&&は、「2つの値が成り立つとき」trueを返す、つまり実行されます。成り立たない場合はfalseを返して無視されます。singleではない、pageではない、ときにtrueを返す記述です。

「singleとpage」ではないテンプレートは「home,archive,index」なので、home.php,archive.php,index.phpが使われている時にtrueを返して中に記述したループタグが実行されます。

<?php if(is_home() || is_archive() || is_index()): ?>

と記述してもいいと思いますが、将来的にテンプレートファイルが増えたとしても、記述の修正なしで対応できるというメリットがあります。

次に、

<?php if(is_single() || is_page()): ?>

ここで使われている||は「2つの値の片方または両方が成り立つとき」にtrueを返すので、「home,single,page,arcive,index」の中で、single.phpまたはpage.phpが使われているときにtrueが返されて実行します。

論理演算子を適切に使えば、多彩なパターンの条件分岐を作れそうです。
今回はloop.phpの中にループを複数作りましたが、ひとつのループの流れの中で分岐させてもいいでしょうし、いろいろできそう。

テンプレートファイルを増やすか、条件分岐で書き分けるか。案件によっても異なりますが、見通しのよいテーマ作成のひとつの手法になると思います。

参考サイト:演算子/PHP入門

クライアントワークで役立ちそうな、機能豊富なプラグイン3つ。

WP Total Hacks

かゆいところに手が届く機能を提供してくれるプラグイン。

favicon.icoの設定
管理画面ヘッダーのWordPressロゴの変更
管理画面フッターのテキストの変更
ログイン画面のWordPressロゴの変更
不要なMetaタグの削除
投稿ページ上のメタボックスを個別に選択して削除
ダッシュボードウィジェットを個別に選択して削除
リビジョンの保存件数の選択機能
自動セーブの無効化
セルフピンバックの停止
デフォルトのメールアドレス(wordpress@example.com)のカスタマイズ
Admin以外のユーザーに対するアップデート通知の無効化

派手さはないかもですが、それぞれ個別にプラグイン入れたり、functions.phpにコードを加えたりすることを考えると、かなり便利だと思います。クライアントワークで力を発揮しそう。

提供元:WP Total Hacks – 20項目以上のカスタマイズができるWordPressプラグイン | firegoby

WP SiteManager

下記の機能をまとめて提供してくれるプラグイン。今までパンくずとかページャーとか個別のプラグインを使用していたので、まとめられるとバージョンアップや管理が楽になりますね。提供元が日本の会社なのもポイント。インターフェイスが日本語のも楽です。

サイトマップ表示
パンくずナビ表示
ページナビ(ページャー)表示
サブナビ表示
デバイス判定とテーマ切り替え機能
メタキーワード、ディスクリプション設定
OGP、Twitter Cards出力機能
ページキャッシュ機能

提供元:WP SiteManager | WordPress CMS統合プラグイン

Attachments

今回の記事を書くキッカケになった、2013年の大発見プラグイン。メディアを記事やページに紐付けて、タイトル・キャプション・並び順などを管理できるプラグイン。一般的なギャラリープラグインのように画像を表示させるのではなく、テンプレート側で画像を呼び出すコードが提供されるものです。商品ページの画像一覧部分などに使用すれば、クライアントが商品画像の追加・削除・並べ替えなどを、カスタムフィールドを使うよりも柔軟に行えます。いつのまにか仕様変更されてギャラリーのmenu_orderが設定できなくなったと嘆く人たちの救世主です。

引用元:これまでWordPress Plugin Directoryで発見した良質プラグインを紹介するぜ 2013 Summer Vacation | DAICHIFIVE blog

上記の記事でおぉ、便利そう!と思ったプラグイン。