将用户信息导出到 CSV - 附加列

Posted

技术标签:

【中文标题】将用户信息导出到 CSV - 附加列【英文标题】:Export User Info into CSV - Additional Column 【发布时间】:2016-02-11 00:38:17 【问题描述】:

我正在使用 'Export Users to CSV' 一个 wordpress 插件。默认情况下,插件只提取 wp_users 和 wp_usermeta

我一直想从 wp_posts 添加 post_title 列。我能够将“post_title”提取到 CSV 文件中,但它没有正确放置在相应的行中。

请看我修改后的代码和原代码

原版:

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";

修改后的版本

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";

我希望我的解释不会令人困惑。干杯!

这里有一张图片可以更好地解释它:

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

【问题讨论】:

【参考方案1】:

问题在于您将标题列表用作列,因为wp_list_pluck 不保留列名称post_title

如果您只想为每个用户使用一个标题帖子,或者您想要更多,则方法会有所不同,特别是因为列的名称会发生​​变化。 假设您想要所有这些,我们可以创建一个您可以改进的简单方法。

例如,我会说。

首先,去掉这两行

$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);by $fields = array_merge( $data_keys, $meta_keys, $post_keys);

那么,之前

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

你添加

$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);

这样,帖子标题的列标题将不会设置,如果您需要,我们可以对其进行改进以设置它,但是每个帖子标题应该已经有一个列

【讨论】:

其实我错了,您的代码确实提取了帖子标题,但它们没有按用户排列。帖子标题出现在一个大而长的水平单元格中:请检查图片末尾的dropbox.com/s/xijkb4fp16atcx3/question-jpeg.jpg?dl=0,这就是我想要的结果布局 删除"之后的FROM $wpdb->posts 也将$fields = array_merge( $data_keys, $meta_keys, $post_keys); 更改为$fields = array_merge( $data_keys, $meta_keys); 并删除最后一个 ." post_author = ". $user->ID 让我们continue this discussion in chat.

以上是关于将用户信息导出到 CSV - 附加列的主要内容,如果未能解决你的问题,请参考以下文章

如何将JavaScript数组信息导出到csv(在客户端)?

将 pcap 数据导出到 csv:时间戳、字节、上行链路/下行链路、额外信息 [关闭]

SQL Server 2012 Management Studio:选择,导出,附加

DataTable未使用最新数据进行更新

当我尝试将任务计划程序中的信息导出到 csv 文件时出现错误:无效的参数/选项 - '>'

使用python批量将匹配行附加到csv文件