Экспортировать информацию пользователя в CSV - дополнительный столбец

Я использую "Экспорт пользователей в CSV" для плагина для Wordpress. По умолчанию плагин извлекает только wp_users и wp_usermeta​​p >

Мне нужно добавить столбец post_title из wp_posts. Я смог вытащить "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); на $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);

При этом заголовки столбцов для заголовков сообщений не будут установлены, мы можем улучшить его, чтобы установить его, если вам это нужно, но у вас должен быть столбец за каждый заголовок