web関連

【wordpress】新規投稿したときに最新記事のカスタムフィールドの値を自動入力

2020/10/17
/

新規投稿したときにカスタムフィールドに自動で最新記事と同じ値を初期値として入力するための機能が欲しかった時の備忘録
いちいちコピペすんの面倒だったから作った

アクションフック「save_post」とカスタムフィールドの値が入ってる最新記事を出力するコードを使います

前回作成した備忘録を使います

とりあえずコード
(カスタム投稿「study」のカスタムフィールド「article_link」の値が入ってる投稿の値を取得して新規投稿のカスタムフィールドに値を入れるコード)

function my_hook( $post_id, $post, $update ) {
  if($update == false) {// 新規投稿のみ
    if (  get_post_type( $post_id )=='study' ) { //カスタム投稿studyの投稿の時
      $cf_key = "article_link";

      // カスタムフィールドに値がある一番新しい記事を取得
      $posts = get_posts(
        array(
          'post_type' => 'study',
          'posts_per_page' => 1,
          'meta_query' => array(
            array(
              'key' => $cf_key,
              'value' => '',
              'compare' => '!='
            )
          )
        )
      );
      // 一番新しい記事のカスタムフィールドの値を取得
      $url = get_post_meta($posts[0]->ID, $cf_key, true);
      // カスタムフィールドに値を入れる
      update_post_meta( $post_id, $cf_key,  $url );
    }
  }
}
add_action( 'save_post', 'my_hook', 10, 3 );

これで、新しく投稿を作ってもいちいちカスタムフィールドの値をコピペしなくて済むね!

データベースから直接取得する方法

せっかくだし、勉強がてら直接SQLで取得する方法調べた

global $wpdb;
$meta_key = "article_link";
$query = $wpdb->prepare("
    SELECT meta_value
    FROM $wpdb->postmeta
    WHERE meta_key = %s
    AND meta_value <> '' -- 値が空文字じゃない時
    /* ↓別パターン:値にhttpsが含まれるとき */
    -- AND $wpdb->postmeta.meta_value LIKE '%https%'
    ORDER BY meta_value LIMIT 1", $meta_key );
$result = $wpdb->get_results( $query );
$url = $result[0]->meta_value;

調べたら$wpdb->get_resultsで取得しないで$wpdb->prepareってのをかましてる記事が多かったので使ってみた

prepare()はプリペアドステートメントと呼ばれるものを使うためのメソッド
このメソッドを使うとプレースホルダーとかいうのが使えて、処理を高速化できるみたい
よくわからんけどみんな使ってるから使ってみた

今回の例で言うとWHERE meta_key = %s%sに文字列としてprepareメソッドの第二引数に指定した$meta_keyの値(article_link)が代入されるっポイ
SQL文は一度だけ読んで値だけ変えて使いまわすことで高速化する感じ?

おまけ:SQL文のコメントアウト

SQL文のコメントアウト初めてだったのでメモ

-- コメント
/* コメント */

このブログで英語の勉強で日記を翻訳して備忘録として残してるんだけど、一つの日記を翻訳しきるのに何日も跨ぐのでいちいちカスタムフィールドに翻訳している日記のURL入れるの面倒なので作った