This Wordpress plugin adds custom features and modifications to the Ultimate Member plugin family.
<?php
/**
* Plugin Name: Ultimate Member Modifications
* Plugin URI: http://geminilabs.io
* Description: This plugin adds custom features and modifications to the Ultimate Member plugin family.
* Version: 1.0.0
* Author: Gemini Labs
* Author URI: http://geminilabs.io
* License: MIT License
*/
class UltimateMembersMods
{
/**
* Instantiate the class
*
* @return void
*/
public function __construct()
{
// Allows a user to set their Display Name in the Account settings
add_action( 'um_after_account_general', [ $this, 'addDisplayNameFieldToAccount' ] );
// Adds new post notifications to followers
add_filter( 'um_notifications_core_log_types', [ $this, 'notificationsAddTypes' ] );
add_filter( 'um_notifications_get_icon', [ $this, 'notificationsAddIcons' ], 10, 2 );
add_action( 'transition_post_status', [ $this, 'notificationsLogNewPost' ], 10, 3 );
}
/**
* Add the Display Name field to account settings
*
* @return void
*/
public function addDisplayNameFieldToAccount()
{
global $ultimatemember;
$fields = $ultimatemember->builtin->get_specific_fields( 'display_name' );
foreach( $fields as $key => $data ) {
echo $ultimatemember->fields->edit_field( $key, $data );
}
}
/**
* Add custom notification types
*
* @param array $array
*
* @return array
*/
public function notificationsAddTypes( $array )
{
$array['user_post'] = array(
'title' => __( 'New user post', 'geminilabs' ),
'template' => '<strong>{member}</strong> has created a new post: <strong>{post_title}</strong>',
'account_desc' => __( 'When a member you follow publishes a new post', 'geminilabs' ),
);
return $array;
}
/**
* Add custom notification icons
*
* @param string $output
* @param string $type
*
* @return string
*/
public function notificationsAddIcons( $output, $type )
{
if( $type == 'user_post' ) {
$output = '<i class="um-faicon-pencil-square-o" style="color: #9A86FF"></i>';
}
return $output;
}
/**
* Log notifications for new posts
*
* @param string $new_status
* @param string $old_status
* @param WP_Post $post
*
* @return void
*/
public function notificationsLogNewPost( $new_status, $old_status, $post )
{
if( !defined( 'ultimatemember_version' )
|| !defined( 'um_notifications_version' )
|| !defined( 'um_followers_version' )
|| !function_exists( 'um_user' )
|| !function_exists( 'um_fetch_user' )
|| !function_exists( 'um_get_avatar_url' )
|| $new_status == $old_status
|| $new_status != 'publish' ) {
return;
}
global $ultimatemember, $um_followers;
$author = $post->post_author;
$followers = $um_followers->api->followers( $author );
if( is_array( $followers ) ) {
um_fetch_user( $author );
$new = [];
$vars = [];
$vars['member'] = um_user( 'display_name' );
$vars['photo'] = um_get_avatar_url( get_avatar( $author, 40 ) );
$vars['post_title'] = $post->post_title;
$vars['notification_uri'] = get_permalink( $post->ID );
array_walk( $followers, function( $key ) use( &$new ) {
$new[] = $key[ key( $key ) ];
} );
// we only want unique user IDs
$followers = array_keys( array_flip( $new ) );
$this->storeNotifications( $followers, 'user_post', $vars );
}
}
/**
* Store notifications for multiple users
*
* @param array $users
* @param string $type
* @param array $vars
*
* @return void
*/
public function storeNotifications( $users, $type, $vars = [] )
{
global $wpdb, $um_notifications;
$users = $this->usersWithNotificationEnabled( $type, $users );
if( !$users ) {
return;
}
$content = $um_notifications->api->get_notify_content( $type );
if( is_array( $vars ) ) {
foreach( $vars as $key => $var ) {
$content = str_replace( '{'.$key.'}', $var, $content );
}
}
$content = implode( ' ', array_unique( explode( ' ', $content ) ) );
if( $vars && isset( $vars['photo'] ) ) {
$photo = $vars['photo'];
}
else {
if( function_exists( 'um_get_default_avatar_uri' ) ) {
$photo = um_get_default_avatar_uri();
}
else {
// @todo fallback to wordpress method
$photo = '';
}
}
if( $vars && isset( $vars['notification_uri'] ) ) {
$url = $vars['notification_uri'];
}
$table_name = $wpdb->prefix . "um_notifications";
$followers = implode( ',', $users );
$time = current_time( 'mysql' );
// 1. Look for similar logs
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$table_name} WHERE user IN ({$followers}) AND type='%s' AND content='%s' ORDER BY time DESC",
$type,
$content
)
);
// 2. Update any found similar logs
if( !empty( $results ) ) {
array_walk( $results, function( $result ) use( &$notification_updates ) {
$notification_updates[] = $result->user;
} );
$updates = implode( ',', $notification_updates );
$wpdb->check_current_query = false;
$wpdb->query(
$wpdb->prepare(
"UPDATE {$table_name} " .
"SET status = 'unread', time = '%s' " .
"WHERE user IN ({$updates}) AND type='%s' AND content='%s'",
$time,
$type,
$content
)
);
$users = array_diff( $users, $notification_updates );
}
// 3. Insert the rest of the logs
if( !empty( $users ) ) {
foreach( $users as $user_id ) {
$rows[] = "('{$time}',{$user_id},'unread','{$photo}','{$type}','{$url}','{$content}')";
}
$values = implode( ',', $rows );
$wpdb->check_current_query = false;
$wpdb->query(
"INSERT INTO {$table_name} (time,user,status,photo,type,url,content) VALUES{$values}"
);
}
}
/**
* Filter users that have the notification enabled
*
* @param string $key
* @param array $users
*
* @return array|false
*/
public function usersWithNotificationEnabled( $key, $users )
{
if( is_array( $users ) && um_get_option( 'log_'.$key ) ) {
$array = [];
foreach( $users as $i => $user_id ) {
$prefs = get_user_meta( $user_id, '_notifications_prefs', true );
if( $prefs && isset( $prefs[ $key ] ) && !$prefs[ $key ] ) {
unset( $users[ $i ] );
}
}
// re-index array after unset
return array_values( $users );
}
return false;
}
}
new UltimateMembersMods;