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

Jer*_*nag 14 php mysql wordpress wordpress-plugin

我正在使用'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";
}
Run Code Online (Sandbox Code Playgroud)

编辑版

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";
}
Run Code Online (Sandbox Code Playgroud)

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

这是一张更好地解释它的图片:

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

Car*_*les 5

问题是您使用标题列表作为列,因为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' );
Run Code Online (Sandbox Code Playgroud)

并改变$fields = array_merge( $data_keys, $meta_keys, $post_keys);由$fields = array_merge( $data_keys, $meta_keys, $post_keys);

然后,之前

 echo implode( ',', $data ) . "\n";
Run Code Online (Sandbox Code Playgroud)

你添加

$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);
Run Code Online (Sandbox Code Playgroud)

有了这个,帖子标题的列标题将不会被设置,我们可以根据需要对其进行改进以设置它,但是每个帖子标题都应该有一个列