WordPress – カスタムフィールドとカスタム投稿とカスタム投稿表示ページの作成

WordPressでカスタムフィールドを持つカスタム投稿を作る機会があり、色々と調べながら試行錯誤したのでまとめておきます。

例として、タイトル・内容・開催日と開催場所を持つイベントについての投稿で、サイドバーでイベント年のアーカイブリンクを設置するとします。

準備

  • カスタム投稿プラグイン:Custom Post Type UI
  • カスタムフィールドプラグイン:Advanced Custom Fields

プラグインを使って作成

  • カスタム投稿タイプ:イベント(event)
  • カスタムフィールド1:イベント日付(event_date)
  • カスタムフィールド2:イベント場所(event_place)

カスタム投稿一覧表示ページ(archive)を作る

既存のarchive.phpをコピーして”投稿タイプ名-archive.php”にする。

$paged = get_query_var('paged') ? get_query_var('paged') : 1 ; //ページの判定
$val = (isset($_GET["evey"]) && $_GET["evey"] != "") ? $_GET["evey"] : "";
$mtqr = "";
//アーカイブリンクよりパラメータでイベント日付の年が渡されたらLIKEで絞る
if(is_numeric($val)){
$mtqr = array(
        array(
            "key" => "event_date",
            "value" => $val,
	    "compare" => "LIKE"
        )
);
}
$args = array(
		'post_type'=>'event',		//カスタム投稿タイプを指定
		'posts_per_page'   => 5,
		'post_status' => 'publish',
		'caller_get_posts' => 1,
		'meta_key'=>'event_date',	//カスタムフィールドでソートする為に設定
		'order' => 'DESC',
		'orderby'=>'meta_value',
		'paged' => $paged,
		'meta_query' => $mtqr,
	 );
$wp_query = new WP_Query($args);
if ( $wp_query->have_posts() ) :
	while ($wp_query->have_posts()) : $wp_query->the_post();
		echo get_field('event_date');	//Advanced Custom Fields で指定したフィールド名を指定
		echo post_custom('event_place');//Advanced Custom Fields で指定したフィールド名を指定
	endwhile;
endif;
wp_reset_postdata();

カスタム投稿一覧表示ページ(archive)にページネーションを付ける

管理画面の表示設定の表示件数を1または’posts_per_page’   => 5より小さい値にしておく。

global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()){
	$paginate_format = '';
$paginate_base = add_query_arg('paged','%#%');
}
else{
	$paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .
	user_trailingslashit('page/%#%/','paged');;
	$paginate_base .= '%_%';
}
$links = paginate_links(array(
	'base' => $paginate_base,
	'format' => $paginate_format,
	'total' => $wp_query->max_num_pages,
	'type'  => 'list', //配列で出力
	'mid_size' => 1, //カレントページの前後
	'end_size' => 0,
	'current' => ($paged ? $paged : 1),
	'prev_text' => '«',
	'next_text' => '»',
));
echo $links

カスタム投稿表示ページ(single)を作る

既存のsingle.phpをコピーして”投稿タイプ名-single.php”にする。

※カスタムフィールドの値はget_fieldで取得

カスタム投稿アーカイブ一覧(サイドバー用)を作る

既存のsidebar.phpをコピーして”sidebar-投稿タイプ名.php”にする。

※カスタムフィールドの値はget_fieldで取得

$post_loop = new WP_Query( array(
		'post_type' => 'event',		//カスタム投稿タイプを指定
		'posts_per_page' => 5,
		'no_found_rows'  => true,
		'update_post_meta_cache' => false,
		'update_post_term_cache' => false,
		'order' => 'DESC',
		'meta_key'=>'event_date',		//カスタムフィールドでソートする為に設定
		'orderby'=>'meta_value',
	) ); ?>
if ($post_loop->have_posts()) :
	$arr_eventdate = array();
	while ( $post_loop->have_posts() ) : $post_loop->the_post();?>
		$arr_eventdate[] = substr($opendate, 0, 4);	//開催日の年だけ切り出して全て控えておく
:
内容をget_field等で出力
:
	phpendwhile;
phpendif;
phpwp_reset_query();
:
:
/* サイドバーで出力する */
//イベント開催年を控えた配列内で重複している年を削除する
$unique = array_unique($arr_eventdate);
//キーが飛び飛びになっているので、キーを振り直す(キーは特に使用しないのでこの処理は必須では無い)
$alignedUnique = array_values($unique);
foreach($alignedUnique as $value){
	echo '<li><a href="'.home_url().'/?post_type=event&evey='.$value.'">'.$value.'年のイベント</a></li>';
}

カスタム投稿にバリデーションを追加する

WordPressで投稿時にバリデーションを行う方法

https://41y.me/validate-post/

カスタムフィールドの値が格納される配列のキーはAdvenced Custome Field の編集画面のinputのidを参照(acf-field-field_XXXXX_label の field_XXXXX)または$varsをvar_dump()でチェックする。

//※pre_submit_validation関数のみ記載
function pre_submit_validation(){
	//簡単なセキュリティのチェック
	check_ajax_referer( 'pre_publish_validation', 'security' );

 	parse_str( $_POST['form_data'], $vars );

	if (!preg_match('/^\d{4}\/\d{2}\/\d{2}$/', $vars['fields']['field_58da095847f7e'])) {
		echo '日付は指定の書式(YYYY/MM/DD)で入力して下さい';
		die();
	}
	//問題が無い場合はtrueを返す
	echo 'true';
	die();
}
スポンサーリンク
スポンサーリンク



シェアする

  • このエントリーをはてなブックマークに追加

フォローする