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

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

ただいまの
回答率

90.23%

アップロード画像の値が保存できない

解決済

回答 1

投稿 編集

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

skipping

score 12

問題question

「Anspress」というプラグインのuser投稿フォームにMedia uploeaderを作成しました。ここで画像選択およびアップロードはできるものの、その値が投稿した記事に保存されません。
下記 functions.php が問題で、それ以外(upload.jsとanslist.php)は大丈夫だと思います。

I am using 「Anspress」.
With this code I can upload the image but can not save it.
The problem is 【functions.php】 part.

コードCode

▼【functions.php】

// Select image
function my_media_script(){
   wp_enqueue_media();
}
add_action( 'wp_enqueue_scripts', 'my_media_script' );

// Media uploeader@Anspress askform
function my_custom_question_field( $form ) {
$form['fields']['image'] = array(
  'html' => '<div class="select-img"></div>
  <div method="post">
    <div class="image-upload-wrap">
        <div class="image-preview-wrapper">
            <img id="image-preview-1" src="http://sample.com/wp-content/uploads/2018/08/first-img.jpg">
        </div>
        <input name="" id="upload_image_button-1" type="button" class="button upload_image_button" value="画像を選ぶ">
        <input type="hidden" name="image1" id="image_attachment_id-1" value="">
    </div>
  </div>',
);
return $form;
}
add_filter( 'ap_question_form_fields', 'my_custom_question_field' );

// Save 
function question_mysave( $post_id, $post ) {
global $validate;
if ( empty( $validate ) ) {
return;
}
$fields = $validate->get_sanitized_fields();

update_post_meta( $post_id, 'image', $fields['image'] );
}
add_action( 'ap_processed_new_question', array( $this, 'question_mysave' ), 0, 2 );
add_action( 'ap_processed_update_question', array( $this, 'question_mysave' ), 0, 2 );


▼【upload.js】

jQuery( document ).ready( function( $ ) {
    // Uploading files
    var file_frame;
    var wp_media_post_id = wp.media.model.settings.post.id; // Store the old id
    var set_to_post_id = '<?php echo $my_saved_attachment_post_id; ?>'; // Set this
    jQuery('.upload_image_button').on('click', function( event ){
        event.preventDefault();
        // If the media frame already exists, reopen it.

        btn_id = $(this).attr('id');
        btn_no = btn_id.replace('upload_image_button-' , '');

        if ( file_frame ) {
            // Set the post ID to what we want
            //file_frame.uploader.uploader.param( 'post_id', set_to_post_id );
            // Open frame
            file_frame.open();
            return;
        } else {
            // Set the wp.media post id so the uploader grabs the ID we want when initialised
            //wp.media.model.settings.post.id = set_to_post_id;
        }
        // Create the media frame.
        file_frame = wp.media.frames.file_frame = wp.media({
            title: 'Select a image to upload',
            button: {
                text: 'Use this image',
            },
            multiple: false    // Set to true to allow multiple files to be selected
        });
        // When an image is selected, run a callback.
        file_frame.on( 'select', function() {
            // We set multiple to false so only get one image from the uploader
            attachment = file_frame.state().get('selection').first().toJSON();
            // Do something with attachment.id and/or attachment.url here
            $( '#image-preview-'+btn_no ).attr( 'src', attachment.sizes.thumbnail.url ).css( 'width', 100 );
            $( '#image_attachment_id-'+btn_no ).val( attachment.id );
            // Restore the main post ID
            //wp.media.model.settings.post.id = wp_media_post_id;
        });
            // Finally, open the modal
            file_frame.open();
    });

    // Restore the main ID when the add media button is pressed
    jQuery( 'a.add_media' ).on( 'click', function() {
        //wp.media.model.settings.post.id = wp_media_post_id;
    });

});


▼【anslist.php】

<figure>                
    <?php
    $imageid = get_post_meta($post->ID, 'image1', true);
    $url = wp_get_attachment_url( $imageid );
    echo '<img src="'.$url.'" alt="">';
    ?>                                
</figure>

参考

プラグインページ
https://ja.wordpress.org/plugins/anspress-question-answer/

この問題について示されたページ
https://anspress.io/resources/faq/anspress-form-and-validation-api/

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • namda

    2018/08/10 15:22 編集

    タイトルには「カスタムフィールドの値を保存するメソッドが理解できない」とありますが、問題は「画像アップロードが出来ない」のように見えます。改題するとより回答が得やすくなるでしょう。

    キャンセル

  • skipping

    2018/08/10 15:24

    アップロードはできます。問題はアップロードした画像の値が、当該プラグインの投稿フォームにおいて保存されないことです。とは言えタイトルは仰るとおり分かりにくいですね。ご指摘感謝致します。

    キャンセル

  • namda

    2018/08/10 15:30 編集

    細切れ指摘で申し訳ないですが、より良い回答のためにWordPressのタグも追加してください。

    キャンセル

  • skipping

    2018/08/10 15:35

    かしこまりました。ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

0

下記の $fields['image'] は $fields['image1'] の間違いっぽいですね。

update_post_meta( $post_id, 'image', $fields['image'] );

あと、このままだとバリデーションでエラーが出てしまうかもしれないので、下記のような感じのコードも必要じゃないかなと思います。

function my_ap_ask_fields_validation( $args ) {
    $args['image1'] = array(
        'sanitize' => array( 'only_int' ),
        'validate' => array( 'required' ),
    );

    return $args;
}
add_action( 'ap_ask_fields_validation', 'my_ap_ask_fields_validation' );

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/11 09:53

    できませんでしたけれど、サニタイズとバリデーションが必要だったわけですね!ありがとうございます。もっと内容を簡易にして(画像でなくチェックボックスにして)再質問させて頂きます。

    キャンセル

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

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