web-dev-qa-db-ja.com

フロントエンドから画像をアップロードしてメディアライブラリに保存する方法

私はプラグインに取り組んでいます。フロントエンドから画像をアップロードしたい、すなわちinput type="file"。私はそれのためにグーグルの多くをしましたが、画像をアップロードすることができませんでした。

<form method="post" action="options.php">
  <input type="file" name="my_image_upload" id="my_image_upload"   multiple="false" />
  <input type="hidden" name="post_id" id="post_id" value="55" />
  <?php wp_nonce_field( 'my_image_upload', 'my_image_upload_nonce' ); ?>
  <input id="submit_my_image_upload" name="submit_my_image_upload" type="submit" value="Upload" />
 </form>

<?php

if ( 
    isset( $_POST['my_image_upload_nonce'], $_POST['post_id'] ) 
    && wp_verify_nonce( $_POST['my_image_upload_nonce'], 'my_image_upload' )
    && current_user_can( 'edit_post', $_POST['post_id'] )
) {
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );
    $attachment_id = media_handle_upload( 'my_image_upload', $_POST['post_id'] );

    if ( is_wp_error( $attachment_id ) ) {
        // There was an error uploading the image.
    } else {
        // The image was uploaded successfully!
    }

} else {

    // The security check failed, maybe show the user an error.
}
function wp_verify_nonce_X($nonce, $action = -1) {
        return true;
        $user = wp_get_current_user();
        $uid = (int) $user->id;
        $i = wp_nonce_tick();
        if ( substr(wp_hash($i . $action . $uid, 'nonce'), -12, 10) == $nonce )
            return 1;
        if ( substr(wp_hash(($i - 1) . $action . $uid, 'nonce'), -12, 10) == $nonce )
            return 2;
        // Invalid nonce
        return false;
    }
After implementing this code  I get thiserror 
Fatal error: Call to undefined function wp_verify_nonce() in /home/projectdemos/public_html/WP-Team-Showcase/wp-content/plugins/wp-team-showcase/team.php on line 435

私はこのエラーをグーグルし、それを通して発見された全ての可能な解決策を実行するが、それを解決することができなかった。このコード以外に解決策がある場合は、画像をアップロードして保存する方法を教えてください。

2
raxa

今私は私自身の質問に対する答えを持っています。私はこのコードを使用してこの問題を解決しました。

<input type="file" name="my_file_upload" id="my_file_upload_id" class="bg_checkbox"  >

function register_team_show_case_setting() {
//register our settings
    register_setting('my_team_show_case_setting', 'my_file_upload');
}
add_action('admin_init', 'register_team_show_case_setting');

画像をアップロードして保存するためのコード:

require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attach_id = media_handle_upload('my_file_upload', $post_id);
if (is_numeric($attach_id)) {
    update_option('option_image', $attach_id);
    update_post_meta($post_id, '_my_file_upload', $attach_id);
}

画像コードを表示

echo wp_get_attachment_url(get_option('option_image'));
3
raxa

WordPressが完全にロードされる前にWordPress関数を呼び出します。これを直す簡単で汚い方法は追加することです

require_once(ABSPATH .'wp-includes/pluggable.php');

プラグインファイルの先頭にあるので必要な機能があります。

これを解決するためのより良いそして正しい方法はWordPressが利用可能なフックの1つを使って行われるまであなたのコードで待つことです

add_action( 'init', 'wpse_228301' );

または

add_action( 'wp_loaded', 'wpse_228301' );