Chapter12 カスタムフィールドの活用

概要と目標 投稿に任意のフィールドを追加し、
便利な活用方法を学習しよう。

WordPressには、投稿画面に任意のフィールドを追加する、
カスタムフィールドという仕組みがある。
このカスタムフィールドの使い方や便利なプラグインの使い方を学習しましょう。

今回のゴール

RERUN

カスタムフィールドとは任意のフィールドを、
投稿画面に追加する。

WordPressの投稿画面に、任意のフィールドを追加することができる。
フィールドを表示するには、get_post_meta() 関数で取得し表示することができる。

get_post_meta()(ゲット ポスト メタ)関数 ・・・ 特定の投稿の特定のキーからカスタムフィールドの値を取得する関数
get_post_meta(投稿ID, カスタムフィールドのキー, 単一のカスタムフィールドの値を取得するか?)
                                        省略可

単一のカスタムフィールドの値を取得するか? :  true(する) / false(複数のカスタムフィールドの配列を取得)【初期値】

引数の詳細はWordPress Codex 日本語版を参照

カスタムフィールドを使ってみよう。

  1. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  2. 任意の投稿の編集画面を表示する
  3. 「カスタムフィールド」を表示する
    (「︙[ツールと設定をさらに非表示] ・・・ ①」 › 「オプション ・・・ ②」 › 「カスタムフィールド ・・・ ③」)
ブラウザでの表示例
  1. カスタムフィールドのキー(左)に「post_views」と入力
  2. カスタムフィールドのキー(右)に「1」と入力
ブラウザでの表示例
  1. 「更新」ボタンをクリック
  2. 「dummy」 › 「single.php」をテキストエディタで開く
  3. 下記を参考にカスタムフィールドを表示するコードを記述
dummy/single.php
<h1 class="p-article__title -detail"><?php the_title(); ?></h1>
<p class="p-article__text">閲覧数:<?php echo esc_html(get_post_meta($post->ID , 'post_views' ,true) ); ?></p>
<?php if ( has_post_thumbnail()) : ?>
<figure class="p-article__eyecatch">
  <?php the_post_thumbnail(); ?>
</figure>
<?php endif; ?>
  1. 上書き保存
ブラウザでの表示例

RERUN

投稿画面には表示しないカスタムフィールド
カスタムフィールドは基本的には管理画面から編集できるのが一般的だが、管理画面からユーザーによって編集されては困る場合は、カスタムフィールド隠すことができる。
その場合は、カスタムフィールドのキー「_ (アンダースコア)」から始めればよい。

記事の閲覧数をカウントページを開くたびに
閲覧数を自動でアップデートする。

カスタムフィールドを活用すれば、記事の閲覧数をカウントすることができる。
カスタムフィールドの値を自動的に更新する場合は、update_post_meta()という関数を使えばいい。
また、この閲覧数は、ユーザーが編集する必要は特にないので、カスタムフィールドのキーは「_(アンダースコア)」から始める。

update_post_meta()(アップデート ポスト メタ)関数 ・・・ 指定した投稿に存在するカスタムフィールドの値を更新する関数
update_post_meta(投稿ID, カスタムフィールドのキー, 更新する値, 更新前の値(同じキーをもつ他のカスタムフィールドと区別するため))
                                                                     省略可

引数の詳細はWordPress Codex 日本語版を参照

記事の閲覧数をカウントしてみよう

記事の閲覧数は記事を表示するたびにカウントすればいいので、「functions.php」に「get_post_status()」を使って、公開されている記事かを確認して、さらに「is_single()」を使って、記事個別ページの時のみ、現在の閲覧数に「1」を足した数字にカスタムフィールドを更新すればよい。

  1. 「dummy」 › 「functions.php」をテキストエディタで開く
  2. 下記を参考に閲覧数をカウントするコードを記述
dummy/functions.php
/*======================================
  閲覧数のカウント
======================================*/
function update_post_views() {
  global $post; // $post にアクセスできるようにする

  // 公開されている記事でかつ、個別投稿ページの場合
  if ('publish' === get_post_status($post) && is_single()) {
    // 現在の閲覧数を整数値で取得
    $views = intval(get_post_meta($post->ID, '_post_views', true));

    // 現在の閲覧数に「1」を加えた値で更新
    update_post_meta($post->ID, '_post_views', ($views + 1));
  }
}
add_action('wp_head', 'update_post_views');
  1. 上書き保存
  2. 「dummy」 › 「single.php」をテキストエディタで開く
  3. 閲覧数を表示する「キー」を変更する
dummy/single.php
<p class="p-article__text">閲覧数:<?php echo esc_html(get_post_meta($post->ID , '_post_views' ,true) ); ?></p>
  1. 上書き保存
  2. サイトにアクセス
    http://localhost/wp-lesson/
  3. 閲覧数が増えているかを確認する
ブラウザでの表示例

RERUN


Advanced Custom Field複雑なカスタムフィールドは、
このプラグインにおまかせ。

サイトの規模が大きるなると、独自のカスタムフィールドを使いたくなることがある。
テキストフィールドなどの簡単なカスタムフィールドであれば、add_meta_box()という関数を使えば、比較的容易に実装できる。
だが、画像のアップロード機能など複雑なカスタムフィールドになれば、少々高度な開発になる。
あまりプラグインを多用したくない派の僕だが、複雑なカスタムフィールドを作る際は、「Advanced Custom Field」というプラグインが便利。

Advanced Custom Fieldを
インストールしてみよう。

  1. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  2. 「プラグイン」 › 「新規追加」 をクリック
  3. 「Advanced Custom Fields」を検索しインストール後 有効化
ブラウザでの表示例

カスタムフィールドを設定してみよう。

  1. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  2. サイドバーの「カスタムフィールド」をクリック
  3. 「新規追加」をクリック
  4. フィールドグループ名を「ポートフォリオ」と入力
  5. 「フィールドを追加」クリック
  6. 下記の様に項目を設定する
    項目 設定
    フィールドラベル クライアント名
    フィールド名 client
    フィールドタイプ テキスト
    説明 クライアントの名前
ブラウザでの表示例
  1. 「位置」の「ルール」を
    投稿タイプ」「等しい」「制作実績」にする
ブラウザでの表示例
  1. 「公開」をクリック

制作実績のカスタムフィールドを
入力してみよう。

  1. 管理画面にアクセス
    http://localhost/wp-lesson/wp-admin/
  2. 「制作実績」 › 「Dummy Coding Factory」をクリック
  3. 「ポートフォリオ」の「クライアント名」に「株式会社ダミー」と入力
  4. 「更新」ボタンをクリック
ブラウザでの表示例

the_field()とget_field()Advanced Custom Fieldを表示する
テンプレートタグがある。

Advanced Custom Fieldで入力された値を表示する際は、
それ用のテンプレートタグがある。
画面に表示する場合は the_field() を使い、取得する場合はget_field()を使う。

主なAdvanced Custom Fieldのテンプレートタグ
項目 テンプレートタグ
値を表示する the_field( 'フィールド名' )
値を取得する get_field( 'フィールド名' )

詳細はthe_field() や、get_field()を参照

Advanced Custom Fieldの値を
表示してみよう。

  1. 「dummy」 › 「single-works.php」をテキストエディタで開く
  2. 下記を参考に、クライアントを表示する
dummy/single-works.php
<dl class="p-article__metaList">
  <?php if( get_field('client') ): ?>
  <dt>クライアント</dt>
  <dd>
    <?php the_field('client'); ?>
  </dd>
  <?php endif; ?>
  <dt>作成日</dt>
  <dd>
    <time datetime="<?php the_time( DATE_W3C ); ?>" class="p-article__time">
    <?php the_time( get_option( 'date_format' ) ); ?>
  </time>
  </dd>
  1. 上書き保存
  2. サイトにアクセス
    http://localhost/wp-lesson/
  3. 制作実績の個別ページに、「クライアント」が表示されているかを確認
ブラウザでの表示例

RERUN

カテゴリーやタグの管理画面に使う場合の注意点
Advanced Custom Fieldはカテゴリーやタグの登録/編集画面にもフィールドを作成できる。
ただしカテゴリーに追加したカスタムフィールドを出力する際は、the_field()get_field()の第2引数に、カテゴリーなら「category_」の後ろにカテゴリーIDを、カスタムタクソノミーなら、term_」の後ろに、タームのIDを指定する必要がある。
サンプル
<?php the_field('field_name', 'category_123'); ?>
フィールドによる取得項目の違い
Advanced Custom Fieldは、様々なフィールドが作成できるが、取得する値はフィールドによって異なる。
「テキスト」や、「テキストエリア」など、基本的にユーザーがテキストを入力するタイプのフィールドは、値が単一で返ってくるため、そのまま、the_field()で簡単に出力できる。
しかし、「画像」や、「投稿オブジェクト」などの場合は、単一とは限らない。
したがって、どんな値が返ってきているのかを、print_r()などで、確認してから出力するほうがよい。
サンプル
print_r( get_field('image') );

練習問題 今回の理解度をチェック。

サイドバーに閲覧数が多い順に記事を5件並べてみよう。

完成イメージ

RERUN

  1. dummy/sidebar.php
    <aside class="p-widget -light">
      <h2 class="p-widget__title">人気の記事</h2>
      <ul>
        <li><a href="single.html">記事のタイトル</a> <small class="post-date">5 Views</small></li>
        <li><a href="single.html">記事のタイトル</a> <small class="post-date">5 Views</small></li>
        <li><a href="single.html">記事のタイトル</a> <small class="post-date">5 Views</small></li>
        <li><a href="single.html">記事のタイトル</a> <small class="post-date">5 Views</small></li>
        <li><a href="single.html">記事のタイトル</a> <small class="post-date">5 Views</small></li>
      </ul>
    </aside>
  2. 項目 内容
    1ページあたりの表示件数 5件
    公開状況
    post_status
    公開された投稿
    カスタムフィールドのキー _post_views
    並び変えるパラメータ 数値として並び替える
    並び順 昇順
解答例
dummy/sidebar.php
<?php
  $args = [
    'posts_per_page' => 5,
    'post_status' => 'publish',
    'orderby' => 'meta_value_num',
    'meta_key' => '_post_views',
    'order' => 'DESC'
  ];

  $the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : ?>
<aside class="p-widget -light">
  <h2 class="p-widget__title">人気の記事</h2>
  <ul>
  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <small class="post-date"><?php echo esc_html(get_post_meta($post->ID , '_post_views' ,true) ); ?> Views</small></li>
  <?php endwhile; ?>
  </ul>
</aside>
<?php endif; wp_reset_postdata(); ?>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめカスタムフィールドは、
うまく使えばかなり便利。

商品ページなどブログではないコンテンツを投稿する時に便利な、
任意の項目を作成できる機能がカスタムフィールド。

  • カスタムフィールドの値は、get_post_meta()で取得できる
  • カスタムフィールドの値は、update_post_meta()で更新できる
  • 複雑なカスタムフィールドは、Advanced Custom Fieldが便利