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

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

ただいまの
回答率

88.82%

wp_insert_post のときに、カスタムフィールドが重複する問題について

解決済

回答 1

投稿

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

chacky

score 16

発生している問題

投稿編集画面でカスタムフィールドが重複します。

画像のように、サイドに作った「言語」のフィールド(赤い部分)と同じ内容が、wp_insert_postによって再度作られてしまう(緑の部分)。という問題が解決できません。

イメージ説明

ソースコード

次のようにして投稿編集画面にカスタムフィールドを表示しています。これは上の画像の赤い部分です。

■functions.php

/*
投稿編集画面にカスタムフィールド
====================================*/
/* 表示 */
add_action( 'admin_menu', 'add_meta_field' );
function add_meta_field() {
        add_meta_box( 'post_meta_language', '言語', 'create_post_meta_language', 'mypost', 'side' );
}
function create_language() {
    $keyname = 'post_meta_language';
    global $post;
    // 保存されているカスタムフィールドの値を取得
    $get_value = get_post_meta( $post->ID, $keyname, true ); 
    // radioの値
    $data = ['ja', 'en']; 
    // nonceの追加
    wp_nonce_field( 'action-' . $keyname, 'nonce-' . $keyname ); 
    // HTMLの出力
    foreach( $data as $d ) {
        $checked = '';
        if( $d === $get_value ) $checked = ' checked';
        echo '<label><input type="radio" name="' . $keyname . '" value="' . $d . '"' . $checked . '>' . $d . '</label>';
    }
}

/* 保存 */
add_action( 'save_post', 'save_meta_field' );
function save_meta_field( $post_id ) {
    $custom_fields = ['post_meta_language'];
    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 ) );
                            }
                    }
            }

    }
}


ここまではいいとして、問題は次のwp_insert_postのときのupdate_post_metaです。このときに上の画像の緑の部分が勝手に生成されてしまい、同じカスタムフィールドが重複するという問題が発生してしまいます。

■single-form.php

$value = array(
    'post_type' => 'mypost',
    'post_author' => get_current_user_id(),
    'post_title' => $new_title,
    'post_content' => $new_content,
    'post_status' => $new_status,
    'tax_input' => array( 'my_tag' => $new_tag_arr ),
);
$id = wp_insert_post($value);
if( ($id) && !is_wp_error($id) ) {    
    update_post_meta($id, 'post_meta_language', $new_meta_language);
}


このカスタムフィールドの重複を回避したいのですが、何かい方法はございませんでしょうか…。
もし良いアイディアがあればご指導よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/02/14 08:40 編集

    同じ投稿IDに同じ名前のキーは複数設定できないのですが、実際のデータも重複しているのでしょうか?

    同じデータを二箇所で、表示しているということはないでしょうか?
    (片方を変更して保存するともう一方も連動して変更されませんか?)

    キャンセル

  • chacky

    2019/02/14 19:05 編集

    連動します。どうやらそういうことみたいですね。

    でもすごく気持ち悪いのが、functions.phpで追加した「言語」(赤い部分)はラジオボタンで作っているのに対して、wp_insert_postで勝手に追加される方(緑の部分)は普通のテキストエリアだということです。

    これじゃ、ラジオボタン以外の内容が入力できてしまうではありませんか!

    キャンセル

  • CHERRY

    2019/02/14 19:09 編集

    functions.php で、定義しているのであれば、remove_meta_box で、カスタムフィールドの入力欄の表示を隠すのはどうでしょうか?

    https://codex.wordpress.org/Function_Reference/remove_meta_box

    キャンセル

  • chacky

    2019/02/14 23:41

    よいですね。remove_meta_box を使います。ありがとうございました。

    キャンセル

回答 1

checkベストアンサー

+1

wp_insert_postは関係ないです。「カスタムフィールド」の項目は記事に関連する全てのカスタムフィールドを列挙するので、同じデータを表示しているだけです。(画面上部「表示オプション」から項目「カスタムフィールド」は非表示に出来ます)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/14 19:03

    ありがとうございます。そういうことでしたらこのままでもいいんですね。

    でも、「カスタムフィールド」と「国」と「言語」というチェックボックスが並列するのっておかしいですよね。「カスタムフィールド」の子階層に「国」と「言語」があるのならともかく。

    あとどうせ表示されるのなら、functions.phpに書いた「function create_language() 」は意味ないですよね。

    なんか気持ちの悪い仕様ですけど、どのような効果が考えられているのでしょうか?

    キャンセル

  • 2019/02/14 20:41

    チェックボックスはご自身で管理画面に追加されたので、そうなっているだけですよ。
    画面上部「表示オプション」から項目「カスタムフィールド」は非表示に出来ます。表示しなければよいだけです。(標準で最初は非表示になっていたはず)

    キャンセル

  • 2019/02/14 23:42

    そういうものでしょうか。ありがとうございます。ひとまず重複ではないとういことで解決です。

    キャンセル

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

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

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