Как загрузить изображение с фронтенда и сохранить в медиа-библиотеке WordPress?

31 мая 2016 г., 11:11:26
Просмотры: 22.3K
Голосов: 2

Я работаю над плагином. Мне нужно загрузить изображение с фронтенда через 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="Загрузить" />
 </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 ) ) {
        // Произошла ошибка при загрузке изображения.
    } else {
        // Изображение успешно загружено!
    }

} else {

    // Проверка безопасности не пройдена, возможно, стоит показать пользователю ошибку.
}
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;
        // Недействительный nonce
        return false;
    }
После реализации этого кода я получаю следующую ошибку:
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

Я искал решение этой ошибки и пробовал все возможные варианты, которые нашел, но не смог решить проблему. Подскажите, как загрузить изображение и сохранить его, или есть ли другое решение помимо этого кода.

0
Все ответы на вопрос 2
1

Теперь у меня есть ответ на мой собственный вопрос. Я решил эту проблему, используя этот код. Добавляю этот код просто для того, чтобы поделиться и помочь другим, так как он сработал у меня.

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

function register_team_show_case_setting() {
// регистрируем наши настройки
    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'));
6 июн. 2016 г. 11:14:34
Комментарии

Привет. Как я могу загрузить несколько изображений, используя ваш пример?

wpdev wpdev
12 апр. 2018 г. 17:32:56
9

Вы вызываете функцию WordPress до того, как WordPress полностью загружен. Быстрое, но не самое правильное решение — добавить

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

в начало файла вашего плагина, чтобы необходимые функции стали доступны.

Лучший и правильный способ решить эту проблему — дождаться завершения загрузки WordPress, используя один из доступных хуков:

add_action( 'init', 'wpse_228301' );

или

add_action( 'wp_loaded', 'wpse_228301' );
31 мая 2016 г. 15:11:02
Комментарии

После использования require_once(ABSPATH .'wp-includes/pluggable.php'); в начале файла ошибка исчезла, но изображения не загружаются в медиатеку

raxa raxa
31 мая 2016 г. 18:41:14

Настоятельно рекомендую разрабатывать плагин правильно, используя хуки действий init или wp_loaded для инициализации плагина. Так все функции WordPress будут вам доступны. Текущий подход с подключением файлов через require работает в большинстве случаев, но не является правильным решением. Также я помог устранить сообщение об ошибке, но не проверял весь ваш код целиком - если ошибка исчезла, значит проблема в другой части вашего кода.

Jebble Jebble
1 июн. 2016 г. 10:35:32

Я загрузил изображение с помощью этого кода <input type="file" name="my_file_upload" id="my_file_upload"><?php 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_post_meta( $post_id, '_my_file_upload', $attach_id ); } ?> в файле team.php. Теперь мне нужно вывести это изображение в файле post-type.php. Можете подсказать как это сделать?

raxa raxa
1 июн. 2016 г. 11:41:41

Вы должны создать новую запись, чтобы избежать беспорядка, так как эта проблема решена, но вы сохраняете её как метаданные записи "_my_file_upload", чтобы можно было получить её на фронтенде, извлекая эти метаданные:

$attachment = get_post_meta( get_the_ID(), '_my_file_upload' );

Jebble Jebble
1 июн. 2016 г. 12:26:32

$attachment = get_post_meta( get_the_ID(), '_my_file_upload' ); возвращает мне пустой массив

raxa raxa
1 июн. 2016 г. 12:59:55

Это не будет работать в комментариях. Пожалуйста, откройте новую тему для этого :)

Jebble Jebble
1 июн. 2016 г. 13:09:46

Я вставил свой код здесь, пожалуйста, проверьте его http://pastebin.com/mXNC2UMJ

raxa raxa
1 июн. 2016 г. 13:40:14

Еще раз, пожалуйста, создайте новую тему с достаточной информацией, чтобы я и другие люди могли иметь подходящий пост для работы.

Jebble Jebble
1 июн. 2016 г. 14:03:10

Давайте продолжим это обсуждение в чате.

raxa raxa
2 июн. 2016 г. 10:45:04
Показать остальные 4 комментариев