Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

[SOLUCIONADO] Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Estas en el tema de Procesar archivos subidos en WordPress (desde plugin en desarrollo) en el foro de WordPress en Foros del Web. Hola, estoy desarrollando mi primer plugin para WordPress. Basicamente el plugin deberia permitir que se suba un fichero con extension CSV, parsear el contenido de ...
  #1 (permalink)  
Antiguo 09/06/2014, 13:08
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Hola, estoy desarrollando mi primer plugin para WordPress. Basicamente el plugin deberia permitir que se suba un fichero con extension CSV, parsear el contenido de dicho fichero e instertar los datos obtenidos en una tabla de la BD de WordPress. Despues de haber leido y leido mucha documentacion, aun me quedan muchas dudas al respecto del desarrollo de plugin para WP por lo cual segui estos pasos para crear el plugin:
  • Crear dos archivos frequent-traveler.php donde deberia estar toda la logica del plugin y ft_admin.php donde esta la parte de la vista
  • Este es el codigo que tengo dentro del archivo frequent-traveler.php:

Código PHP:
// Create database tables and some others
function frequent_traveler_activation()
{

}

register_activation_hook(__FILE__'frequent_traveler_activation');

// Deletes database tables and some others
function frequent_traveler_deactivation()
{

}

register_deactivation_hook(__FILE__'frequent_traveler_deactivation');

function 
frequent_traveler_admin_actions()
{
add_options_page("Frequent Traveler Configuration""Frequent Traveler Config"'manage_options'"ftconfig""frequent_traveler_admin");
}

add_action('admin_menu''frequent_traveler_admin_actions');

function 
frequent_traveler_admin()
{
include(
'ft_admin.php');
}

if (!empty(
$_POST) && isset($_POST['uploadfile_btn']) && check_admin_referer('name_of_my_action''wpnf_ft')) {
echo 
"entre";
}
else {
echo 
"Error";

Y esto lo que tengo dentro de ft_admin.php:

Código PHP:
<?php
wp_enqueue_script
('jquery-ui-datepicker');
wp_enqueue_style('jquery-style''http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css');

?>

<div class="wrap">
<?php echo "<h2>" __('Frequent Traveler Configuration') . "</h2>"?>
<form name="frequent_traveler_form" method="post" action="<?php echo str_replace('%7E''~'$_SERVER['REQUEST_URI']); ?>">
<input type="hidden" name="frequent_traveler_hidden" value="Y">
<?php echo "<h4>" __('Common Settings') . "</h4>"?>
<p>
<?php _e("Default Conversion Value: "); ?><input type="text" name="ft_default" value="<?php echo $ft_default?>" size="5">
<?php _e("From Date: "); ?><input type="text" id="frequent_traveler_from_date" name="frequent_traveler_from_date" value="<?php echo $frequent_traveler_from_date ?>" class="datepicker" />
<?php _e("To Date: "); ?><input type="text" id="frequent_traveler_to_date" name="frequent_traveler_to_date" value="<?php echo $frequent_traveler_to_date?>" class="datepicker" />
</p>
<input type="submit" class="button-primary" name="Submit" value="<?php _e('Save Values'?>" />
</form>
<hr/>
<?php ?>
<h2><?php echo __('Upload file to import'?></h2>
<form name="uploadfile" id="uploadfile_form" method="POST" enctype="multipart/form-data" action="<?php echo str_replace('%7E''~'$_SERVER['REQUEST_URI']) . '/uploadfile'?>" accept-charset="utf-8" >
<?php wp_nonce_field('name_of_my_action''wpnf_ft'); ?>
<p><?php echo __('Select file to upload'?><input type="file" name="uploadfiles[]" id="uploadfiles" size="35" class="uploadfiles" /><p>
<input class="button-primary" type="submit" name="uploadfile_btn" id="uploadfile_btn" value="<?php echo __('Upload & Process'?>" />
</form>
</div>

<script>
jQuery(document).ready(function() {
jQuery('.datepicker').datepicker({
dateFormat: 'dd/mm/yy'
});
});
</script>
Como deben haber notado estoy tratando de validar el archivo subido con el siguiente codigo:

Código PHP:
if (!empty($_POST) && isset($_POST['uploadfile_btn']) && check_admin_referer('name_of_my_action''wpnf_ft')) {
echo 
"entre";
}
else {
echo 
"Error";

Pero siempre obtengo "Error", cual es la razon? Que estoy haciendo mal? Cual es la mejor forma de manejar archivos subidos desde el panel de administracion de WP?
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #2 (permalink)  
Antiguo 09/06/2014, 13:52
Avatar de AlejandroGalvez  
Fecha de Ingreso: noviembre-2013
Mensajes: 189
Antigüedad: 10 años, 5 meses
Puntos: 49
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Editando ***
  #3 (permalink)  
Antiguo 09/06/2014, 14:45
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Nada, sigue sin funcionarme los unicos cambios que hice fueron los siguientes:

Código PHP:
// frequent-traveler.php
echo '<pre>';
var_dump($_POST);
echo 
'</pre>';

if (!empty(
$_POST) && isset($_POST['uploadfile_btn']) && check_admin_referer('wpnf_ft''name_of_my_action')) {
    echo 
"entre";
}
else {
    echo 
"Error";

Código PHP:
//ft_admin.php
<form name="uploadfile" id="uploadfile_form" method="POST" enctype="multipart/form-data" action="<?php echo str_replace('%7E''~'$_SERVER['REQUEST_URI']) . '/uploadfile'?>" accept-charset="utf-8" >
        <?php wp_nonce_field('name_of_my_action''wpnf_ft'); ?>
        <p><?php echo __('Select file to upload'?><input type="file" name="uploadfiles[]" id="uploadfiles" size="35" class="uploadfiles" /><p>
            <input class="button-primary" type="submit" name="uploadfile_btn" id="uploadfile_btn" value="<?php echo __('Upload & Process'?>"  />
    </form>
Alguna idea? Lo que quiero es manejar toda la logica en el archivo frequent-traveler.php pero no lo logro. Que me sugieres?
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #4 (permalink)  
Antiguo 09/06/2014, 16:02
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Alejandro, viste el ultimo comentario que hice? Alguna ayuda al respecto?
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #5 (permalink)  
Antiguo 09/06/2014, 19:27
Avatar de 23r9i0  
Fecha de Ingreso: noviembre-2008
Ubicación: Catalonia
Mensajes: 203
Antigüedad: 15 años, 5 meses
Puntos: 33
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Hola,
Primero te aconsejo usar una class para crear el plugin, yo todos los hago asi y se aconseja.
Leer el codex ¡¡¡Importantisimo!!! No hay que leerlo todo como si fuese un libro pero saber mas o menos que hace cada cosa, y que opcion es mejor para cada cosa. Esto ultimo leyendo el codex lo sabras.

En los form porque tienes en el action request_uri y .../uploadfile ?
Porque pones el name como array en uploadfiles[] ?
Porque quieres dos archivos para hacer este plugin? Una class todo ordenado y todo el contenido.
Porque no usas las funciones, classes, etc... del wordpress como por ejemplo settings fields? Vease Settings API, se llevara mejor que si empiecas hacer cosas por tu cuenta y wordpress tendra mas control sobre el plugin por temas de seguridad.
Y la ultima, Sabes programar?
  #6 (permalink)  
Antiguo 09/06/2014, 19:40
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Podria usar una clase como me aconsejas pero por rapidez y porque no conozco WP a fondo entonces use la forma mas facil y la que muchos comentan por todo Internet soy novato desarrollando para Wordpress.

He leido y releido el CODEX una u otra vez, en ocasiones los ejemplos no son los mas adecuados, dicho por otros y probado por mi mi mejor amigo Google me ha llevado a varias paginas y he probado de todo un poco.
  • "En los form porque tienes en el action request_uri y .../uploadfile ?" -> Ya esto lo quite y deje solo el REQUEST_URI
  • "Porque pones el name como array en uploadfiles[] ?" -> Porque ahora es solo un archivo pero en un futuro, cuando logre que trabaje con un solo archivo, seran multiples por eso el arreglo en el nombre
  • " Porque quieres dos archivos para hacer este plugin? Una class todo ordenado y todo el contenido." -> Por lo que te comente antes de que soy novato ademas que voy contra reloj, despues con mas calma lo pulire y lo hare con clases, cuando aprenda esta parte de WP
  • " Porque no usas las funciones, classes, etc... del wordpress como por ejemplo settings fields? Vease Settings API, se llevara mejor que si empiecas hacer cosas por tu cuenta y wordpress tendra mas control sobre el plugin por temas de seguridad." -> Lo he intentado y al parecer lo estoy haciendo mal, puedo ponerte de ejemplo que ya logre que el formulario funcionara y el fichero aparentemente se suba pero ahora en una simple comprobacion no me quiere funcionar el codigo, quizas no es WP, es PHP o quizas ninguno y soy yo aqui esta el hilo (en ingles)
  • " Y la ultima, Sabes programar? " -> Por supuesto, conozco y programo en Symfony2, Laravel, CodeIgniter, alguna que otra vez en C# y en RoR o sea que la respuesta es SI. La cuestion es que WP con su API interna cambia muchas cosas, las facilita a los "end developers", pero soy mas de echar lineas de codigo duras como por ejemplo usar los componentes de Symfony2 para desarrollar una aplicacion o usar Eloquent el ORM de Laravel y cosas asi
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #7 (permalink)  
Antiguo 09/06/2014, 20:44
Avatar de 23r9i0  
Fecha de Ingreso: noviembre-2008
Ubicación: Catalonia
Mensajes: 203
Antigüedad: 15 años, 5 meses
Puntos: 33
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Hola Reynier,
En mi opinion deberias pararte un momento y pesar, hago las cosas dos veces o una bien, lo de la class es mas bien porque desde hace años es lo que se hace, creo lo dijo el propio WP y yo lo prefiero igual que tambien las hago singleton. Pero puedes hacer un plugin perfectamente sin ellas.

Sobre tu problema en el if el problema esta en que compruebas tanto csv y plain a la vez.
El primero seria false pero el segundo sera true y viceversa.
Código:
$a || $b TRUE si cualquiera de $a o $b es TRUE.
http://es1.php.net/manual/es/languag...rs.logical.php

podrias usar in_array()

Código:
if ( ! in_array( $uploadfiles['type'], array( 'text/csv', 'text/plain' ) ) )
  #8 (permalink)  
Antiguo 09/06/2014, 20:50
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Hola, gracias por tu recomendacion y si, seria mejor no desarrollar dos veces, pero como te dije estoy contra reloj y debo terminar esto, no puedo ponerme a aprender el tema clases dentro de Wordpress. Estoy acostumbrado a la POO dentro de frameworks como los que mencione antes y quizas difiera un poco del estilo WP por la API del mismo, quizas me equivoco pero es lo que he podido observar.

Por otro lado, tienes razon, el problema estaba en la comprobacion, ya funciona. Tema cerrado
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #9 (permalink)  
Antiguo 10/06/2014, 01:57
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Creo que llegué tarde aquí :)
Cita:
Iniciado por reynierpm
no puedo ponerme a aprender el tema clases dentro de Wordpress
Y tampoco es vital. Para un buen comienzo es suficiente con dominar PHP en un nivel medio y paralelamente familiarizarte poco a poco con los recursos de desarrollo disponibles en el software.

Me dio curiosidad saber cómo te quedó el código final, ya que mencionas que "el problema estaba en la comprobación" y asumí que te referías a check_admin_referer(), pero al mismo tiempo no veo la creación de nonce fields en el código posteado.
  #10 (permalink)  
Antiguo 10/06/2014, 05:27
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

Cita:
Iniciado por metacortex Ver Mensaje
Creo que llegué tarde aquí :)
Y tampoco es vital. Para un buen comienzo es suficiente con dominar PHP en un nivel medio y paralelamente familiarizarte poco a poco con los recursos de desarrollo disponibles en el software.

Me dio curiosidad saber cómo te quedó el código final, ya que mencionas que "el problema estaba en la comprobación" y asumí que te referías a check_admin_referer(), pero al mismo tiempo no veo la creación de nonce fields en el código posteado.
Bueno otros dos "" mas sobre el codigo siempre es bienvenido asi que no creo que sea tarde

Ahora bien, como bien comentas no creo que sea vital en este momento ponerme a inventar con clases en WP pues de la forma "comun y corriente" ya me ha dado buenos dolores de cabeza.

El nonce_fields si lo estoy usando, mas creo que no como deberia pues la comprobacion la estoy realizando con wp_verify_nonce() en vez de usar check_admin_referer() que nunca logre que funcionara, observa como quedo el codigo:

Código PHP:
add_action('init''uploadFileImportCSV');

function 
uploadFileImportCSV()
{
    
$wp_error true;
    global 
$wpdb;
    
$nonce = isset($_POST['_wpnonce']) ? $_POST['_wpnonce'] : null;

    if (isset(
$_POST['uploadfile_btn']) && wp_verify_nonce($nonce'wpnf_ft')) {
        
$uploadfiles $_FILES['uploadfiles'];

        if (
is_array($uploadfiles)) {
            foreach (
$uploadfiles['name'] as $key => $value) {
                if (
$uploadfiles['error'][$key] == 0) {

                    
$filetmp $uploadfiles['tmp_name'][$key];
                    
$filename $uploadfiles['name'][$key];

                    
$filetype wp_check_filetype(basename($filename), null);
                    
$filetitle preg_replace('/\.[^.]+$/'''basename($filename));
                    
$filename $filetitle '.' $filetype['ext'];
                    
$upload_dir wp_upload_dir();

                    
$fileCSV 'text/csv';
                    
$fileText 'text/plain';

                    if (!
in_array($filetype['type'], array($fileCSV$fileText))) {
                        echo 
"Error, the file $filename has not a valid mimetype: " $filetype["type"];
                        continue;
                    }

                    
$i 0;
                    while (
file_exists($upload_dir['path'] . '/' $filename)) {
                        
$filename $filetitle '_' $i '.' $filetype['ext'];
                        
$i++;
                    }

                    
$filedest $upload_dir['path'] . '/' $filename;

                    if (!
is_writeable($upload_dir['path'])) {
                        echo 
'Unable to write to directory %s. Is this directory writable by the server?';
                        return;
                    }

                    if (!
move_uploaded_file($filetmp$filedest)) {
                        echo 
"Error, the file $filetmp could not moved to : $filedest ";
                        continue;
                    }
                }
            }
        }

        
// Process the uploaded file
        
$csv array_map('str_getcsv'file($filedest));
    }

PD: Enviame un PM para agregarnos a Hangouts ya que estamos por aca por Caracas ambos
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com
  #11 (permalink)  
Antiguo 10/06/2014, 21:55
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

En tu archivo ft_admin.php busca esta línea:

Código HTML:
Ver original
  1. <input type="hidden" name="frequent_traveler_hidden" value="Y">

Agrega debajo:

Código PHP:
Ver original
  1. <?php $nonce = wp_create_nonce( 'validar-' . $post_id ); ?>
  2. <input type="hidden" name="mi_validacion" value="<?php echo $nonce ?>">

En el archivo php donde recibes la info del formulario necesitas comprobar el nonce field enviado desde el nuevo input (en este sentido ibas por buen camino al principio):

Código PHP:
Ver original
  1. function donde_recibo_la_info_del_formulario($post_id = null) {
  2.     if ( isset($_POST['mi_validacion']) && check_admin_referer('mi_validacion', 'validar-' . $post_id) ) {
  3.  
  4.         // Etc...
  5.  
  6.     } else
  7.         exit('No tienes permisos para realizar esta acción');
  8.  
  9.     return false;
  10. }

(Recuerda darle un valor a $post_id donde vayas a aplicar esta función)
  #12 (permalink)  
Antiguo 11/06/2014, 17:04
 
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 140
Antigüedad: 13 años, 1 mes
Puntos: 1
Respuesta: Procesar archivos subidos en WordPress (desde plugin en desarrollo)

@metacortex esto no creo que tenga $post_id pues es un plugin que lo que me debe permitir es subir un archivo en formato csv/txt (separado por comas), parsear el archivo, insertar los resultados en una tabla de la BD y luego listarlos. De todo esto lo unico que me va restando es la parte de listar los registros de la tabla.
__________________
Reynier Perez Mira
Skype: reynierpm
Site: http://www.reynierpm.com

Etiquetas: php, plugin, post, procesar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:54.