회원 메타 데이터 필드 기준으로 현재 로그인한 워드프레스 회원 목록 출력

워드프레스에서 회원 정보를 출력하는 방법과 함수는 많은데, 사이트에 로그인한 회원 한 명의 특정 정보를 출력하는 함수로 wp_get_current_user가 있습니다. 보통 다음처럼 사용합니다.

if ( is_user_logged_in() ) {
    $current_user = wp_get_current_user();
    echo 'Username: ' . $current_user->user_login . '<br />';
    echo 'User email: ' . $current_user->user_email . '<br />';
    echo 'User first name: ' . $current_user->user_firstname . '<br />';
    echo 'User last name: ' . $current_user->user_lastname . '<br />';
    echo 'User display name: ' . $current_user->display_name . '<br />';
    echo 'User ID: ' . $current_user->ID . '<br />';
}

그러나, 이 함수는 로그인 회원에게 나타나는 자신의 정보입니다.

회원 메타 데이터 기준의 현재 로그인 회원

만약, 사이트 전체의 회원 목록이 아니라 현재 로그인한 회원 목록을 출력하려면 한 명의 회원이 로그인할 때 워드프레스가 데이터베이스에 생성하는 메타 데이터 필드를 기준으로 정의할 수 있습니다.

워드프레스는 회원이 로그인할 때 데이터베이스 _usermeta 테이블에 회원 아이디(ID)를 기준으로 session_tokens 필드를 생성하여 ‘토큰(token)’, ‘만료시각’, ‘아이피’, ‘사용자 에이전트’, ‘로그인 시각’을 저장하는데, 다음과 같습니다.

Array
(
    [178d7b815668e7d16c2f9124b7c09686f6c960509ac7f40f923f7279acded408] => Array
        (
            [expiration] => 1527676576
            [ip] => 1.23.345.456
            [ua] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
            [login] => 1527503776
        )

)

따라서, _usermeta 테이블을 조회하여 session_tokens 필드가 있는 회원만 구한다면 쉽게 현재 로그인 사용자를 출력할 수 있습니다. 다음처럼 get_users 함수를 사용하여 해당 필드가 존재하는 회원 데이터를 구합니다.

$users = get_users( array(
    'meta_key' => 'session_tokens',
    'meta_compare' => 'EXISTS'
) );

다음은, get_users 함수로 얻은 각 회원의 특정 오브젝트를 출력하는 것인데, 출력 필드와 값을 확인하여 최종 결과에 어떤 데이터를 출력할 것인지 결정하는 데 힌트를 얻을 수 있습니다. echo 함수 하나씩만 활성화하여 결과를 확인하면 이해를 더할 수 있습니다.

if ( $users ) {
    foreach ( $users as $user ) {
        echo '<pre>' . print_r( get_user_meta( $user->ID, 'session_tokens', true ), true ) . '</pre>'; // session_tokens 메타 필드 값 출력
        echo '<pre>' . print_r( $user, true ) . '</pre>'; // 회원의 전체 오브젝트 출력
        echo '<pre>' . print_r( $user->ID, true ) . '</pre>'; // 회원 아이디(ID)만 출력
        echo '<pre>' . print_r( $user->display_name, true ) . '</pre>'; // 회원의 프런트 출력 이름 출력
    }
}

이 포스트에서는 간단하게 회원의 프런트 출력 이름(display_name)만 출력해봅니다. 다음처럼 간단하게 정의할 수 있습니다.

if ( $users ) {
    echo '<ul>';
        foreach ( $users as $user ) {

            //echo '<pre>' . print_r( get_user_meta( $user->ID, 'session_tokens', true ), true ) . '</pre>';
            //echo '<pre>' . print_r( $user, true ) . '</pre>';
            //echo '<pre>' . print_r( $user->ID, true ) . '</pre>';
            //echo '<pre>' . print_r( $user->display_name, true ) . '</pre>';

            $user_id = $user->ID;
            $user_name = $user->display_name;
            $user_avatar = get_avatar( $user_id, 32 );

            //echo '<li>' . $user_avatar . $user_name . '</li>'; //아바타 포함
            echo '<li>' . $user_name . '</li>';
        }
    echo '</ul>';
}

템플릿 태그, Shortcode, 플러그인

현재 로그인한 회원의 목록 출력은 포스트 작성할 때 Shortcode 입력으로 출력할 수도 있고, 위젯에 Shortcode를 입력하여 사이드바에 출력할 수 있도록 약간의 활용 여지를 남기는 것이 좋습니다.

Shortcode도 테마 템플릿 파일에 사용할 수 있지만, 템플릿 태그(함수)로도 가능하도록 함수로 정의하면 사용 방법의 범위를 확장할 수 있으며, 이 모든 방법의 플러그인으로 구성하면 어떤 사이트에도 사용할 수 있는 범용성을 확보할 수 있습니다. 이를 정리한 최종 플러그인 파일을 다음처럼 아주 간단하게 정의할 수 있습니다.

<?php
/*
Plugin Name: 현재 로그인한 회원 목록
Description: 사이트에 로그인한 회원 목록 출력<br />. <strong>함수(<code>current_login_user()</code>, 템플릿 태그), Shortcode( <code>[current_users]</code> )</strong> 중 원하는 형태로 사용. 위젯에 Shortcode 사용할 때는 <strong>Custom Html 위젯</strong>에 추가 가능. 로그인 회원의 추가 정보 출력은 <code>get_user_meta</code> 함수 등 여러 방법으로 표현 가능하므로 필요에 따라 코드를 수정하여 사용.
Version: 1.0.0
Author: Someone
*/

// Make sure we don't expose any info if called directly
if ( !function_exists( 'add_action' ) ) {
    echo 'Hi there!  I\'m just a plugin, not much I can do when called directly.';
    exit;
}

function current_login_user() {
    $users = get_users( array(
        'meta_key' => 'session_tokens',
        'meta_compare' => 'EXISTS'
    ) );

    if ( $users ) {
        echo '<ul>';
            foreach ( $users as $user ) {

                $user_id = $user->ID;
                $user_name = $user->display_name;
                $user_avatar = get_avatar( $user_id, 32 );

                //echo '<li>' . $user_avatar . $user_name . '</li>'; //아바타 포함
                echo '<li>' . $user_name . '</li>';
            }
        echo '</ul>';
    }
}

add_filter( 'widget_text', 'do_shortcode' ); // Custom Html 위젯에 Shortcode 사용 가능
add_shortcode( 'current_users', 'current_login_user' ); // Shortcode [current_users]

위 코드에서 비활성화한 줄은 지워도 되며, 출력할 회원 데이터를 추가하고, 스타일 정의를 위한 마크업 등 무엇이든 원하는 대로 변경하면 됩니다. 다음 링크의 페이지에서 파일로 받아 업로드 방식의 플러그인 설치 방법으로 활성화하면 편합니다.

사용에 관한 정보는 플러그인 설명을 읽어보면 금방 알 수 있습니다.