* @license GPL-2.0+
* @link http://rahularyan.com
* @copyright 2014 Rahul Aryan
*/
class AP_User {
/**
* Instance of this class.
*/
protected static $instance = null;
/**
* Return an instance of this class.
* @return object A single instance of this class.
*/
public static function get_instance()
{
// If the single instance hasn't been set, set it now.
if (null == self::$instance) {
self::$instance = new self;
}
return self::$instance;
}
/**
* Initialize the plugin by setting localization and loading public scripts
* and styles.
*/
private function __construct() {
add_filter( 'pre_user_query', array($this, 'follower_query') );
add_filter( 'pre_user_query', array($this, 'following_query') );
add_action('wp_ajax_ap_cover_upload', array($this, 'cover_upload'));
add_action('wp_ajax_ap_avatar_upload', array($this, 'avatar_upload'));
add_action( 'after_setup_theme', array($this, 'cover_size') );
add_action( 'ap_edit_profile_fields', array($this, 'user_fields'), 10, 2 );
add_action( 'wp_ajax_ap_save_profile', array($this, 'ap_save_profile'));
add_action( 'pre_user_query', array($this, 'sort_pre_user_query') );
add_filter('default_avatar_select', array($this, 'default_avatar'), 10);
add_filter( 'get_avatar', array($this, 'get_avatar'), 10, 5);
}
/* For modifying WP_User_Query, if passed with a var is_followers */
public function follower_query ($query) {
if(isset($query->query_vars['ap_followers_query'])){
global $wpdb;
$query->query_from = $query->query_from." LEFT JOIN ".$wpdb->prefix."ap_meta M ON $wpdb->users.ID = M.apmeta_userid";
$userid = $query->query_vars['userid'];
$query->query_where = $query->query_where." AND M.apmeta_type = 'follow' AND M.apmeta_actionid = $userid";
}
return $query;
}
public function following_query ($query) {
if(isset($query->query_vars['ap_following_query'])){
global $wpdb;
$query->query_from = $query->query_from." LEFT JOIN ".$wpdb->prefix."ap_meta M ON $wpdb->users.ID = M.apmeta_actionid";
$userid = $query->query_vars['userid'];
$query->query_where = $query->query_where." AND M.apmeta_type = 'follow' AND M.apmeta_userid = $userid";
}
return $query;
}
public function upload_file(){
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
if ($_FILES) {
foreach ($_FILES as $file => $array) {
if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
echo "upload error : " . $_FILES[$file]['error'];
die();
}
return media_handle_upload( $file, 0 );
}
}
}
public function cover_upload(){
if(ap_user_can_upload_cover() && wp_verify_nonce( $_POST['nonce'], 'upload' )){
$attach_id = $this->upload_file();
$userid = get_current_user_id();
$previous_cover = get_user_meta($userid, '_ap_cover', true);
wp_delete_attachment( $previous_cover, true );
update_user_meta($userid, '_ap_cover', $attach_id);
$result = array('status' => true, 'message' => __('Cover uploaded successfully.', 'ap'), 'view' => '[data-view="cover"]', 'background-image' => 'background-image:url('.ap_get_user_cover($userid).')');
do_action('ap_after_cover_upload', $userid, $attach_id);
}else{
$result = array('status' => false, 'message' => __('Unable to upload cover.', 'ap'));
}
die(json_encode($result));
}
public function avatar_upload(){
if(ap_user_can_upload_cover() && wp_verify_nonce( $_POST['nonce'], 'upload' )){
$attach_id = $this->upload_file();
$userid = get_current_user_id();
$previous_avatar = get_user_meta($userid, '_ap_avatar', true);
wp_delete_attachment( $previous_avatar, true );
update_user_meta($userid, '_ap_avatar', $attach_id);
$result = array('status' => true, 'message' => __('Avatar uploaded successfully.', 'ap'), 'view' => '[data-view="avatar-main"]', 'image' => get_avatar( $userid, 105 ));
do_action('ap_after_avatar_upload', $userid, $attach_id);
}else{
$result = array('status' => false, 'message' => __('Unable to upload cover.', 'ap'));
}
die(json_encode($result));
}
public function cover_size(){
add_image_size( 'ap_cover', ap_opt('cover_width'), ap_opt('cover_height'), array( 'top', 'center' ), true );
add_image_size( 'ap_cover_small', ap_opt('cover_width_small'), ap_opt('cover_height'), array( 'top', 'center' ), true );
}
public function user_fields($user, $meta){
?>
'validation_falied',
'message' => __('Failed to update, please check form.', 'ap'),
'error' => $validation,
);
die(json_encode($result));
}
$fields = ap_profile_fields_to_process();
if (isset($fields['password']))
wp_update_user( array( 'ID' => $current_user->ID, 'user_pass' => esc_attr( $_POST['password'] ) ) );
if (isset($fields['first_name']))
update_user_meta( $current_user->ID, 'first_name', $fields['first_name']);
if ( isset($fields['last_name']) )
update_user_meta($current_user->ID, 'last_name', $fields['last_name']);
if ( isset($fields['nick_name']) )
update_user_meta($current_user->ID, 'nickname', $fields['nick_name']);
if ( isset($fields['display_name']) )
wp_update_user(array('ID' => $current_user->ID, 'display_name' => $fields['display_name']));
if(isset($fields['url']))
update_user_meta( $current_user->ID, 'user_url', $fields['url'] );
if(isset($fields['facebook']))
update_user_meta( $current_user->ID, 'facebook', $fields['facebook'] );
if(isset($fields['twitter']))
update_user_meta( $current_user->ID, 'twitter', $fields['twitter'] );
if(isset($fields['description']))
update_user_meta( $current_user->ID, 'description', $fields['description'] );
if(isset($fields['google']))
update_user_meta( $current_user->ID, 'google', $fields['google'] );
do_action('ap_save_profile', $current_user, $fields);
$result = array(
'status' => true,
'message' => __('Successfully updated your profile.', 'ap'),
);
}else{
$result = array(
'status' => false,
'message' => __('Failed to save profile.', 'ap'),
);
}
die(json_encode($result));
}
public function sort_pre_user_query($query){
if(isset($query->query_vars['ap_query']) && $query->query_vars['ap_query'] == 'sort_points'){
global $wpdb;
$query->query_orderby = 'ORDER BY CAST('.$wpdb->usermeta.'.meta_value as DECIMAL) DESC';
}
}
public function get_avatar($avatar, $id_or_email, $size, $default, $alt){
if ( !empty($id_or_email) ) {
if(is_object($id_or_email)){
$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) )
return false;
if ( ! empty( $id_or_email->user_id ) ) {
$id = (int) $id_or_email->user_id;
$user = get_userdata($id);
if ( $user )
$id_or_email = $user->user_id;
}
}elseif(is_email($id_or_email)){
$u = get_user_by('email', $id_or_email);
$id_or_email = $u->ID;
}
$image_a = wp_get_attachment_image_src( get_user_meta($id_or_email, '_ap_avatar', true), 'thumbnail');
if($image_a[0]){
return "
";
}
return $avatar;
}
}
}
function ap_count_user_posts_by_type( $userid, $post_type = 'question' ) {
global $wpdb;
$where = get_posts_by_author_sql( $post_type, true, $userid );
$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );
return apply_filters( 'ap_get_usernumposts', $count, $userid );
}
function ap_user_question_count($userid){
return ap_count_user_posts_by_type( $userid, $post_type = 'question' );
}
function ap_user_answer_count($userid){
return ap_count_user_posts_by_type( $userid, $post_type = 'answer' );
}
function ap_get_user_answers_list($user_id, $limit = 5, $title_limit = 50){
$ans_args =array(
'post_type' => 'answer',
'post_status' => 'publish',
'author' => $user_id,
'showposts' => $limit,
);
$answers = get_posts($ans_args);
$o = '';
return $o;
}
/* Display the list of question of a user */
function ap_get_user_question_list($user_id, $limit = 5, $title_limit = 50){
$q_args =array(
'post_type' => 'question',
'post_status' => 'publish',
'author' => $user_id,
'showposts' => $limit,
);
$questions = get_posts($q_args);
$o = '';
return $o;
}
function ap_user_display_name($id = false, $no_html = false){
if(!$id)
$id = get_the_author_meta('ID');
if ($id > 0){
$user = get_userdata($id);
if($no_html)
return $user->display_name;
return ''.$user->display_name.'';
}
if($no_html)
return __('Anonymous', 'ap');
return ''.__('Anonymous', 'ap').'';
}
function ap_user_link($userid=false, $sub = false){
if(!$userid)
$userid = get_the_author_meta('ID');
$user = get_userdata($userid);
$user_link = rtrim(ap_get_link_to('user/'.$user->user_login), '/');
if($user)
return $user_link. ($sub ? '/'.$sub : '');
return false;
}
function ap_user_menu(){
$userid = ap_get_user_page_user();
$user_page = get_query_var('user_page');
$user_page = $user_page ? $user_page : 'profile';
$menus = array(
'profile' => array( 'name' => __('Profile', 'ap'), 'link' => ap_user_link($userid), 'icon' => 'ap-icon-user'),
'questions' => array( 'name' => __('Questions', 'ap'), 'link' => ap_user_link($userid, 'questions'), 'icon' => 'ap-icon-question'),
'answers' => array( 'name' => __('Answers', 'ap'), 'link' => ap_user_link($userid, 'answers'), 'icon' => 'ap-icon-answer'),
'badges' => array( 'name' => __('Badges', 'ap'), 'link' => ap_user_link($userid, 'badges'), 'icon' => 'ap-icon-badge'),
'favorites' => array( 'name' => __('Favorites', 'ap'), 'link' => ap_user_link($userid, 'favorites'), 'icon' => 'ap-icon-star'),
'followers' => array( 'name' => __('Followers', 'ap'), 'link' => ap_user_link($userid, 'followers'), 'icon' => 'ap-icon-users'),
'following' => array( 'name' => __('Following', 'ap'), 'link' => ap_user_link($userid, 'following'), 'icon' => 'ap-icon-users'),
'edit_profile' => array( 'name' => __('Edit Profile', 'ap'), 'link' => ap_user_link($userid, 'edit_profile'), 'icon' => 'ap-icon-pencil', 'own' => true),
//'settings' => array( 'name' => __('Settings', 'ap'), 'link' => ap_user_link($userid, 'settings'), 'icon' => 'ap-icon-cog'),
);
/* filter for overriding menu */
$menus = apply_filters('ap_user_menu', $menus);
$o ='';
echo $o;
}
function ap_user_page_menu(){
if(!is_my_profile())
return;
$userid = ap_get_user_page_user();
$user_page = get_query_var('user_page');
$user_page = $user_page ? $user_page : 'profile';
$menus = array();
/* filter for overriding menu */
$menus = apply_filters('ap_user_page_menu', $menus, $userid);
if(!empty($menus)){
$o ='';
echo $o;
}
}
function ap_get_current_user_page_template(){
if(is_anspress()){
$user_page = get_query_var('user_page');
$user_page = $user_page ? $user_page : 'profile';
$template = 'user-'.$user_page.'.php';
return apply_filters('ap_get_current_user_page_template', $template);
}
return 'content-none.php';
}
function ap_user_template(){
$userid = ap_get_user_page_user();
$user_meta = (object) array_map( 'ap_meta_array_map', get_user_meta($userid));
if(is_ap_followers()){
$total_followers = ap_get_current_user_meta('followers');
// how many users to show per page
$users_per_page = 1;
// grab the current page number and set to 1 if no page number is set
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// calculate the total number of pages.
$total_pages = 1;
$offset = $users_per_page * ($paged - 1);
$total_pages = ceil($total_followers / $users_per_page);
$args = array(
'ap_followers_query' => true,
'number' => 10,
'userid' => ap_get_user_page_user()
);
// The Query
$followers_query = new WP_User_Query( $args );
$followers = $followers_query->results;
$base = ap_user_link(ap_get_user_page_user(), 'followers') . '/%_%';
}elseif(ap_current_user_page_is('following')){
$total_following = ap_get_current_user_meta('following');
// how many users to show per page
$users_per_page = 4;
// grab the current page number and set to 1 if no page number is set
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// calculate the total number of pages.
$total_pages = 1;
$offset = $users_per_page * ($paged - 1);
$total_pages = ceil($total_following / $users_per_page);
$args = array(
'ap_following_query' => true,
'number' => $users_per_page,
'userid' => ap_get_user_page_user(),
'offset' => $offset
);
// The Query
$following_query = new WP_User_Query( $args );
$following = $following_query->results;
$base = ap_user_link(ap_get_user_page_user(), 'following') . '/%_%';
}elseif(ap_current_user_page_is('questions')){
$order = get_query_var('sort');
$label = sanitize_text_field(get_query_var('label'));
if(empty($order ))
$order = 'active';//ap_opt('answers_sort');
if(empty($label ))
$label = '';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$question_args=array(
'author' => ap_get_user_page_user(),
'post_type' => 'question',
'post_status' => 'publish',
'showposts' => ap_opt('question_per_page'),
'paged' => $paged
);
if($order == 'active'){
$question_args['orderby'] = 'meta_value';
$question_args['meta_key'] = ANSPRESS_UPDATED_META;
}elseif($order == 'voted'){
$question_args['orderby'] = 'meta_value_num';
$question_args['meta_key'] = ANSPRESS_VOTE_META;
}elseif($order == 'answers'){
$question_args['orderby'] = 'meta_value_num';
$question_args['meta_key'] = ANSPRESS_ANS_META;
}elseif($order == 'unanswered'){
$question_args['orderby'] = 'meta_value';
$question_args['meta_key'] = ANSPRESS_ANS_META;
$question_args['meta_value'] = '0';
}elseif($order == 'oldest'){
$question_args['orderby'] = 'date';
$question_args['order'] = 'ASC';
}
if ($label != ''){
$question_args['tax_query'] = array(
array(
'taxonomy' => 'question_label',
'field' => 'slug',
'terms' => $label
)
);
}
$question_args = apply_filters('ap_user_question_args', $question_args);
$question = new WP_Query( $question_args );
}elseif(ap_current_user_page_is('answers')){
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$order = get_query_var('sort');
if(empty($order ))
$order = ap_opt('answers_sort');
if($order == 'voted'){
$ans_args=array(
'author' => ap_get_user_page_user(),
'ap_query' => 'answer_sort_voted',
'post_type' => 'answer',
'post_status' => 'publish',
'showposts' => ap_opt('answers_per_page'),
'paged' => $paged,
'orderby' => 'meta_value_num',
'meta_key' => ANSPRESS_VOTE_META,
'meta_query'=>array(
'relation' => 'OR',
array(
'key' => ANSPRESS_BEST_META,
'compare' => '=',
'value' => '1'
),
array(
'key' => ANSPRESS_BEST_META,
'compare' => 'NOT EXISTS'
)
)
);
}elseif($order == 'oldest'){
$ans_args=array(
'author' => ap_get_user_page_user(),
'ap_query' => 'answer_sort_newest',
'post_type' => 'answer',
'post_status' => 'publish',
'showposts' => ap_opt('answers_per_page'),
'paged' => $paged,
'orderby' => 'meta_value date',
'meta_key' => ANSPRESS_BEST_META,
'order' => 'ASC',
'meta_query'=>array(
'relation' => 'OR',
array(
'key' => ANSPRESS_BEST_META,
'compare' => 'NOT EXISTS'
)
)
);
}else{
$ans_args=array(
'author' => ap_get_user_page_user(),
'ap_query' => 'answer_sort_newest',
'post_type' => 'answer',
'post_status' => 'publish',
'showposts' => ap_opt('answers_per_page'),
'paged' => $paged,
'orderby' => 'meta_value date',
'meta_key' => ANSPRESS_BEST_META,
'order' => 'DESC',
'meta_query'=>array(
'relation' => 'OR',
array(
'key' => ANSPRESS_BEST_META,
'compare' => 'NOT EXISTS'
)
)
);
}
$ans_args = apply_filters('ap_user_answers_args', $ans_args);
$answer = new WP_Query($ans_args);
}elseif(ap_current_user_page_is('favorites')){
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args=array(
'author' => ap_get_user_page_user(),
'ap_query' => 'user_favorites',
'post_type' => 'question',
'post_status' => 'publish',
'showposts' => ap_opt('answers_per_page'),
'paged' => $paged,
'orderby' => 'date',
'order' => 'DESC'
);
$args = apply_filters('ap_user_favorites_args', $args);
$question = new WP_Query($args);
}elseif(ap_current_user_page_is('messages')){
if(ap_get_user_page_user() != get_current_user_id()){
_e('You do not have access here', 'ap');
return;
}
}elseif(ap_current_user_page_is('message')){
if(ap_get_user_page_user() != get_current_user_id()){
_e('You do not have access here', 'ap');
return;
}
$message_id = get_query_var('message_id');
}elseif(ap_current_user_page_is('badges')){
$user_badges = ap_get_users_all_badges(ap_get_user_page_user());
$count_badges = ap_user_badge_count_by_badge(ap_get_user_page_user());
}
global $user;
global $current_user_meta;
include ap_get_theme_location(ap_get_current_user_page_template());
if(ap_current_user_page_is('following') || ap_current_user_page_is('followers'))
ap_pagi($base, $total_pages, $paged);
// Restore original Post Data
if(ap_current_user_page_is('questions') || ap_current_user_page_is('answers') || ap_current_user_page_is('favorites'))
wp_reset_postdata();
}
function ap_get_current_user_meta($meta){
global $current_user_meta;
if($meta == 'followers')
return @$current_user_meta[AP_FOLLOWERS_META] ? $current_user_meta[AP_FOLLOWERS_META] : 0;
elseif($meta == 'following')
return @$current_user_meta[AP_FOLLOWING_META] ? $current_user_meta[AP_FOLLOWING_META] : 0;
elseif(isset($current_user_meta[$meta]))
return $current_user_meta[$meta];
return false;
}
function ap_cover_upload_form(){
if(ap_user_can_upload_cover() && ap_get_user_page_user() == get_current_user_id()){
?>
array('name' => __('About me', 'ap'), 'title' => __('Edit your "about me" section', 'ap'), 'active' => true),
'ap-account' => array('name' => __('Account', 'ap'), 'title' => __('Edit your account information', 'ap')),
);
$menu = apply_filters('ap_edit_profile_nav', $menu);
?>