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

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

ただいまの
回答率

88.77%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,071

tarou312

score 7

前提・実現したいこと

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/18 14:17 編集

    お返事いただきありがとうございます。
    すみません、当方php等にあまり詳しくなく上記のコードも引用したものをただ組み合わせただけであまり深く理解はしていません。

    どのような質問が適切か判断がつきませんが$metaはどのような方法で定義ができるのでしょうか。

    キャンセル

  • 2017/03/18 14: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/

    キャンセル

  • 2017/03/18 14:52

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

    キャンセル

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

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

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

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