カスタムフィールドテンプレートで表示切替

カスタムフィールドテンプレートを使って表示のON・OFFを行う際、
デフォルト設定では表示をONにして、チェックボックスにチェックをつけたら「表示しない」にする場合の書き方をメモです。

こちらのサイトを参考にさせて頂いて大変助かりました。

https://zxcvbnmnbvcxz.com/wp-custum-fields/

ページナビゲーションの表示をON/OFFしたかったので、テンプレートの出力部分をこう書き換えました。

変更前

while ( have_posts() ) : the_post();
get_template_part( 'template-parts/content', get_post_format() );
the_post_navigation();
endwhile;

変更後

while ( have_posts() ) : the_post();
get_template_part( 'template-parts/content', get_post_format() );
$ctm = get_post_meta($post->ID, 'navi', true);
if(empty($ctm)):
the_post_navigation(array( 'prev_text' => '<< %title', 'next_text' => '%title >>' ) );
endif;

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

コピペ用↓

[navi]
type = checkbox
value = 表示しない
default = 表示しない

さらに

もう少し細かい事をしました。
記事編集中なので書けたら公開します。

さらにさらに

これを応用して記事リストも設置しました。

今日はこんなのが作りたかった。

  • カスタム投稿タイプ「お知らせ(info)」に設置したカスタム分類(tax_info)に「ABC(abc)」を登録
  • カスタムフィールドテンプレートで[コメント]枠を登録し、[コメント]に記入があれば記事一覧に表示。記事へのリンクは手動でコメント欄から貼る。
  • コメントがなければタイトルに自動でリンクを付ける。

書いた内容

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

[コメント]
type = textarea
rows = 4
cols = 40
tinyMCE = true
htmlEditor = true
mediaButton = true

functions.php

function getInfo($atts, $content = null) {
 global $post;
 $oldpost = $post;
 $myposts = query_posts(
array(
 'posts_per_page' => '-1',
 'post_type' => 'announce' ,
 'tax_query' => array(
 'relation' => 'AND',
 array(
 'taxonomy' => 'tax_info',
 'terms' => 'abc',
 'field' => 'slug',
 'operator' => 'IN',
)
),
 'paged' => $paged
)
 );
 if(have_posts()):
 while ( have_posts() ) : the_post();
 foreach($myposts as $post) :
 setup_postdata($post);
 $retHtml.='<h5><span class="announce"><span class="announce_date">'.get_post_time('Y/m/d').'</span>&nbsp;';
 //コメント記入なしなら以下を表示
 $ctm = get_post_meta($post->ID, 'コメント', true);
 if(empty($ctm)):
 $retHtml.='<a href="'.get_permalink().'">'.the_title("","",false).'</a>';
 $days=14;$today=date('U'); $entry=get_the_time('U');$diff1=date('U',($today - $entry))/86400;
if ($days > $diff1) {
 $retHtml.= "\n" . '<span class="ico_new">New</span>' . "\n";}
 $retHtml.='</span></h5>';
 else:
 //コメント記入ありなら以下を表示
 $retHtml.=''.the_title("","",false).'';
 $days=14;$today=date('U'); $entry=get_the_time('U');$diff1=date('U',($today - $entry))/86400;
if ($days > $diff1) {
 $retHtml.= "\n" . '<span class="ico_new">New</span>' . "\n";}
 $retHtml.='</span></h5>';
 $retHtml.='<br><p>'.post_custom('コメント').'</p>';
 endif;
 endforeach;
 wp_reset_query();
 $post = $oldpost;
 return $retHtml;
 endwhile;
 endif;
}

※記事リストを呼び出したいページの編集画面にショートコードの[InfoList]記入

結果表示例

コメントに記入がある時

2016/11/04 タイトル New!
コメントコメントコメント。くわしくは「タイトル」をご覧ください。

コメントに記入がない時

2016/11/04 タイトル New!

・・・もっとスマートな記入の仕方があるんだろうなぁ。

という不安を抱えつつさらに

カスタムフィールドテンプレートで複数条件での表示切替え。

テンプレート

$ctm = get_post_meta($post->ID, 'navi', true);
 if(empty($ctm)):
 the_post_navigation(array( 'prev_text' => '<< %title', 'next_text' => '>> %title' ) );
 elseif(get_post_meta($post->ID,'navi',true) == '前ページのみ表示'):
 previous_post_link();
 else:
 endif;

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

[navi]
type = checkbox
value = 表示しない # 前ページのみ表示
default = 表示しない

これで、記事の作成画面にはこんな選択肢が出て
—————-
□表示しない
□前ページのみ表示
—————-
【何もチェックを付けなければページナビの「前へ/次へ」が普通に表示されて、
表示しないにチェックを付ければ出ない。
前ページのみ表示にチェックを付ければ「前へ」だけ出る】というのが出来ます。

previous_post_link();を使うとリンクに「<<」を含めてくれないので、後で少し直しました。

<?php $ctm = get_post_meta($post->ID, 'navi', true);
 if(empty($ctm)):
 the_post_navigation(array( 'prev_text' => '<< %title', 'next_text' => '>> %title' ) );
 elseif(get_post_meta($post->ID,'navi',true) == '前ページのみ表示'):
 if (get_previous_post(TRUE)){ ?>
 <div class="nav-links"><div class="nav-previous"><?php previous_post_link('%link', '<< %title'); ?></div></div>
 <?php } ?>
 <?php else:
 endif;?>

これで、前のページの表示については<a href=””><< ページタイトル</a>という形に出来たし、前のページが無い場合は<div>ごとごっそり表示しないというのが出来ました。すっきりした!


Comments

コメントを残す