Exportar información de usuario a CSV – Columna adicional

4 minutos de lectura

avatar de usuario
Jeremi Liwanag

Estoy usando el complemento ‘Exportar usuarios a CSV’ para wordpress. De forma predeterminada, el complemento solo extrae wp_users y wp_usermeta

He querido agregar la columna post_title de wp_posts. Pude sacar el ‘post_title’ en el archivo CSV PERO no está colocado correctamente en su fila respectiva.

Por favor, vea mi código editado y el código original

Versión original:

global $wpdb;
$data_keys = array(
    'ID', 'user_login', 'user_pass',
    'user_nicename', 'user_email', 'user_url',
    'user_registered', 'user_activation_key', 'user_status',
    'display_name'
);
$meta_keys = $wpdb->get_results( "SELECT distinct(meta_key) FROM $wpdb->usermeta" );
$meta_keys = wp_list_pluck( $meta_keys, 'meta_key' );
$fields = array_merge( $data_keys, $meta_keys);

$headers = array();
foreach ( $fields as $key => $field ) {
    if ( in_array( $field, $exclude_data ) )
        unset( $fields[$key] );
    else
        $headers[] = '"' . strtolower( $field ) . '"';
}
echo implode( ',', $headers ) . "\n";

foreach ( $users as $user ) {
    $data = array();
    foreach ( $fields as $field ) {
        $value = isset( $user->{$field} ) ? $user->{$field} : '';
        $value = is_array( $value ) ? serialize( $value ) : $value;
        $data[] = '"' . str_replace( '"', '""', $value ) . '"';
    }
    echo implode( ',', $data ) . "\n";
}

Versión editada

global $wpdb;

$data_keys = array(
    'ID', 'user_login', 'user_pass',
    'user_nicename', 'user_email', 'user_url',
    'user_registered', 'user_activation_key', 'user_status',
    'display_name'
);
$meta_keys = $wpdb->get_results( "SELECT distinct(meta_key) FROM $wpdb->usermeta" );
$meta_keys = wp_list_pluck( $meta_keys, 'meta_key' );
$post_keys = $wpdb->get_results( "SELECT distinct(post_title) FROM $wpdb->posts" );
$post_keys = wp_list_pluck( $post_keys, 'post_title' );
$fields = array_merge( $data_keys, $meta_keys, $post_keys);

$headers = array();
foreach ( $fields as $key => $field ) {
    if ( in_array( $field, $exclude_data ) )
        unset( $fields[$key] );
    else
        $headers[] = '"' . strtolower( $field ) . '"';
}
echo implode( ',', $headers ) . "\n";

foreach ( $users as $user ) {
    $data = array();
    foreach ( $fields as $field ) {
        $value = isset( $user->{$field} ) ? $user->{$field} : '';
        $value = is_array( $value ) ? serialize( $value ) : $value;
        $data[] = '"' . str_replace( '"', '""', $value ) . '"';
    }
    echo implode( ',', $data ) . "\n";
}

Espero que mi explicación no sea confusa. ¡Salud!

Aquí hay una imagen para explicarlo mejor:

https://www.dropbox.com/s/xijkb4fp16atcx3/question-jpeg.jpg?dl=0

avatar de usuario
CarlosRobles

El problema es que estás usando la lista de títulos como columnas, ya que wp_list_pluck no conserva el nombre de la columna post_title.

El enfoque sería diferente si desea usar solo una publicación de título por usuario, o si desea más, especialmente porque el nombre de la columna cambiará.
Suponiendo que los quiere todos, podemos crear un enfoque simple que puede mejorar.

Por ejemplo, diría.

Primero, elimina estas dos líneas.

$post_keys = $wpdb->get_results( "SELECT distinct(post_title) FROM $wpdb->posts" );
$post_keys = wp_list_pluck( $post_keys, 'post_title' );

y cambio $fields = array_merge( $data_keys, $meta_keys, $post_keys);por $fields = array_merge( $data_keys, $meta_keys, $post_keys);

Entonces, antes

 echo implode( ',', $data ) . "\n";

añades

$post_keys = $wpdb->get_results( "SELECT distinct(post_title) FROM $wpdb->posts  WHERE (post_type LIKE 'page' OR post_type LIKE 'post') and post_status LIKE 'publish' AND post_author = ". $user->ID );
$post_titles = wp_list_pluck( $post_keys, 'post_title');
$data =array_merge ($data, $post_titles);

Con esto, los encabezados de las columnas para los títulos de las publicaciones no se configurarán, podemos mejorarlo para configurarlo si lo necesita, pero ya debería tener una columna para cada título de la publicación.

  • En realidad, estoy equivocado, su código extrajo los títulos de las publicaciones, pero no están organizados según el usuario. los títulos de las publicaciones aparecieron en celdas horizontales grandes y largas: verifique esto dropbox.com/s/xijkb4fp16atcx3/question-jpeg.jpg?dl=0 al final de la imagen, ese es el diseño de resultados que quiero

    – Jeremi Liwanag

    16 de noviembre de 2015 a las 2:23


  • quitar el " después FROM $wpdb->posts

    – Carlos Robles

    16 de noviembre de 2015 a las 2:50

  • también cambia $fields = array_merge( $data_keys, $meta_keys, $post_keys); por $fields = array_merge( $data_keys, $meta_keys);

    – Carlos Robles

    16 de noviembre de 2015 a las 2:50


  • y también elimine el último “después de post_author = ". $user->ID

    – Carlos Robles

    16 de noviembre de 2015 a las 3:16

  • Continuemos esta discusión en el chat.

    – Jeremi Liwanag

    16 de noviembre de 2015 a las 3:38

¿Ha sido útil esta solución?