グループを繰り返せるカスタムフィールド用プラグインを探してみた

みんな使っているのになぜか標準仕様がおざなりで使えない「Wordpressのカスタムフィールド」、プラグインをいろいろためしているのですが、グループ化したカスタムフィールドを繰り返す(「画像とキャプションの組み合わせ」を任意の個数追加、ってかんじ)のを実現できるもの、となるとかなり候補が絞られます。CMSとして使う際には頻出テクニックなんだけどね。

Custom Field Suite

http://docs.customfieldsuite.com/

おそらく現状最良の選択。ただ、細かいけど困るバグが多くてバグ対応も遅いのがなあ。「必須」にチェックを入れているのに保存したらチェックが消えている、とか。「次のアプデで対応します」て言ったきり1ヶ月放置されてたり。

グループ化した時だけテンプレートでの出力時に独自の関数を使うが、他はpost_customのままでいけそうなのも好感触。最初にグループ化するための操作が少しだけわかりづらいが、わかってしまえばOKだし、更新する人には関係ないことなので大丈夫。

※備考:「チェックボックスのリスト」は作れません。カスタマイズして追加する方法もあるようですが、ここはWordpress本来の仕様である 「カスタムフィールドは名前:値の1対1の組み合わせ」というのを尊重して、各チェックボックスの項目ごとに「真/偽(簡易チェックボックス)」を増やし て対応してみます

ACF

https://www.advancedcustomfields.com/

超有名プラグインだけど、繰り返しフィールド機能は有料。しかも内部的に独自のデータ処理をやっているみたいで、他のプラグインへの乗り換えが難しかったりWordpress標準の関数が一部使えなかったりと悪い評判も聞いたりする。

Smart Custom Fields

http://2inc.org/blog/category/products/wordpress_plugins/smart-custom-fields/

必要最小限の機能を、できるだけWordpressの仕様に則って実現するというコンセプトなので後々乗り換えることになっても安心そう。
ただし、現状では「必須項目」を設定できないので、仕事としての制作にはまだ使えないと思う。

カスタムフィールドテンプレート

http://ja.wpcft.com/

おれの環境では本文が文字化けして使えなかった。同様の報告例あり。
それと、エディタ画面でのボタン配置や操作感が悪く、仕事として作る際にはお客さんに説明しづらい。
プラグインは無料だがマニュアルが有料。

 

the_posts_paginationのページ番号を2桁にする

WordPressで構築するサイトで、デザイナーさんからこんなデザインをもらった。
ページ部分の表記が
 < 01 02 03 >
になってる。
サイバーでカッチョイイから、ということみたいだが、できるかそんなことー!→できたー!

以下、私がやった時のやり方です。

参考記事(ありがとうございました!)
the_posts_pagination()のタグをBootstrap 3形式にする WordPressカスタマイズ事典
正規表現で数字の桁数を表す 名もないテクノ手
※「1桁の数字」を検出するのは意外と複雑なようですが(「15.2」の「1」と「5」と「2」がヒットしちゃったりするから)、今回は整数だとわかっているので簡略化した正規表現にとどめました

function.phpに下記を追加します。

function the_posts_pagination_custom( $args = array() ) {
	$navigation = '';
	// 1ページのみの場合は出力しません。
	if ( $GLOBALS['wp_query']->max_num_pages > 1 ) {
		$args = wp_parse_args( $args, array(
			'mid_size'           => 1,
			'prev_text'          => _x( 'Previous', 'previous post' ),
			'next_text'          => _x( 'Next', 'next post' ),
			'screen_reader_text' => __( 'Posts navigation' ),
		) );
		// typeを固定します。今回の場合はlistです。
		$args['type'] = 'list';

		//  ページ区切りリンクを準備します。
		$links = paginate_links( $args );
		if ( $links ) {
			//1桁の場合は前に0を追加します。
			//閉じタグはの場合との場合があるのでどちらでも対応できるように
			$links = preg_replace(
				'#(\b\d\b)#', 
				'0$1', 
				$links);
			$template = '%1$s';
			$navigation = sprintf($template, $links);
		}
	}
	echo $navigation;
}

WordPressで特定エントリの所属カテゴリを「親→子」の順に並び替える

例えばこういう、親子関係のあるカテゴリ構成があったとします

勇者
 ー時の勇者
 ー風の勇者
 ー神に選ばれし勇者

ある記事を「勇者 風の勇者」のカテゴリに指定した場合、普通にget_the_category()を使うと「勇者 風の勇者」ではなく機械的にアルファベット順に「風の勇者 勇者」と並べられてしまってヴァーとなることがあります

試行錯誤で2パターンほど対処法を試したので両方メモしておきます

解法その1

参考にさせていただいた記事です。ありがとうございます!
カスタムタクソノミーに親子関係(階層)を持たせ、複数選択したタームの並び順を親>子の順番に表示する
※「children[]」という箇所が自分の環境では動作しなかったので、自分なりに書き換えましたが、ちょっと頭の悪い処理かもしれません。ごめん。

functions.php

//引数として与えた配列を親子順に
function getRootTaxonomies($terms=null){
	$rootterms = array();
	$roottermstemp = array();
	if(isset($terms))
	{
		foreach($terms as $k=>$v){
			if($v->parent === 0){
				$rootterms[] = $v;
			}
		}
		foreach($rootterms as $k=>$v)
		{
			$i = 0;
			foreach($terms as $sk=>$sv){
				$childname = 'child'.$i;
				if( $v->term_id === $sv->parent){
					$rootterms[$k]->$childname  = $sv;
					$i++;
				}
			}
		}
	}
	return $rootterms;
}

テンプレートの該当箇所

slug; ?>
//カテゴリを出力したい場合
name; ?>
$childname && $pv->$childname->name != ''){
?>
//スラッグを出力したい場合
$childname->slug; ?>
//カテゴリを出力したい場合
$childname->name; ?>

解法その2

こっちの方法では、階層の同じカテゴリを複数指定した場合はうまくいかないです。

参考にさせていただいたのは下記の二つの記事です。ありがとうございます!
カテゴリIDを階層順に並べた配列をつくる Wordpressテーマの作り方
カテゴリIDからカテゴリ名/スラッグを取得する

function.php

//所属カテゴリ一覧を親子順に
function get_categories_tree() {
    $post_categories = get_the_category();
    $cat_trees = array();
    $cat_counts = array();
    $cat_depth_max = 10;
    foreach ( $post_categories as $post_category ) {
        $depth = 0;
        $cat_IDs = array($post_category->cat_ID);
        $cat_obj = $post_category;
        while ( $depth < $cat_depth_max ) {
            if ( $cat_obj->category_parent == 0 ) {
                break;
            }
            $cat_obj = get_category($cat_obj->category_parent);
            array_unshift($cat_IDs, $cat_obj->cat_ID);
            $depth++;
        }
        array_push($cat_trees, $cat_IDs);
        array_push($cat_counts, count($cat_IDs));
    }
    $depth_max = max($cat_counts);
    $cat_key = array_search($depth_max, $cat_counts);
    $cat_tree = $cat_trees[$cat_key];
    return $cat_tree;
}
//カテゴリIDからカテゴリ名とスラッグ取得
    function get_category_name_by_id($cat_ID,$type) {
        $cat_ID = (int) $cat_ID;
        $category = get_category($cat_ID);
        if($type == 'name'){
            return $category->cat_name;
        } elseif($type == 'slug') {
            return $category->slug;
        }
    }

テンプレートの該当箇所


//スラッグを出力したい場合

//カテゴリを出力したい場合