owned mediaウェブ制作に役立つコンテンツを発信中!

WordPressでカスタムフィールドの値を取得して投稿や更新の後に分岐処理を行う

先日、クライアントワークでWordPress案件を行なっていた時に特殊な要件があったので備忘録として残しておきたいと思います。タイトルの通りなのですが、新規投稿や更新時にカスタムフィールドの値を取得して、その値にあわせた分岐処理を行うというものでした。   今回はサンプルとして、特定記事にオススメ投稿という情報を設定できるカスタムフィールドを次のように用意して、チェックをつけて投稿や更新をした場合に、すでにチェック済みの投稿に対して、チェックを外す(つまりチェックが付いている投稿は常に1件のみ)という処理を加えていきたいと思います。 使用プラグイン:Advanced Custom Fields カスタムフィールドタイプ:真 / 偽 カスタムフィールド名:cf_featured_post   チェックボックスで単純にチェックの有無を確認する場合には、カスタムフィールドのタイプを「真 / 偽」を選択することがポイントですね。  
アクションフックの【wp_insert_post】
カスタムフィールドが用意できたら下記のコードを、functions.phpに追記していきます。ここでは先ほど説明した機能要件を満たすコードになっています。まず、この関数は「add_action」で「wp_insert_post」というアクションフックで実行することがポイントになります。   記事の投稿や更新時のアクションフックとしては「save_post」などはポピュラーですが(参考記事「WordPressで寄稿者の投稿レビュー待ちの状態を管理者へメールで通知されるようにする」)その場合ですとカスタムフィールド の値が取得できないようなので、wp_insert_postのフックで実行させる必要があります。そしてコールバック関数の第一引数では投稿IDが取得できるので、これでどの投稿なのかを判別できることが可能になります。 【functions.php】
function resetFeaturedPost( $post_ID ) {
  $featured_posts = get_post_meta( $post_ID, 'cf_featured_post', true );
  if( $featured_posts ) {
    $results = get_posts(
      array(
        'posts_per_page' => -1,
        'meta_key' => 'cf_featured_post',
        'meta_value' => '1',
        'exclude' => $post_ID
      )
    );
    if( $featured_posts === '1' ) {
      foreach( $results as $result ) {
        update_post_meta( $result->ID, 'cf_featured_post', '0' );
      }
    }
  }
}
add_action( 'wp_insert_post', 'resetFeaturedPost', 10, 1 );
  そして「get_post_meta」投稿する記事のカスタムフィールドの値を取得します。その投稿にチェックが入っており対象となる場合には、同じくチェックが入っている他の記事を「get_posts」で全て検索します、ただしこの時に今操作している投稿は除外するようにします。そして検索結果のすべての記事に対して、カスタムフィールドの値を「update_post_meta」で変更、つまりチェックを外していく形にします。こうすることで投稿および更新完了時には、チェックを入れた記事のみが存在するような状態となります。  
  今回は少しマニアックな要件ですが、応用するといろんな場面で活用できそうな気がしますね。あまり聞かない「wp_insert_post」というアクションフックですが、カスタムフィールドの値を取得できるというのは大きな特徴ですので、投稿や更新時に行う処理を実装する場合には、是非覚えておきたいところですね。
  • はてなブックマーク
  • Pocket
  • Linkedin
  • Feedly

この記事を書いた人

Twitter

sponserd

    keyword search

    recent posts

    • Twitter
    • Github
    contact usscroll to top
      • Facebook
      • Twitter
      • Github
      • Instagram