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で投稿時にバリデーションを行う方法
WordPressで投稿時にバリデーションを行う方法WordPressで投稿時に、投稿した記事の中に特定の文字が入っているか確認し、入っていればそのまま保存し、入っていなければ警告を表示して保存を中断するというバリデーションの処理方法を紹介したいと思います。 save_p ...
カスタムフィールドの値が格納される配列のキーはAdvenced Custome Field の編集画面のinputのidを参照または$varsをvar_dump()でechoとdieさせてチェックする。
//※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['acf']['field_58da095847f7e'])) {
echo '日付は指定の書式(YYYY/MM/DD)で入力して下さい';
die();
}
//問題が無い場合はtrueを返す
echo 'true';
die();
}