質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

Wordpressのフック「save_post」が機能せず、値が「存在しない」状態になってしまう問題について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 888

maronica

score 16

実現したいこと

Wordpressで下記の「該当のソースコード」を使って記事にカスタムフィールドを保存しています。

しかし、値が未入力のときに、値が「存在しない」まま記事が投稿されてしまいます。

たとえば「fierd1」に「あ」と入力すれば「あ」の情報が入りますが、何も入力しないと記事の情報に「fierd1」自体が存在しないのです。

その記事のページで<?php var_export( get_post_meta( $post->ID ) ) ; ?>を書いても「fierd1」が存在しないということです。

そこでお聞きしたいのですが、何も入力しなくても「fierd1」が「存在しない」ではなく「空」になって欲しいのですが、そういう場合では下記の「該当のソースコード」をどうすべきなのか、分かる人はいらっしゃいますでしょうか?

該当のソースコード

/*
    カスタムフィールドの追加
====================================*/
add_action( 'admin_menu', 'add_meta_field' );
function add_meta_field() {
    add_meta_box( 'fierd1', 'fierd1', 'create_fierd1', 'custompost', 'normal' );
}

function create_fierd1() {
    $keyname = 'fierd1';
    global $post;
    // 保存されているカスタムフィールドの値を取得
    $get_value = get_post_meta( $post->ID, $keyname, true ); 
    // nonceの追加
    wp_nonce_field( 'action-' . $keyname, 'nonce-' . $keyname );
    // HTMLの出力
    echo '<input name="' . $keyname . '" value="' . $get_value . '" style="width: 100%;">';        
}


/*
    カスタムフィールドの保存
====================================*/
add_action( 'save_post', 'save_meta_field' );
function save_meta_field( $post_id ) {
    $custom_fields = ['fierd1'];
    foreach( $custom_fields as $d ) {
            if ( isset( $_POST['nonce-' . $d] ) && $_POST['nonce-' . $d] ) {
                    if( check_admin_referer( 'action-' . $d, 'nonce-' . $d ) ) {
                            if( isset( $_POST[$d] ) && $_POST[$d] ) {
                                    update_post_meta( $post_id, $d, $_POST[$d] );
                            } else {
                                    delete_post_meta( $post_id, $d, get_post_meta( $post_id, $d, true ) );
                            }
                    }
            }
    }
}

試したこと

フックに「'save_post'」でなく「'wp_insert_post_data'」を使うという手もあるかと思いますが、これはなしでお願いしたいです。

環境

Wordpressのバージョンは最新の5.0.3です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

とりあえず、フォームが不明ですが。

if ( isset( $_POST['nonce-' . $d] ) && $_POST['nonce-' . $d] ) {
  if( check_admin_referer( 'action-' . $d, 'nonce-' . $d ) ) {
    if( isset( $_POST[$d] ) && $_POST[$d] ) {
      update_post_meta( $post_id, $d, $_POST[$d] );
    } else {
      delete_post_meta( $post_id, $d, get_post_meta( $post_id, $d, true ) );
    }
  }
}

と記載しているので、 $_POST['fierd1'] が存在しない場合や $_POST['fierd1'] が、 '' や 0 や NULL の場合に delete_post_meta で、カスタムフィールドを削除しているので、カスタムフィールドの項目がなくなると思うのですが...

そこでお聞きしたいのですが、何も入力しなくても「fierd1」が「存在しない」ではなく「空」になって欲しいのですが、そういう場合では下記の「該当のソースコード」をどうすべきなのか、分かる人はいらっしゃいますでしょうか?

カスタムフィールドを削除するのではなく、値を空欄にするということであれば、

delete_post_meta( $post_id, $d, get_post_meta( $post_id, $d, true ) );

の様に削除するのではなくて、

update_post_meta( $post_id, $d, '' );

の様に '' (空文字)で更新する感じでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/23 15:33

    ありがとうございます。よくわからないまま使っておりました。

    フォームは普通にダッシュボードの投稿編集画面に作ったテキストボックスになります。

    あと、「リビジョンまたは自動保存だったらなにもしない」という機能を追加しようと思ったのですが、このような書き方ではありませんでしょうか?

    /*
    カスタムフィールドの保存
    ====================================*/
    add_action( 'save_post', 'save_meta_field', 10, 2);
    function save_meta_field( $post_id, $post ){

    // リビジョンまたは自動保存だったらなにもしない
    if(wp_is_post_autodraft($post) || wp_is_post_revision){
    return;
    }

    // あとは同じ

    キャンセル

  • 2019/02/25 10:46 編集

    おそらく、その書き方で問題ないと思いますが、何か問題が出ていますか?

    キャンセル

  • 2019/02/27 08:09

    はい。ただ長くなりそうですし、今回の問題は解決したのでまた別の質問とさせていただこうかと思います。ありがとうございました。

    キャンセル

+1

delete_post_metaしなければ済む話し

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/23 15:29

    ありがとうございます。そのようでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • Wordpressのフック「save_post」が機能せず、値が「存在しない」状態になってしまう問題について