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

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

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

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

Q&A

解決済

1回答

1827閲覧

Wordpressのカスタム投稿の編集画面をカスタマイズしたい(ラジオボタン、チェックボックス、プルダウンボックスの設置)

tarou312

総合スコア7

WordPress

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

0グッド

0クリップ

投稿2017/03/18 03:42

###前提・実現したいこと
Wordpressでプラグインを使わずカスタム投稿の編集画面をカスタマイズしています。
その投稿の編集画面にラジオボタン、チェックボックス、プルダウンボックスを設置したいと考えています。
通常のテキストフィールドは追加できました。

###発生している問題・エラーメッセージ
投稿画面自体にそれぞれのパーツは設置できたのですが、編集後更新をしても保存されず未選択に戻ってしまう。

###該当のソースコード
function.phpに下記の記述を追加しました。

<?php function create_post_type() { register_post_type( 'info', array( 'label' => 'ラベル', 'labels' => array( 'all_items' => 'ラベル一覧', ), 'description' => 'ラベルの紹介です', 'public' => true, 'has_archive' => true, 'menu_position' =>3, 'supports' => array( 'title', 'editor', ), ) ); } add_action( 'init', 'create_post_type' ); function add_my_box() { add_meta_box('info_box', 'ラベル', 'info_box_form', 'info', 'normal', 'high'); } add_action('add_meta_boxes', 'add_my_box'); function info_box_form() { global $post; wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce'); ?> <table> <tr> <th>ラベルタイトル</th> <td><input type="text" name="info_title" value="<?php echo esc_html(get_post_meta($post->ID, 'info_title', true)); ?>" /></td> </tr> <tr> <th>ラベル種類</th> <td><select name="info_select"> <option>選択してください</option> <?php $info_select = array('種類1','種類2','種類3'); foreach($info_select as $key => $val): $check = (isset($meta['info_select'][0]) && $meta['info_select'][0] == $val) ? ' selected="selected"' : ''; ?> <option value="<?php echo $val; ?>"<?php echo $check; ?>><?php echo $val; ?></option> <?php endforeach; ?> </select> </td> </tr> <tr> <th>ラベル有無</th> <td><?php $info_target = array('有','無'); foreach($info_target as $key => $val): $check = ''; if( isset($meta['info_onoff'][0]) && $meta['info_onoff'][0] == $val ): $check = ' checked="checked"'; elseif($key == 0): $check = ' checked="checked"'; endif; ?> <input type="radio" name="info_onoff" id="info_onoff<?php echo $key; ?>" value="<?php echo $val; ?>"<?php echo $check; ?>><label for="info_onoff<?php echo $key; ?>"><?php echo $val; ?></label> <?php endforeach; ?> </td> </tr> </table> <?php } function my_box_save($post_id) { global $post; $my_nonce = isset($_POST['my_nonce']) ? $_POST['my_nonce'] : null; if(!wp_verify_nonce($my_nonce, wp_create_nonce(__FILE__))) { return $post_id; } if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; } if(!current_user_can('edit_post', $post->ID)) { return $post_id; } if($_POST['post_type'] == 'info'){ update_post_meta($post->ID, 'info_title', $_POST['info_title']); update_post_meta($post->ID, 'info_select', $_POST['info_select']); update_post_meta($post->ID, 'info_onoff', $_POST['info_onoff']); } foreach ($mydata as $val) : $data = $_POST[$val]; if(get_post_meta($post_id, $val) == "") add_post_meta($post_id, $val, $data, true); elseif($data != get_post_meta($post_id, $val, true)) update_post_meta($post_id, $val, $data); elseif($data == "") delete_post_meta($post_id, $val, get_post_meta($post_id, $val, true)); endforeach; } add_action('save_post', 'my_box_save'); function save_my_custom_fields( $post_id ) { $mydata = $_POST['info_onoff']; $field_value = get_post_meta($post_id, 'info_onoff', true); if ($field_value == "") add_post_meta($post_id, 'info_onoff', $mydata, true); elseif($mydata != $field_value) update_post_meta($post_id, 'info_onoff', $mydata); elseif($mydata=="") delete_post_meta($post_id, 'info_onoff', $field_value); } add_action('save_post', 'save_my_custom_fields'); function add_custom_column_content($column_name, $id) { if( $column_name == 'info_onoff' ) { $meta = get_post_meta($id, 'info_onoff', true); if( isset($meta) && $meta != '' ) echo esc_html($meta); } } add_action('manage_posts_custom_column', 'add_custom_column_content', 15, 2); ?>

###補足情報(言語/FW/ツール等のバージョンなど)
WordPress 4.7.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっとしか見ていませんが、関数info_box_formの中で $meta が定義されていないのでは?

投稿2017/03/18 04:51

kei344

総合スコア69366

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

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

tarou312

2017/03/18 05:17 編集

お返事いただきありがとうございます。 すみません、当方php等にあまり詳しくなく上記のコードも引用したものをただ組み合わせただけであまり深く理解はしていません。 どのような質問が適切か判断がつきませんが$metaはどのような方法で定義ができるのでしょうか。
kei344

2017/03/18 05:33

それであれば、プラグインを使用されるのが一番安全だと思いますよ。入力部分は意図せずセキュリティホールを作りやすい箇所なので、ある程度有名なプラグインを利用されたほうが良いです。 【ACF | Advanced Custom Fields Plugin for WordPress】 https://www.advancedcustomfields.com/ 【Smart Custom Fields — WordPress Plugins】 https://ja.wordpress.org/plugins/smart-custom-fields/ 【Getting Started - Custom Field Suite】 http://customfieldsuite.com/
tarou312

2017/03/18 05:52

そうですね、セキュリティ上の事も考慮してプラグインでの対応を検討いたします。 わざわざプラグインの情報まで頂きありがとうございます。 こちらを参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問