Как загрузить изображение с фронтенда и сохранить в медиа-библиотеке WordPress?
Я работаю над плагином. Мне нужно загрузить изображение с фронтенда через 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
Я искал решение этой ошибки и пробовал все возможные варианты, которые нашел, но не смог решить проблему. Подскажите, как загрузить изображение и сохранить его, или есть ли другое решение помимо этого кода.
Теперь у меня есть ответ на мой собственный вопрос. Я решил эту проблему, используя этот код. Добавляю этот код просто для того, чтобы поделиться и помочь другим, так как он сработал у меня.
<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'));

Вы вызываете функцию WordPress до того, как WordPress полностью загружен. Быстрое, но не самое правильное решение — добавить
require_once(ABSPATH .'wp-includes/pluggable.php');
в начало файла вашего плагина, чтобы необходимые функции стали доступны.
Лучший и правильный способ решить эту проблему — дождаться завершения загрузки WordPress, используя один из доступных хуков:
add_action( 'init', 'wpse_228301' );
или
add_action( 'wp_loaded', 'wpse_228301' );

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

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

Я загрузил изображение с помощью этого кода <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
. Можете подсказать как это сделать?

Вы должны создать новую запись, чтобы избежать беспорядка, так как эта проблема решена, но вы сохраняете её как метаданные записи "_my_file_upload", чтобы можно было получить её на фронтенде, извлекая эти метаданные:
$attachment = get_post_meta( get_the_ID(), '_my_file_upload' );

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

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

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

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

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