¿Cómo subir imágenes desde el front-end y guardarlas en la biblioteca de medios?
Estoy trabajando en un plugin. Quiero subir imágenes desde el front-end, es decir mediante input type="file"
. He buscado mucho en Google pero no he podido subir la imagen. Aquí está mi código para subir imágenes
<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="Subir" />
</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 ) ) {
// Hubo un error al subir la imagen.
} else {
// ¡La imagen se subió correctamente!
}
} else {
// La verificación de seguridad falló, tal vez mostrar un error al usuario.
}
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 inválido
return false;
}
Después de implementar este código obtengo este error
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
He buscado este error en Google y probado todas las posibles soluciones que encontré, pero no pude resolverlo. Díganme cómo subir la imagen y guardarla, si hay otra solución además de este código.
Ahora tengo una respuesta para mi propia pregunta. Resolví este problema usando este código. Agrego este código solo para compartir y ayudar a otros ya que a mí me funcionó.
<input type="file" name="my_file_upload" id="my_file_upload_id" class="bg_checkbox" >
function register_team_show_case_setting() {
//registrar nuestras configuraciones
register_setting('my_team_show_case_setting', 'my_file_upload');
}
add_action('admin_init', 'register_team_show_case_setting');
Código para subir y guardar imagen:
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);
}
Código para mostrar la imagen
echo wp_get_attachment_url(get_option('option_image'));

Estás llamando a una función de WordPress antes de que WordPress esté completamente cargado. Una forma rápida y poco elegante de solucionar esto es agregar
require_once(ABSPATH .'wp-includes/pluggable.php');
al principio de tu archivo de plugin para que tenga las funciones necesarias.
Una mejor y correcta forma de resolver esto es esperar a que WordPress termine de cargar usando uno de los hooks disponibles:
add_action( 'init', 'wpse_228301' );
o
add_action( 'wp_loaded', 'wpse_228301' );

después de usar require_once(ABSPATH .'wp-includes/pluggable.php');
al principio el error desapareció pero no se suben imágenes a la biblioteca multimedia

Te recomiendo encarecidamente que desarrolles el plugin como debería ser, así que utiliza los hooks de acción init o wp_loaded para inicializar el plugin. De esa manera todas las funciones de WordPress estarán disponibles para ti. La forma en que lo estás manejando ahora con la inclusión de archivos funciona en la mayoría de los casos pero definitivamente no es la forma correcta de hacerlo. Además, mi objetivo era eliminar tu mensaje de error, no revisé todo tu código así que si el error que tenías desapareció, alguna otra parte de tu código no está funcionando correctamente.

He subido una imagen usando este código <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 );
}
?>
en mi archivo team.php
. Ahora quiero mostrarla en el archivo post-type.php
. ¿Puedes decirme cómo mostrarla?

Deberías crear una nueva publicación para esto y evitar el desorden, ya que este problema está resuelto, pero lo guardas como meta del post "_my_file_upload" para que puedas recuperarlo en el front-end obteniendo ese meta del post:
$attachment = get_post_meta( get_the_ID(), '_my_file_upload' );

$attachment = get_post_meta( get_the_ID(), '_my_file_upload' );
me devuelve un array vacío

Esto no va a funcionar en los comentarios. Por favor, abre un nuevo tema para esto :)

Una vez más, por favor crea un nuevo tema con suficiente información para que yo y otras personas podamos tener un post adecuado con el que trabajar.

Continuemos esta discusión en el chat.
