メモ:WordPressプラグイン Custom Field Template で作った入力欄から値を取得する

posts_photo

今回はWPにおいてAdvanced Custom Fieldsと双璧をなしていそうなカスタムフィールド系のプラグイン『Custom Field Template』を使ってみた感想(?)を書いてみようかと思います。

使い方を全部書くのは大変なので、値の取得に関した部分だけメモしておこうと思います。
インストールと管理画面側での操作はここでは書きません。

ループ処理内で、投稿記事のカスタムフィールドから取得する方法

まずは一般的な投稿記事を取得するループにおいて、カスタムフィールドに入力した値を取得してくる方法です。
管理画面に「入力したURL」「登録した画像」「別ウィンドウ表示」「入力したタイトル」というカスタムフィールドを作成した場合の記述です。URLとタイトルはテキストフィールドで、別ウィンドウは真偽値としてチェックボックスで作成しています。
mb_strimwidth()は単純に文字数制限としての記述になります。

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="post_box">
  <a href="<?php echo post_custom('入力したURL'); ?>" <?php if(post_custom('別ウィンドウ表示')){echo 'target="_blank"';} ?>>
    <?php 
      $_img = post_custom('登録した画像');
      $img_url = wp_get_attachment_image_src($_img,'full');
      $img_tag = '<img src="'.$img_url[0].'">';
      echo $img_tag;
    ?>
    <h3><?php echo mb_strimwidth(post_custom('入力したタイトル'), 0, 60, "...", "UTF-8" );  ?></h3>
  </a>
</div>
<?php endwhile;endif; ?>

画像に関しては1枚だけなら the_post_thumbnail(‘full’); とかでアイキャッチ画像を取得してきちゃった方が楽かなーと思います。この書き方を使うのはカスタムフィールドで画像登録欄を増やしたい場合だけかなと思います。

ある特定のページ(固定ページとか)のカスタムフィールドを取得してくる

次は特定のページに設定したカスタムフィールドの値を取得する方法になります。ループ内での取得とそんなに変わらないです。
特にメインとは関係無いのですが、nl2br()で囲った部分は入力欄をテキストエリアとして作成していると改行がそのまま反映されます。

<?php 
  //取得したいページの固有IDを入れます。
  $fields = get_post_custom(71);
?>
<div class="post_box">
  <a href="<?php echo $fields['入力したURL']; ?>" <?php if($fields['別ウィンドウ表示']){echo 'target="_blank"';} ?>>
    <?php 

      $_img = $fields['登録した画像'];
      $img_url = wp_get_attachment_image_src($_img,'full');
      $img_tag = '<img src="'.$img_url[0].'">';
      echo $img_tag;
    ?>
    <h3><?php echo nl2br($fields['入力したタイトル']);  ?></h3>
  </a>
</div>

Custom Field Templateの「multipul」オプションで同じフィールドを増やした場合の取得方法

Custom Field Templateを選ぶ場合の理由に、投稿者が自分でフィールドを増減できるようにするという目的が結構あるかと思います。
しかしその場合だと、同じフィールド名が増えるため上記に記述したような書き方だと取得に失敗します。
それを解決するためには増やした数だけループを回して同じフィールド名に格納された配列から取得してくる必要があります。

<?php 
  $fields = get_post_custom(71);

  //増える項目のlengthを取得してループ回数を決めます。
  for ($i=0,$len = count($fields['入力したタイトル']); $i < $len; $i++):
?>
<div class="post_box">
  <a href="<?php echo $fields['入力したURL'][$i]; ?>" <?php if($fields['別ウィンドウ表示'][$i]){echo 'target="_blank"';} ?>>
    <?php 
      $_img = $fields['登録した画像'][$i];
      $img_url = wp_get_attachment_image_src($_img,'full');
      $img_tag = '<img src="'.$img_url[0].'">';
      echo $img_tag;
    ?>
    <h3><?php echo mb_strimwidth($fields['入力したタイトル'][$i], 0, 60, "...", "UTF-8" );  ?></h3>
  </a>
</div>
<?php 
  endfor;
?>

注意点としては、投稿者がフィールドを増やした場合はこれで大丈夫なんですが、投稿者がフィールドをひとつしか使わなかった場合はフィールド名は配列じゃなく単なる値となるため上記の書き方だと上手くいきません。
なので実際に使う際は、そういう場合に備えて分岐を追加しておくと良いと思います。

if(count($fields['入力したタイトル']) < 2){
  //フィールドを増やさなかった場合
}else{
  //フィールドを増やした場合
}
エンジニアのためのWordPress開発入門