init_defaults();
$this->init_options();
$this->init_hooks();
}
private function init_defaults(){
$blogname = get_option('blogname', '');
$adminemail = get_option('admin_email');
$this->default = new stdClass;
$this->default->options = array(
'from_name' => $blogname . ' - ' . __( 'Forum', 'wpforo' ),
'from_email' => $adminemail,
'admin_emails' => $adminemail,
'new_topic_notify' => 1,
'new_reply_notify' => 0,
'confirmation_email_subject' => __( "Please confirm subscription to [entry_title]", 'wpforo' ),
'confirmation_email_message' => __( "Hello [member_name]!
\n Thank you for subscribing.
\n This is an automated response.
\n We are glad to inform you that after confirmation you will get updates from - [entry_title].
\n Please click on link below to complete this step.
\n [confirm_link]", 'wpforo' ),
'new_topic_notification_email_subject' => __( "New Topic", 'wpforo' ),
'new_topic_notification_email_message' => __( "Hello [member_name]!
\n New topic has been created on your subscribed forum - [forum].\n
\n [topic_title]\n
\n [topic_desc]\n
\n
\n If you want to unsubscribe from this forum please use the link below.
\n [unsubscribe_link]", 'wpforo' ),
'new_post_notification_email_subject' => __( "New Reply", 'wpforo' ),
'new_post_notification_email_message' => __( "Hello [member_name]!
\n New reply has been posted on your subscribed topic - [topic].\n
\n [reply_title]\n \n [reply_desc]\n
\n
\n If you want to unsubscribe from this topic please use the link below.
\n [unsubscribe_link]", 'wpforo' ),
'report_email_subject' => __( "Forum Post Report", 'wpforo' ),
'report_email_message' => __( "Report details:\n Reporter: [reporter],
\n Message: [message],
\n
\n [post_url]", 'wpforo' ),
'overwrite_new_user_notification_admin' => 1,
'wp_new_user_notification_email_admin_subject' => __( "[blogname] New User Registration", 'wpforo' ),
'wp_new_user_notification_email_admin_message' => __( "New user registration on your site [blogname]:\n\nUsername: [user_login]\n\nEmail: [user_email]\n", 'wpforo' ),
'overwrite_new_user_notification' => 1,
'wp_new_user_notification_email_subject' => __( "[blogname] Your username and password info", 'wpforo' ),
'wp_new_user_notification_email_message' => __( "Username: [user_login]\n\nTo set your password, visit the following address:\n\n[set_password_url]\n\n", 'wpforo' ),
'overwrite_reset_password_email_message' => 1,
'reset_password_email_message' => __( "Hello! \n\n You asked us to reset your password for your account using the email address [user_login]. \n\n If this was a mistake, or you didn't ask for a password reset, just ignore this email and nothing will happen. \n\n To reset your password, visit the following address: \n\n [reset_password_url] \n\n Thanks!", 'wpforo' ),
'user_mention_notify' => 1,
'user_mention_email_subject' => __( "You have been mentioned in forum post", 'wpforo' ),
'user_mention_email_message' => __( "Hi [mentioned-user-name]!
\n\n You have been mentioned in a post on \"[topic-title]\" by [author-user-name].
\n\n Post URL: [post-url]", 'wpforo' )
);
$this->default->subscribe_format = array(
'subid' => '%d',
'type' => '%s',
'itemid' => '%d',
'userid' => '%d',
'confirmkey' => '%s',
'active' => '%d',
'user_name' => '%s',
'user_email' => '%s'
);
}
private function init_options(){
$this->options = get_wpf_option('wpforo_subscribe_options', $this->default->options);
}
private function init_hooks(){
add_action('wpforo_after_delete_topic', array($this, 'after_delete_topic'));
}
function get_confirm_key(){
return substr(md5(rand().time()), 0, 32);
}
function add( $args = array() ){
if( empty($args) && empty($_REQUEST['sbscrb']) ) return FALSE;
if( empty($args) && !empty($_REQUEST['sbscrb']) ) $args = $_REQUEST['sbscrb'];
if( !isset($args['active']) || !$args['active'] ) $args['active'] = 0;
extract( $args );
if( !isset($itemid) || !( (isset($userid) && $userid) || (isset($user_email) && $user_email) ) || !isset($type) || !$type ) return FALSE;
if( empty($confirmkey) ) $confirmkey = $this->get_confirm_key();
$user_name = ( isset($user_name) && $user_name ? $user_name : '');
$user_email = ( isset($user_email) && $user_email ? $user_email : '');
$sql = "SELECT EXISTS(
SELECT * FROM `" . WPF()->tables->subscribes . "`
WHERE `itemid` = %d
AND `type` = %s
AND `userid` = %d
AND `user_email` = %s
) AS is_exists";
$sql = WPF()->db->prepare($sql, $itemid, $type, $userid, $user_email);
if ( !WPF()->db->get_var($sql) ){
if ( WPF()->db->insert(
WPF()->tables->subscribes,
array(
'itemid' => $itemid,
'type' => $type,
'confirmkey' => $confirmkey,
'userid' => $userid,
'active' => $active,
'user_name' => $user_name,
'user_email' => $user_email
),
array(
'%d',
'%s',
'%s',
'%d',
'%d',
'%s',
'%s'
)
) ){
if( isset($active) && $active == 1 ){
WPF()->notice->add('You have been successfully subscribed', 'success');
}else{
WPF()->notice->add('Success! Thank you. Please check your email and click confirmation link below to complete this step.', 'success');
}
return $confirmkey;
}
}
WPF()->notice->add('Can\'t subscribe to this item', 'error');
return FALSE;
}
function edit( $confirmkey = '' ){
if( !$confirmkey && isset($_REQUEST['key']) && $_REQUEST['key'] ) $confirmkey = $_REQUEST['key'];
if( !$confirmkey ){
WPF()->notice->add('Invalid request!', 'error');
return FALSE;
}
if( WPF()->db->update(
WPF()->tables->subscribes,
array( 'active' => 1 ),
array( 'confirmkey' => sanitize_text_field($confirmkey) ),
array( '%d' ),
array( '%s' )
) ){
if( $sbs = $this->get_subscribe($confirmkey) ) WPF()->member->edit_is_email_confirmed($sbs['userid'], 1);
WPF()->notice->add('You have been successfully subscribed', 'success');
return TRUE;
}
WPF()->notice->add('Your subscription for this item could not be confirmed', 'error');
return FALSE;
}
public function reset($data = array(), $all = '', $user = null){
if(!$user && !WPF()->current_userid && !WPF()->current_user_email) return false;
if (!$user) $user = ( WPF()->current_userid ? WPF()->current_userid : WPF()->current_user_email );
$data = array_filter( (array) $data );
$args = array(
'itemid' => 0,
'type' => '',
'userid' => 0,
'active' => ( wpforo_feature('subscribe_conf') ? 0 : 1 ),
'user_name' => '',
'user_email' => ''
);
if( is_numeric($user) ){
$args['userid'] = $user;
$where = WPF()->db->prepare("`userid` = %d", $user);
}else{
$args['user_email'] = $user;
$args['user_name'] = WPF()->current_user_display_name;
$where = WPF()->db->prepare("`user_email` = %s", $user);
}
if( $args['active'] !== 1 && $this->is_email_confirmed($user) ) $args['active'] = 1;
$types = array('forum', 'forum-topic');
if( !$all ) array_push($types, 'forums', 'forums-topics');
$sql = "DELETE FROM `".WPF()->tables->subscribes."` WHERE `type` IN('".implode("','", $types)."') AND " . $where;
if(!$all && $data){
$forumids = array_keys($data);
$sql .= " AND `itemid` NOT IN(".implode(',', $forumids).")";
}
WPF()->db->query($sql);
if(!$all && $data){
foreach ($data as $forumid => $type){
$sql = "SELECT `subid` FROM `".WPF()->tables->subscribes."` WHERE `type` IN('forum', 'forum-topic') AND `itemid` = %d AND " . $where;
$sql = WPF()->db->prepare($sql, $forumid);
if( $subid = WPF()->db->get_var($sql) ){
WPF()->db->update(
WPF()->tables->subscribes,
array('type' => sanitize_text_field($type), 'active' => $args['active']),
array('subid' => $subid),
array('%s', '%d'),
array('%d')
);
}else{
$args['itemid'] = intval($forumid);
$args['type'] = sanitize_text_field($type);
$this->add($args);
}
}
}
if ($all){
$sql = "SELECT `subid` FROM `".WPF()->tables->subscribes."` WHERE `type` IN('forums', 'forums-topics') AND `itemid` = 0 AND " . $where;
if( $subid = WPF()->db->get_var($sql) ){
WPF()->db->update(
WPF()->tables->subscribes,
array('type' => sanitize_text_field($all), 'active' => $args['active']),
array('subid' => $subid),
array('%s', '%d'),
array('%d')
);
}else{
$args['itemid'] = 0;
$args['type'] = sanitize_text_field($all);
$this->add($args);
}
}
return true;
}
function delete( $where = array() ) {
if ( ! $where && $confirmkey = wpfval( $_REQUEST, 'confirmkey' ) ) $where = $confirmkey;
if ( ! $where ) {
WPF()->notice->add( 'Invalid request!', 'error' );
return false;
}
if ( ! is_array( $where ) ) $where = array( 'confirmkey' => $where );
$where = (array) $where;
$where = wpforo_array_ordered_intersect_key( $where, $this->default->subscribe_format );
if ( false !== WPF()->db->delete(
WPF()->tables->subscribes,
$where,
wpforo_array_ordered_intersect_key( $this->default->subscribe_format, $where )
) ) {
WPF()->notice->add( 'You have been successfully unsubscribed', 'success' );
return true;
}
WPF()->notice->add( 'Could not be unsubscribe from this item', 'error' );
return false;
}
function get_subscribe( $args = array() ){
$cache = WPF()->cache->on('memory_cashe');
if( is_string($args) ) $args = array("confirmkey" => sanitize_text_field($args));
if( empty($args) && !empty($_REQUEST['sbscrb']) ) $args = $_REQUEST['sbscrb'];
if( empty($args) ) return FALSE;
extract( $args, EXTR_OVERWRITE );
if( (!isset($itemid) || !$itemid || !( (isset($userid) && $userid) || (isset($user_email) && $user_email) ) || !isset($type) || !$type)
&& (!isset($confirmkey) || !$confirmkey) ) return FALSE;
if( isset($confirmkey) && $confirmkey){
$where = " `confirmkey` = '".esc_sql(sanitize_text_field($confirmkey))."'";
}elseif( isset($itemid) && $itemid && isset($userid) && $userid && isset($type) && $type ){
$where = " `itemid` = ".wpforo_bigintval($itemid)." AND `userid` = ".wpforo_bigintval($userid)." AND `type` = '".esc_sql(sanitize_text_field($type))."'";
}elseif( isset($itemid) && $itemid && isset($user_email) && $user_email && isset($type) && $type ){
$where = " `itemid` = ".wpforo_bigintval($itemid)." AND `user_email` = '".esc_sql($user_email)."' AND `type` = '".esc_sql(sanitize_text_field($type))."'";
}else{
return FALSE;
}
$sql = "SELECT * FROM `".WPF()->tables->subscribes."` WHERE " . $where;
if( $cache && WPF()->sql_cache->is_exist($sql) ){
$subscribe = WPF()->sql_cache->get($sql);
}else{
$subscribe = WPF()->db->get_row($sql, ARRAY_A);
if($cache) WPF()->sql_cache->set($sql, $subscribe);
}
return $subscribe;
}
function get_subscribes( $args = array(), &$items_count = 0 ){
$default = array(
'itemid' => NULL,
'type' => array(), // topic | forum
'userid' => NULL, //
'active' => 1,
'orderby' => 'subid', // order by `field`
'order' => 'DESC', // ASC DESC
'offset' => NULL, // OFFSET
'row_count' => NULL, // ROW COUNT
);
$args = wpforo_parse_args( $args, $default );
extract($args);
$sql = "SELECT * FROM `".WPF()->tables->subscribes."`";
$wheres = array();
if( $type ) $wheres[] = " `type` IN( '" . implode("','", array_map('esc_sql', (array) $type ) ) . "')";
if( !is_null($active) ) $wheres[] = " `active` = " . intval($active);
if( !is_null($itemid) ) $wheres[] = " `itemid` = " . wpforo_bigintval($itemid);
if( !is_null($userid) ) $wheres[] = " `userid` = " . wpforo_bigintval($userid);
if(!empty($wheres)) $sql .= " WHERE " . implode( " AND ", $wheres );
$item_count_sql = preg_replace('#SELECT.+?FROM#isu', 'SELECT count(*) FROM', $sql);
$item_count_sql = preg_replace('#ORDER.+$#is', '', $item_count_sql);
if( $item_count_sql ) $items_count = WPF()->db->get_var($item_count_sql);
$sql .= " ORDER BY `$orderby` " . $order;
if( !is_null($row_count) ){
if( !is_null($offset) ){
$sql .= esc_sql(" LIMIT $offset,$row_count");
}else{
$sql .= esc_sql(" LIMIT $row_count");
}
}
return WPF()->db->get_results($sql, ARRAY_A);
}
function get_confirm_link($args){
if(is_string($args)) return wpforo_home_url( "?wpfaction=sbscrbconfirm&key=" . sanitize_text_field($args) );
if($args['type'] == 'forum'){
$url = WPF()->forum->get_forum_url($args['itemid']) . '/';
}elseif($args['type'] == 'topic'){
$url = WPF()->topic->get_topic_url($args['itemid']) . '/';
}else{
$url = wpforo_home_url();
}
return wpforo_home_url( $url . "?wpfaction=sbscrbconfirm&key=" . sanitize_text_field($args['confirmkey']) );
}
function get_unsubscribe_link($confirmkey){
return wpforo_home_url( "?wpfaction=unsbscrb&key=" . sanitize_text_field($confirmkey) );
}
public function is_email_confirmed($user = null){
if(!$user && !WPF()->current_userid && !WPF()->current_user_email) return false;
if (!$user) $user = ( WPF()->current_userid ? WPF()->current_userid : WPF()->current_user_email );
$sql = ( is_numeric($user) ? "`userid` = %d" : "`user_email` = %s" );
$where = WPF()->db->prepare($sql, $user);
if( WPF()->current_userid === $user && wpfval(WPF()->current_user, 'is_email_confirmed') ){
$has_confirmed = WPF()->current_user['is_email_confirmed'];
}elseif( is_numeric($user) ){
$has_confirmed = WPF()->member->get_is_email_confirmed(WPF()->current_userid);
}else{
$has_confirmed = WPF()->db->get_var( "SELECT `subid` FROM `".WPF()->tables->subscribes."` WHERE `active` = 1 AND " . $where );
}
return (bool) $has_confirmed;
}
public function after_delete_topic($topic){
if( wpfval($topic, 'topicid') ) $this->delete( array('type' => 'topic', 'itemid' => $topic['topicid']) );
}
}