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

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

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

976閲覧

[wordPress] 独自のカスタムフィールドのチェックボックスに関して値が複数保持できない

DaisukeMori

総合スコア217

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/05/09 02:40

現在WordPressでACFなどのプラグインを使わずに独自のフォームを作っています。
基本的にはテキスト、テキストエリア、チェックボックス(一個の値)、ラジオボタン、画像のフォームは作ることができました。

できないこと(要件)

チェックボックスの複数値の保持

まずコード全文

php

1<?php 2// functions.php 3 4// カスタムフィールドのメタボックス 5function add_custom_fields() { 6 add_meta_box( 'id', '独自カスタムフィールド(通常投稿)', 'insert_custom_fields', 'post', 'normal'); // postにすると通常投稿に追加 7} 8add_action('admin_menu', 'add_custom_fields'); 9 10// post投稿の入力エリア 11function insert_custom_fields() { 12 global $post; 13 14 // チェックボックス(複数値) 15 if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_a" ) { 16 $is_check_a = 'checked'; 17 } 18 if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_b" ) { 19 $is_check_b = 'checked'; 20 } 21 if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_c" ) { 22 $is_check_c = 'checked'; 23 } 24 echo ' 25 <p>チェックボックス</p> 26 <input type="checkbox" name="custom_checkbox_2" id="check_a" value="check_a" '.$is_check_a.' /> 27 <label for="check_a">check_a</label> 28 <input type="checkbox" name="custom_checkbox_2" id="check_b" value="check_b" '.$is_check_b.' /> 29 <label for="check_b">check_b</label> 30 <input type="checkbox" name="custom_checkbox_2" id="check_c" value="check_c" '.$is_check_c.' /> 31 <label for="check_c">check_c</label> 32 '; 33} 34 35// カスタムフィールドの値を保存 36function save_custom_fields( $post_id ) { 37 if(!empty($_POST['custom_checkbox_2'])) { 38 update_post_meta($post_id, 'custom_checkbox_2', $_POST['custom_checkbox_2'] ); 39 } else { 40 delete_post_meta($post_id, 'custom_checkbox_2'); 41 } 42} 43add_action('save_post', 'save_custom_fields');

このコードでは、値が1つしか保持されません。
例えばcheck_a、check_b、check_cの3つ選択したとしても一番最後のcheck_cしか保持されません。

その後やったこと

phpのcheckboxで複数値を保持させるためにはname属性の名称に[]をつけなければならないと知り、やってみましたが、今度は1個すら保持されません。

name="custom_checkbox_2"name="custom_checkbox_2[]"

php

1// メタボックス設定省略 2 3// post投稿の入力エリア 4function insert_custom_fields() { 5 global $post; 6 7 // チェックボックス(複数値) 8 if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_a" ) { 9 $is_check_a = 'checked'; 10 } 11 if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_b" ) { 12 $is_check_b = 'checked'; 13 } 14 if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_c" ) { 15 $is_check_c = 'checked'; 16 } 17 echo ' 18 <p>チェックボックス</p> 19 <input type="checkbox" name="custom_checkbox_2[]" id="check_a" value="check_a" '.$is_check_a.' /> 20 <label for="check_a">check_a</label> 21 <input type="checkbox" name="custom_checkbox_2[]" id="check_b" value="check_b" '.$is_check_b.' /> 22 <label for="check_b">check_b</label> 23 <input type="checkbox" name="custom_checkbox_2[]" id="check_c" value="check_c" '.$is_check_c.' /> 24 <label for="check_c">check_c</label> 25 '; 26} 27 28// 保存部分省略

現在はここで停滞しております。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

方法は2つあります

  1. 1つの値として配列で保存する
  2. 一つのカスタムフィールドに複数の値を保存する

1のメリットは削除・更新の処理が簡単に書けること、順番を制御しやすいこと
デメリットはmeta_queryなどで使いにくい、使えないことです
2の方がWordPressでは標準的な方法と言えます。

php

1update_post_meta($post_id, 'custom_checkbox_2', $_POST['custom_checkbox_2'] );

inputのnameに[]をつけた上でこのようにすることは1の方法をとっていると言えます。
こうするとcustom_checkbox_2のフィールドに1つの配列の値として保存されます。

なのでget_post_metaは第3引数をtrueにしても配列が返ります。
よって、update_post_metaのところをそのままで1の方法をとるのであれば。

php

1if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_a" ) 23if( in_array("check_a",get_post_meta($post->ID, 'custom_checkbox_2',true))

のようになります。

しかしこの方法をとると先にも述べた通りmeta_queryなどでこのフィールドが使いにくくなります。

2の方法をとるためにはカスタムフィールドの値の更新の処理において
1度delete_post_metaで全部消してから
add_post_metaで一つずつ追加、というような方法を取ります。

php

1update_post_meta($post_id, 'custom_checkbox_2', $_POST['custom_checkbox_2'] ); 23delete_post_meta($post_id, 'custom_checkbox_2'); 4foreach($_POST['custom_checkbox_2'] as $value){ 5  //ついでにここで$valueが不正な値でないか確認をしておくべき 6  add_post_meta($post_id, 'custom_checkbox_2',$value); 7}

比較部分は

php

1if( get_post_meta($post->ID, 'custom_checkbox_2',true) == "check_a" ) 23if( in_array("check_a",get_post_meta($post->ID, 'custom_checkbox_2'))

みたいな感じです。

投稿2022/05/09 03:24

KazuhiroHatano

総合スコア7802

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaisukeMori

2022/05/09 06:28

ありがとうございます。 一旦①の方では実現できました。 in_array("check_a",get_post_meta($post->ID, 'custom_checkbox_2',true) このままだと1個も選択されてない際Warningが出てしまうので in_array('check_a',(array)get_post_meta($post->ID, 'custom_checkbox_2',true) に変更しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問