array(), 'post' => array(), 'item' => array(), 'topic_slug' => array(), 'forum_slug' => array(), 'post_url' => array() ); function __construct(){ $this->init_defaults(); $this->init_options(); $this->init_hooks(); } public function get_cache( $var ){ if( isset(self::$cache[$var]) ) return self::$cache[$var]; } public function reset(){ self::$cache = array( 'posts' => array(), 'post' => array(), 'item' => array(), 'topic_slug' => array(), 'forum_slug' => array(), 'post_url' => array() ); } private function init_defaults(){ $this->default = new stdClass; $upload_max_filesize = @ini_get('upload_max_filesize'); $upload_max_filesize = wpforo_human_size_to_bytes($upload_max_filesize); if( !$upload_max_filesize || $upload_max_filesize > 10485760 ) $upload_max_filesize = 10485760; $this->default->options = array( 'layout_extended_intro_posts_toggle' => 1, 'layout_extended_intro_posts_count' => 4, 'layout_extended_intro_posts_length' => 50, 'recent_posts_type' => 'topics', 'tags' => 1, 'max_tags' => 5, 'tags_per_page' => 100, 'topics_per_page' => 10, 'edit_topic' => 1, 'edit_post' => 1, 'eot_durr' => 300, 'dot_durr' => 300, 'posts_per_page' => 15, 'layout_threaded_posts_per_page' => 5, 'layout_qa_posts_per_page' => 15, 'layout_qa_comments_limit_count' => 3, 'layout_qa_first_post_reply' => 1, 'layout_threaded_nesting_level' => 5, 'layout_threaded_first_post_reply' => 0, 'eor_durr' => 300, 'dor_durr' => 300, 'max_upload_size' => $upload_max_filesize, 'display_current_viewers' => 1, 'display_recent_viewers' => 1, 'display_admin_viewers' => 1, 'union_first_post' => array( 1 => 0, 2 => 0, 3 => 1, 4 => 0 ), 'attach_cant_view_msg' => __( "You are not permitted to view this attachment", 'wpforo' ), 'search_max_results' => 100, 'topic_body_min_length' => 2, 'topic_body_max_length' => 0, 'post_body_min_length' => 2, 'post_body_max_length' => 0, 'comment_body_min_length' => 2, 'comment_body_max_length' => 0 ); } private function init_options(){ $this->options = get_wpf_option('wpforo_post_options', $this->default->options); } private function init_hooks(){ add_filter('wpforo_content_after', array($this, 'print_custom_fields'), 99, 2); } /** * @param int $layout * * @return int items_per_page */ public function get_option_items_per_page($layout = null){ switch ( $layout ) { case 4: $items_per_page = $this->options['layout_threaded_posts_per_page']; break; case 3: $items_per_page = $this->options['layout_qa_posts_per_page']; break; default: $items_per_page = $this->options['posts_per_page']; break; } return (int) apply_filters('wpforo_post_get_option_items_per_page', $items_per_page, $layout); } /** * @param int $layout * * @return bool */ public function get_option_union_first_post($layout){ $layout = intval($layout); $union_first_post = (bool) wpfval($this->options['union_first_post'], $layout); return (bool) apply_filters('wpforo_post_options_get_union_first_post', $union_first_post, $layout); } public function add( $args = array() ){ $guestposting = false; $root_exists = wpforo_root_exist(); if( empty($args) && empty($_REQUEST['post']) ){ WPF()->notice->add('Reply request error', 'error'); return FALSE; } if( empty($args) && !empty($_REQUEST['post']) ) $args = $_REQUEST['post']; if( !isset($args['body']) || !$args['body'] ){ WPF()->notice->add('Post is empty', 'error'); return FALSE; } if( !wpfval($args, 'title') && wpfval($args, 'topicid') ){ $args['title'] = wpforo_phrase('RE', false) . ': ' . wpforo_topic($args['topicid'], 'title'); } $args['name'] = (isset($args['name']) ? strip_tags($args['name']) : '' ); $args['email'] = (isset($args['email']) ? sanitize_email($args['email']) : '' ); if( isset($args['userid']) && $args['userid'] == 0 && $args['name'] && $args['email'] ) $guestposting = true; extract($args); if( !isset($topicid) || !$topicid ){ WPF()->notice->add('Error: No topic selected', 'error'); return FALSE; } if( !$topic = WPF()->topic->get_topic(intval($topicid)) ){ WPF()->notice->add('Error: Topic is not found', 'error'); return FALSE; } if( !$forum = WPF()->forum->get_forum(intval($topic['forumid'])) ){ WPF()->notice->add('Error: Forum is not found', 'error'); return FALSE; } if( $topic['closed'] ){ WPF()->notice->add('Can\'t write a post: This topic is closed', 'error'); return FALSE; } if( !$guestposting && !(WPF()->perm->forum_can('cr', $topic['forumid']) || (wpforo_is_owner($topic['userid'],$topic['email']) && WPF()->perm->forum_can('ocr', $topic['forumid']))) ){ WPF()->notice->add('You don\'t have permission to create post in this forum', 'error'); return FALSE; } if( !WPF()->perm->can_post_now() ){ WPF()->notice->add('You are posting too quickly. Slow down.', 'error'); return FALSE; } if( !is_user_logged_in() ){ if( !$args['name'] || !$args['email'] ){ WPF()->notice->add('Please insert required fields!', 'error'); return FALSE; } else{ WPF()->member->set_guest_cookies( $args ); } } do_action( 'wpforo_start_add_post', $args ); $post = $args; $post['forumid'] = $forumid = (isset($topic['forumid']) ? intval($topic['forumid']) : 0); $post['parentid'] = $parentid = (isset($parentid) ? intval($parentid) : 0); $post['title'] = $title = (isset($title) ? wpforo_text( trim($title), 250, false ) : ''); $post['body'] = $body = ( isset($body) ? preg_replace('#[\r\n\t\s\0]*
#isu', "\r\n", $body) : '' );
$post['created'] = $created = ( isset($created) ? $created : current_time( 'mysql', 1 ) );
$post['userid'] = $userid = ( isset($userid) ? intval($userid) : WPF()->current_userid );
if( $root_exists ){
$post['root'] = ( $parentid ) ? ( isset($root) ? intval($root) : $this->get_root( $parentid ) ) : -1;
} else {
$root = NULL;
}
$post = apply_filters('wpforo_add_post_data_filter', $post);
if(empty($post)) return FALSE;
extract($post, EXTR_OVERWRITE);
if(isset($forumid)) $forumid = intval($forumid);
if(isset($topicid)) $topicid = intval($topicid);
if(isset($parentid)) $parentid = intval($parentid);
if(isset($title)) $title = sanitize_text_field(trim($title));
if(isset($created)) $created = sanitize_text_field($created);
if(isset($userid)) $userid = intval($userid);
if(isset($body)) $body = wpforo_kses(trim($body), 'post');
$status = ( isset($status) && $status ? 1 : 0 );
$private = ( isset($topic['private']) && $topic['private'] ? 1 : 0 );
if(isset($name)) $name = strip_tags(trim($name));
if(isset($email)) $email = strip_tags(trim($email));
do_action( 'wpforo_before_add_post', $post );
$fields = array('forumid' => $forumid,
'topicid' => $topicid,
'parentid' => $parentid,
'userid' => $userid,
'title' => stripslashes($title),
'body' => stripslashes($body),
'created' => $created,
'modified' => $created,
'status' => $status,
'private' => $private,
'name' => $name,
'email' => $email,
'root' => $root );
$values = array('%d','%d','%d','%d','%s','%s','%s','%s','%d','%d','%s','%s','%d');
if(!$root_exists){ unset($fields['root']); unset($fields[12]); }
if( WPF()->db->insert(
WPF()->tables->posts,
$fields,
$values
)
){
$postid = WPF()->db->insert_id;
$post['postid'] = $postid;
$post['status'] = $status;
$post['private'] = $private;
$post['posturl'] = $this->get_post_url($postid);
if( $root_exists ) {
WPF()->topic->rebuild_threads( $topic, $root );
}
if ( !$status ) {
$answ_incr = '';
$comm_incr = '';
if ( WPF()->forum->get_layout($forum) == 3 ) {
if ( $parentid ) {
$comm_incr = ', `comments` = `comments` + 1 ';
} else {
$answ_incr = ', `answers` = `answers` + 1 ';
}
}
WPF()->db->query( "UPDATE `" . WPF()->tables->profiles . "` SET `posts` = `posts` + 1 $answ_incr $comm_incr WHERE `userid` = " . wpforo_bigintval( $userid ) );
WPF()->topic->rebuild_first_last( $topic );
WPF()->topic->rebuild_stats( $topic );
WPF()->forum->rebuild_last_infos( $forum['forumid'] );
WPF()->forum->rebuild_stats( $forum['forumid'] );
}
do_action( 'wpforo_after_add_post', $post, $topic, $forum );
wpforo_clean_cache('post', $postid, $post);
WPF()->member->reset($userid);
WPF()->notice->add('You successfully replied', 'success');
return $postid;
}
WPF()->notice->add('Reply request error', 'error');
return FALSE;
}
public function edit( $args = array() ){
//This variable will be based on according CAN of guest usergroup once Guest Posing is ready
$guestposting = false;
if( empty($args) && (!isset($_REQUEST['post']) || empty($_REQUEST['post'])) ) return FALSE;
if( empty($args) && !empty($_REQUEST['post']) ) $args = $_REQUEST['post'];
if( isset($args['name']) ){ $args['name'] = strip_tags($args['name']); }
if( isset($args['email']) ){ $args['email'] = sanitize_email($args['email']); }
do_action( 'wpforo_start_edit_post', $args );
if( !isset($args['postid']) || !$args['postid'] || !is_numeric($args['postid']) ){
WPF()->notice->add('Cannot update post data', 'error');
return FALSE;
}
$args['postid'] = intval($args['postid']);
if( !$post = $this->get_post($args['postid']) ){ WPF()->notice->add('No Posts found for update', 'error'); return FALSE; }
if( !is_user_logged_in() ){
if( !isset($post['email']) || !$post['email'] ){
WPF()->notice->add('Permission denied', 'error');
return FALSE;
}
elseif( !wpforo_current_guest( $post['email'] ) ){
WPF()->notice->add('You are not allowed to edit this post', 'error');
return FALSE;
}
if( !$args['name'] || !$args['email'] ){
WPF()->notice->add('Please insert required fields!', 'error');
return FALSE;
}
else{
WPF()->member->set_guest_cookies( $args );
}
}
$args['userid'] = $post['userid'];
$args['status'] = $post['status'];
if( isset($args['userid']) && $args['userid'] == 0 && isset($args['name']) && isset($args['email']) ) $guestposting = true;
$args = apply_filters('wpforo_edit_post_data_filter', $args);
if(empty($args)) return FALSE;
extract($args, EXTR_OVERWRITE);
if( !$guestposting ){
$diff = current_time( 'timestamp', 1 ) - strtotime($post['created']);
if( !(WPF()->perm->forum_can('er', $post['forumid']) ||
(WPF()->current_userid == $post['userid'] && WPF()->perm->forum_can('eor', $post['forumid'])) )
){
WPF()->notice->add('You don\'t have permission to edit post from this forum', 'error');
return FALSE;
}
if(!WPF()->perm->forum_can('er', $post['forumid']) &&
$this->options['eor_durr'] !== 0 &&
$diff > $this->options['eor_durr']){
WPF()->notice->add('The time to edit this post is expired.', 'error');
return FALSE;
}
}
$title = (isset($title) ? wpforo_text( trim($title), 250, false ) : '');
$body = ( isset($body) ? preg_replace('#[\r\n\t\s\0]*#isu', "\r\n", $body) : '' );
$body = wpforo_kses(trim($body), 'post');
$topicid = wpforo_bigintval( (isset($topicid) ? $topicid : $post['topicid']) );
$title = trim($title) ? stripslashes(sanitize_text_field(trim($title))) : stripslashes($post['title']);
$body = $body ? stripslashes($body) : stripslashes($post['body']);
$status = isset($status) ? intval($status) : intval($post['status']);
$private = isset($private) ? intval($private) : intval($post['private']);
$name = isset($name) ? stripslashes(strip_tags(trim($name))) : stripslashes($post['name']);
$email = isset($email) ? stripslashes(strip_tags(trim($email))) : stripslashes($post['email']);
if( FALSE !== WPF()->db->update(
WPF()->tables->posts,
array(
'title' => $title,
'body' => $body,
'modified' => current_time( 'mysql', 1 ),
'status' => $status,
'name' => $name,
'email' => $email,
),
array('postid' => $postid),
array('%s','%s','%s','%d','%s','%s'),
array('%d')
)
){
$post['topicid'] = $topicid;
$post['title'] = $title;
$post['body'] = $body;
$post['status'] = $status;
$post['private'] = $private;
$post['name'] = $name;
$post['email'] = $email;
do_action( 'wpforo_after_edit_post', $post, $args );
wpforo_clean_cache('post', $postid, $post);
WPF()->notice->add('This post successfully edited', 'success');
return $postid;
}
WPF()->notice->add('Reply request error', 'error');
return FALSE;
}
#################################################################################
/**
* Delete post from DB
* Returns true if successfully deleted or false.
*
* @since 1.0.0
*
* @param int $postid
* @param bool $delete_cache
* @param bool $rebuild_data
* @param array &$exclude
* @param bool $check_permissions
*
* @return bool
*/
function delete( $postid, $delete_cache = true, $rebuild_data = true, &$exclude = array(), $check_permissions = true ){
$postid = intval($postid);
$exclude = (array) $exclude;
if( !$post = $this->get_post($postid) ) return true;
do_action('wpforo_before_delete_post', $post);
$diff = current_time( 'timestamp', 1 ) - strtotime($post['created']);
if( $check_permissions && (!(WPF()->perm->forum_can('dr', $post['forumid']) ||
(WPF()->current_userid == $post['userid'] &&
WPF()->perm->forum_can('dor', $post['forumid']) ))) ){
WPF()->notice->add('You don\'t have permission to delete post from this forum', 'error');
return FALSE;
}
if( $check_permissions && (!WPF()->perm->forum_can('dr', $post['forumid']) &&
$this->options['dor_durr'] !== 0 &&
$diff > $this->options['dor_durr']) ){
WPF()->notice->add('The time to delete this post is expired.', 'error');
return FALSE;
}
//Find and delete default attachments before deleting post
$this->delete_attachments( $postid );
//Delete post
if( WPF()->db->delete(WPF()->tables->posts, array( 'postid' => $postid ), array( '%d' )) ){
WPF()->db->delete(
WPF()->tables->likes, array( 'postid' => $postid ), array( '%d' )
);
WPF()->db->delete(
WPF()->tables->votes, array( 'postid' => $postid ), array( '%d' )
);
$answ_incr = '';
$comm_incr = '';
$layout = WPF()->forum->get_layout($post['forumid']);
if($layout == 3){
if($post['parentid']){
$comm_incr = ', `comments` = IF( (`comments` - 1) < 0, 0, `comments` - 1 ) ';
}else{
$answ_incr = ', `answers` = IF( (`answers` - 1) < 0, 0, `answers` - 1 ) ';
}
}
if( isset($post['parentid']) ){
if( !$post['is_first_post'] && $layout == 4 ){
if( $post['parentid'] == 0 ){
$replies = WPF()->db->get_results( "SELECT `postid` FROM `".WPF()->tables->posts."` WHERE `root` = " . wpforo_bigintval($postid), ARRAY_A );
} else {
$children = array();
$replies = $this->get_children( $postid, $children, true );
}
if( !empty( $replies ) ){
foreach( $replies as $reply ){
if( !in_array($reply['postid'], $exclude) ){
$exclude[] = $reply['postid'];
$this->delete( $reply['postid'], false, false , $exclude, false);
}
}
}
} elseif( $post['parentid'] != 0 ) {
WPF()->db->query("UPDATE `".WPF()->tables->posts."` SET `parentid` = " . wpforo_bigintval($post['parentid']) . " WHERE `parentid` = " . wpforo_bigintval($postid) );
}
}
if( $rebuild_data ){
if( !$post['is_first_post'] && $layout == 4 ){
WPF()->topic->rebuild_threads($post['topicid']);
}
WPF()->topic->rebuild_first_last($post['topicid']);
WPF()->topic->rebuild_stats($post['topicid']);
WPF()->forum->rebuild_last_infos($post['forumid']);
WPF()->forum->rebuild_stats($post['forumid']);
}
if( false !== WPF()->db->query( "UPDATE IGNORE `".WPF()->tables->profiles."` SET `posts` = IF( (`posts` - 1) < 0, 0, `posts` - 1 ) $answ_incr $comm_incr WHERE `userid` = " . wpforo_bigintval($post['userid']) ) ){
WPF()->member->reset($post['userid']);
}
WPF()->notice->add('This post successfully deleted', 'success');
do_action('wpforo_after_delete_post', $post);
if( $post['is_first_post'] ) return WPF()->topic->delete($post['topicid']);
if( $delete_cache ) wpforo_clean_cache('post', $postid, $post);
return TRUE;
}
WPF()->notice->add('Post delete error', 'error');
return FALSE;
}
#################################################################################
/**
* @since 1.0.0
*
* @param int $postid
* @param bool $protect
*
* @return array
*/
function get_post( $postid, $protect = true ){
$cache = WPF()->cache->on('memory_cashe');
if( $cache && isset(self::$cache['post'][$postid]) ) return self::$cache['post'][$postid];
$sql = "SELECT * FROM `".WPF()->tables->posts."` WHERE `postid` = " . wpforo_bigintval($postid);
$post = (array) WPF()->db->get_row($sql, ARRAY_A);
if(!empty($post)) $post['userid'] = wpforo_bigintval($post['userid']);
if( $protect ){
if( isset($post['forumid']) && $post['forumid'] && !WPF()->perm->forum_can('vf', $post['forumid']) ){
return array();
}
if( isset($post['status']) && $post['status'] && !wpforo_is_owner($post['userid'], $post['email'])){
if( isset($post['forumid']) && $post['forumid'] && !WPF()->perm->forum_can('au', $post['forumid']) ){
return array();
}
}
}
if($cache) self::$cache['post'][$postid] = $post;
$post = apply_filters('wpforo_get_post', $post);
return $post;
}
/**
* get all posts based on provided arguments
*
* @since 1.0.0
*
* @param array $args
* @param int $items_count
* @param bool $count
*
* @return array
*/
function get_posts($args = array(), &$items_count = 0, $count = true ){
$cache = WPF()->cache->on('object_cashe');
$default = array(
'include' => array(), // array( 2, 10, 25 )
'exclude' => array(), // array( 2, 10, 25 )
'forumids' => array(),
'topicid' => null, // topic id in DB
'forumid' => null, // forum id in DB
'parentid' => null, // parent post id
'root' => null, // root postid
'userid' => null, // user id in DB
'orderby' => '`is_first_post` DESC, `created` ASC, `postid` ASC', // forumid, order, parentid
'order' => '', // ASC DESC
'offset' => null, // this use when you give row_count
'row_count' => null, // 4 or 1 ...
'status' => null, // 0 or 1 ...
'private' => null, // 0 or 1 ...
'email' => null, // example@example.com ...
'check_private' => true,
'where' => null,
'owner' => null,
'cache_type' => 'sql', // sql or args
'limit_per_topic' => null,
'union_first_post' => false,
'is_first_post' => null,
'is_answer' => null,
'threaded' => false,
);
$request = $args;
if( empty($args['orderby']) ) $args['order'] = '';
$args = wpforo_parse_args( $args, $default );
if( $args['row_count'] === 0 ) return array();
if( $args['forumid'] && $args['check_private'] && !WPF()->perm->forum_can('vf', $args['forumid']) ) return array();
if( strtoupper( $args['order'] ) != 'DESC' && strtoupper( $args['order'] ) != 'ASC' ) $args['order'] = '';
if(!wpforo_root_exist() && !is_null($args['root']) ) { $args['parentid'] = $args['root']; $args['root'] = NULL; }
$wheres = $this->get_posts_conditions( $args );
$ordering = ( $args['orderby'] ? " ORDER BY " . esc_sql( $args['orderby'] . ' ' . $args['order'] ) : '' );
$limiting = ( $args['row_count'] ? " LIMIT " . intval( $args['offset'] ) . "," . intval( $args['row_count'] ) : '' );
if( $limit_per_topic = intval($args['limit_per_topic']) ){
$sql = "SELECT SUBSTRING_INDEX( GROUP_CONCAT(`postid` ORDER BY `created` DESC), ',', " . $limit_per_topic . " ) postids
FROM `".WPF()->tables->posts."` ".
($wheres ? " WHERE " . implode(" AND ", $wheres) : '')
." GROUP BY `topicid` ORDER BY MAX(`postid`) DESC " . $limiting;
return WPF()->db->get_col($sql);
} else {
$sql = "SELECT * FROM `".WPF()->tables->posts."`";
if(!empty($wheres)){
$sql .= " WHERE " . implode(" AND ", $wheres);
}
if( $count ){
$item_count_sql = preg_replace('#SELECT.+?FROM#isu', 'SELECT count(*) FROM', $sql, 1);
if( $item_count_sql ) $items_count = WPF()->db->get_var($item_count_sql);
}
$sql .= $ordering . $limiting;
if( $args['union_first_post'] && $args['topicid'] && !$args['parentid'] && $items_count > intval( $args['offset'] ) ){
$sql = "( SELECT * FROM `".WPF()->tables->posts."`
WHERE `topicid` = ".wpforo_bigintval($args['topicid'])."
AND `is_first_post` = 1 )
UNION
( " . $sql . " )";
}
if( $cache ){
if( $args['cache_type'] == 'sql' ){
$object_key = md5( $sql . WPF()->current_user_groupid );
$object_cache = WPF()->cache->get($object_key);
if(!empty($object_cache)){
return $object_cache['items'];
}
}
if( $args['cache_type'] == 'args' ){
$hach = serialize($request);
$cache_args_key = md5( $hach . WPF()->current_user_groupid );
$object_cache = WPF()->cache->get($cache_args_key, 'loop', 'post');
if(!empty($object_cache)){
return $object_cache['items'];
}
}
}
$posts = WPF()->db->get_results($sql, ARRAY_A);
$posts = apply_filters('wpforo_get_posts', $posts);
if( $args['check_private'] && !$args['forumid'] ){
$posts = $this->access_filter( $posts, $args['owner'] );
}
if($cache && isset($object_key) && !empty($posts)){
self::$cache['posts'][$object_key]['items'] = $posts;
self::$cache['posts'][$object_key]['items_count'] = $items_count;
if(isset($cache_args_key) && $args['cache_type'] == 'args' ){
WPF()->cache->create_custom( $request, $posts, 'post', $items_count );
}
}
return $posts;
}
}
function get_posts_conditions( $args = array() ){
$wheres = array();
$table_as_prefix = '`'.WPF()->tables->posts.'`.';
$args['include'] = wpforo_parse_args( $args['include'] );
$args['exclude'] = wpforo_parse_args( $args['exclude'] );
$args['forumids'] = wpforo_parse_args( $args['forumids'] );
if(!empty($args['include'])) $wheres[] = $table_as_prefix . "`postid` IN(" . implode(',', array_map('wpforo_bigintval', $args['include'])) . ")";
if(!empty($args['exclude'])) $wheres[] = $table_as_prefix . "`postid` NOT IN(" . implode(',', array_map('wpforo_bigintval', $args['exclude'])) . ")";
if(!empty($args['forumids'])) $wheres[] = $table_as_prefix . "`forumid` IN(" . implode(',', array_map('intval', $args['forumids'])) . ")";
if(!is_null($args['topicid'])) $wheres[] = $table_as_prefix . "`topicid` = " . wpforo_bigintval($args['topicid']);
if(!is_null($args['parentid'])) $wheres[] = $table_as_prefix . "`parentid` = " . wpforo_bigintval($args['parentid']);
if(!is_null($args['root'])) $wheres[] = $table_as_prefix . "`root` = " . wpforo_bigintval($args['root']);
if(!is_null($args['userid'])) $wheres[] = $table_as_prefix . "`userid` = " . wpforo_bigintval($args['userid']);
if(!is_null($args['status'])) $wheres[] = $table_as_prefix . "`status` = " . intval( (bool) $args['status']);
if(!is_null($args['private'])) $wheres[] = $table_as_prefix . "`private` = " . intval( (bool) $args['private']);
if(!is_null($args['is_first_post'])) $wheres[] = $table_as_prefix . "`is_first_post` = " . intval( (bool) $args['is_first_post']);
if(!is_null($args['is_answer'])) $wheres[] = $table_as_prefix . "`is_answer` = " . intval( (bool) $args['is_answer']);
if(!is_null($args['email'])) $wheres[] = $table_as_prefix . "`email` = '" . esc_sql($args['email']) . "' ";
if(!is_null($args['where'])) $wheres[] = $table_as_prefix . $args['where'];
if(wpfval($args, 'forumid') && $args['check_private']){
/////Check "View Reply" Access//////////////////////////////
if( !WPF()->perm->forum_can('vr', $args['forumid']) ){
$wheres[] = $table_as_prefix . " `is_first_post` = 1";
}
/////Check Unapproved Post Access////////////////////////////
if( WPF()->perm->forum_can('au', $args['forumid']) ){
//Check "Can Approve/Unapprove Posts" Access (View Unapproved Posts)
if(!is_null($args['status'])) $wheres[] = $table_as_prefix . " `status` = " . intval($args['status']);
}
elseif( WPF()->current_userid ){
//Allow Users see own unapproved posts
$wheres[] = " ( " . $table_as_prefix . "`status` = 0 OR (" . $table_as_prefix . "`status` = 1 AND " . $table_as_prefix . "`userid` = " .intval(WPF()->current_userid). ") )";
}
elseif( WPF()->current_user_email ){
//Allow Guests see own unapproved posts
$wheres[] = " ( " . $table_as_prefix . "`status` = 0 OR (" . $table_as_prefix . "`status` = 1 AND " . $table_as_prefix . "`email` = '" . sanitize_email(WPF()->current_user_email) . "') )";
}
else{
//If doesn't have "Can Approve/Unapprove Posts" access and not Owner, only return approved posts
$wheres[] = " " . $table_as_prefix . "`status` = 0";
}
}
return $wheres;
}
function access_filter( $posts, $owner = NULL ){
if( !empty($posts) ){
foreach($posts as $key => $post){
if(!$this->access($post, $owner)) unset($posts[$key]);
}
}
return $posts;
}
function access( $post, $owner = NULL ){
if( isset($post['forumid']) && !WPF()->perm->forum_can('vf', $post['forumid']) ){
return false;
}
if( isset($post['forumid']) && !wpfval($post, 'is_first_post') && !WPF()->perm->forum_can('vr', $post['forumid']) ){
return false;
}
if( isset($post['forumid']) && isset($post['private']) && $post['private'] && !$owner ){
if(!WPF()->perm->forum_can('vp', $post['forumid'])){
if(is_null($owner)){
$topic_userid = wpforo_topic($post['topicid'], 'userid');
if(!wpforo_is_owner($topic_userid) && !wpforo_is_owner($post['userid'])){
return false;
}
}else{
return false;
}
}
}
if( isset($post['forumid']) && isset($post['status']) && $post['status'] && !wpforo_is_owner($post['userid'], $post['email']) ){
if( !WPF()->perm->forum_can('au', $post['forumid']) ){
return false;
}
}
return true;
}
function replies( array $posts, $topic = array(), $forum = array(), $level = 0 ) {
$level++;
if( function_exists('wpforo_thread_reply') ){
if( wpfval($posts, 'posts') ){
$key = key($posts['posts']);
$parentid = (wpfval($posts, 'posts', $key,'parentid')) ? $posts['posts'][$key]['parentid'] : 0;
$max_level = $this->options['layout_threaded_nesting_level'];
if( !$max_level ){
$class = ( $level > 1 ) ? '' : ' level-1';
} elseif( $level > ( $max_level + 1 ) ) {
$class = '';
} else {
$class = ' level-' . $level;
}
echo '';
foreach ( $posts['posts'] as $post ) {
$parents = ( wpfval($posts, 'parents') ) ? $posts['parents'] : array();
wpforo_thread_reply( $post, $topic, $forum, $level, $parents );
if ( !empty($post['children']) ) {
$posts['posts'] = $post['children'];
$this->replies($posts, $topic, $forum, $level );
}
}
echo '';
}
} else{
wpforo_phrase('Function wpforo_thread_reply() not found.');
}
}
function get_thread_tree( $post, $parents = true ){
if(!wpfval($post, 'postid') || (wpfkey($post, 'root') && $post['root'] == -1) ) {
return array('posts' => array(), 'parents' => array(), 'count' => 0, 'children' => '' );
}
$items = array();
$thread = array();
$parentid = $post['postid'];
$type = apply_filters('wpforo_thread_builder_type', 'topic-query'); //'topic-query', 'inside-mysql', 'multi-query'
if( $type == 'topic-query' ) {
if( wpfval($post, 'topicid') ){
$args = array( 'root' => $post['postid'], 'orderby' => '`created` ASC' );
$posts = $this->get_posts( $args, $items_count, false);
if( empty($posts) ){
$args = array( 'topicid' => $post['topicid'], 'orderby' => '`created` ASC' );
$posts = $this->get_posts( $args, $items_count, false);
}
if( !empty($posts) ){
foreach( $posts as $post ){
$items[$post['postid']] = $post;
}
$thread = $this->build_thread_data( $parentid, $items );
}
}
}
elseif( $type == 'inside-mysql' ){
$mod = ( wpforo_current_user_is('admin') || wpforo_current_user_is('moderator') ) ? true : false;
$sql = "SELECT GROUP_CONCAT( @id := ( SELECT GROUP_CONCAT(postid,'-', parentid, '-', userid, '-', status, '-', email) FROM `" . WPF()->tables->posts . "` WHERE parentid = @id ) ) AS tree
FROM ( SELECT @id := " . intval($parentid) . " ) vars STRAIGHT_JOIN `" . WPF()->tables->posts . "` WHERE @id IS NOT NULL";
if( $posts = WPF()->db->get_var($sql) ){
$posts = explode(',', $posts);
if(!empty($posts)){
foreach($posts as $post) {
$post = explode('-', $post);
if( !$mod && isset($post[3]) && $post[3] ){
if( isset($post[2]) && isset($post[4]) && ( isset(WPF()->current_user['ID']) || isset(WPF()->current_user['user_email']) ) ){
if( WPF()->current_user['ID'] != $post[2] && WPF()->current_user['user_email'] != $post[4] ) continue;
}
}
if( isset($post[0]) && isset($post[1]) ){
$items[$post[0]] = array('postid' => $post[0], 'parentid' => $post[1]);
}
}
$thread = $this->build_thread_data( $parentid, $items );
}
}
}
elseif( $type == 'multi-query' ) {
$mod = ( wpforo_current_user_is('admin') || wpforo_current_user_is('moderator') ) ? true : false;
$items = $this->get_children( $parentid, $children, $mod );
$thread = $this->build_thread_data( $parentid, $items );
}
return $thread;
}
function build_thread_data( $parentid, $items = array(), $count = 0 ){
$parents = array();
$thread = array('posts' => array(), 'parents' => array(), 'count' => 0, 'children' => '' );
if( !empty($items) ){
foreach( $items as $item ){
$parents[$item['postid']] = $this->parents( $item['postid'], $items );
}
if( !empty($parents) ) $thread['parents'] = $parents;
$thread['posts'] = $this->build_thread_tree( $parentid, $items );
$children = $this->children( $parentid, $thread['posts']);
$thread['count'] = count($children);
$thread['children'] = array_keys($children);
}
return $thread;
}
function build_thread_tree( $parentid = 0, array $posts ) {
$tree = array();
foreach ( $posts as $post ) {
if ($post['parentid'] == $parentid) {
$children = $this->build_thread_tree( $post['postid'], $posts );
if ($children) {
$post['children'] = $children;
}
$tree[] = $post;
}
}
return $tree;
}
function root( $postid, $parentid = NULL ){
if( !$postid ) return 0;
$parents = $this->get_parents( $postid, $parentid );
$root = array_pop($parents);
return intval($root);
}
function get_root( $postid ){
if( !$postid || !wpforo_root_exist() ) return $postid;
$root = WPF()->db->get_var("SELECT `root` FROM `" . WPF()->tables->posts . "` WHERE `postid` = " . intval($postid) );
if( !is_null($root) && ( $root <= 0 || $root == $postid ) ){
$root = $postid;
} else {
$root = $this->root( $postid );
}
return $root;
}
function parents( $postid, $posts, $parents = array() ) {
if( !empty($posts) ){
if( isset($posts[$postid]) ){
$parentid = wpfval($posts[$postid], 'parentid') ? $posts[$postid]['parentid'] : 0;
if ($parentid > 0) {
array_unshift($parents, $parentid);
return $this->parents($parentid, $posts, $parents);
}
}
}
return $parents;
}
function get_parents( $postid, $parentid = NULL, &$parents = array(), $mod = false ) {
if( $postid ){
$status = ( !$mod ) ? ' AND `status` = 0 ': '';
if( is_null($parentid) ){
$where = "`postid` = " . intval($postid);
} else {
$where = "`postid` = " . intval($parentid);
}
if( $parentid === 0 ) {
return $parents;
} else {
$post = WPF()->db->get_row("SELECT `postid`, `parentid` FROM `" . WPF()->tables->posts . "` WHERE " . $where . $status, ARRAY_A );
if( wpfval($post, 'parentid') ){
$parents[ $post['postid'] ] = $post['parentid'];
$this->get_parents( $post['postid'], $post['parentid'], $parents, $mod );
}
}
}
return $parents;
}
function children( $parentid, $posts, &$children = array() ){
if( $parentid ){
if( !empty($posts) ){
foreach( $posts as $post ){
$children[ $post['postid'] ] = array('postid' => $post['postid'], 'parentid' => $post['parentid']);
if( isset($post['children']) ) $this->children($post['postid'], $post['children'], $children);
}
}
}
return $children;
}
function get_children( $parentid, &$children = array(), $mod = false ){
if( $parentid ){
$status = ( !$mod ) ? ' AND `status` = 0 ': '';
$posts = WPF()->db->get_results("SELECT `postid`, `parentid` FROM `" . WPF()->tables->posts . "` FORCE INDEX (PRIMARY) WHERE `parentid` = " . intval($parentid) ." " . $status, ARRAY_A );
if( !empty($posts) ){
foreach( $posts as $post ){
$children[ $post['postid'] ] = array('postid' => $post['postid'], 'parentid' => $post['parentid']) ;
$this->get_children( $post['postid'], $children, $mod );
}
}
}
return $children;
}
function get_root_replies_count( $postid ){
if( $postid && wpforo_root_exist() ) {
return WPF()->db->get_var("SELECT COUNT(*) FROM `" . WPF()->tables->posts . "` WHERE `root` = " . intval($postid) );
} else {
return WPF()->db->get_var("SELECT COUNT(*) FROM `" . WPF()->tables->posts . "` WHERE `parentid` = " . intval($postid) );
}
}
function get_posts_filtered( $args = array() ){
$posts = $this->get_posts( $args, $items_count, false );
if( !empty($posts) ){
foreach($posts as $key => $post){
if( isset($post['forumid']) && !WPF()->perm->forum_can('vf', $post['forumid']) ){
unset($posts[$key]);
}
if( isset($posts[$key]) && isset($post['forumid']) && isset($post['private']) && $post['private'] && !wpforo_is_owner($post['userid'], $post['email']) ){
if( !WPF()->perm->forum_can('vp', $post['forumid']) ){
unset($posts[$key]);
}
}
if( isset($posts[$key]) && isset($post['forumid']) && isset($post['status']) && $post['status'] && !wpforo_is_owner($post['userid'], $post['email']) ){
if( !WPF()->perm->forum_can('au', $post['forumid']) ){
unset($posts[$key]);
}
}
}
}
return $posts;
}
function search( $args = array(), &$items_count = 0 ){
if(!is_array($args)) $args = array('needle' => $args);
if(!wpfval($args, 'needle')) return array();
$args = array_filter($args);
$default = array(
'needle' => '', // search needle
'forumids' => array(), // array( 2, 10, 25 )
'postids' => array(), // array( 2, 10, 25 )
'date_period' => 0, // topic id in DB
'type' => 'entire-posts', // search type ( entire-posts | titles-only | user-posts | user-topics | tag )
'orderby' => 'relevancy', // Sort Search Results by ( relevancy | date | user | forum )
'order' => 'DESC', // Sort Search Results ( ASC | DESC )
'offset' => NULL, // this use when you give row_count
'row_count' => NULL // 4 or 1 ...
);
$args = wpforo_parse_args( $args, $default );
$args['postids'] = wpforo_parse_args($args['postids']);
$args['postids'] = array_filter(array_map('wpforo_bigintval', $args['postids']));
$args['order'] = strtoupper($args['order']);
if( !in_array($args['order'], array('ASC', 'DESC')) ) $args['order'] = 'DESC';
$date_period = intval($args['date_period']);
$fa = "p";
$from = "`".WPF()->tables->posts."` " . $fa;
$selects = array($fa.'.`postid`', $fa.'.`topicid`', $fa.'.`private`', $fa.'.`status`', $fa.'.`forumid`', $fa.'.`userid`', $fa.'.`title`', $fa.'.`created`', $fa.'.`body`', $fa.'.`is_first_post`' );
$innerjoins = array();
$wheres = array();
$orders = array();
if($args['forumids']) $wheres[] = $fa.".`forumid` IN(" . implode(', ', array_map('intval', $args['forumids'])) . ")";
if( $date_period != 0 ){
$date = date( 'Y-m-d H:i:s', current_time( 'timestamp', 1 ) - ($date_period * 24 * 60 * 60) );
if($date) $wheres[] = $fa.".`created` > '".esc_sql($date)."'";
}
if($args['needle']){
if( in_array($args['type'], array('entire-posts', 'titles-only')) ){
$words = str_word_count($args['needle'], 1);
$words = array_slice($words, 0, 10);
$words = array_map(function($w){
return '+' . esc_sql( str_replace(array('(', ')', '*', '+', '-', '~', '<', '>', '@', '"'), '', $w) ) . '*';
}, $words);
$needle = implode(' ', $words);
}else{
$needle = esc_sql( $args['needle'] );
}
if($args['type'] === 'entire-posts'){
$selects[] = "MATCH(".$fa.".`title`) AGAINST('$needle' IN BOOLEAN MODE) + MATCH(".$fa.".`body`) AGAINST('$needle' IN BOOLEAN MODE) AS matches";
$wheres[] = "( MATCH(".$fa.".`title`, ".$fa.".`body`) AGAINST('$needle' IN BOOLEAN MODE) OR ".$fa.".`title` LIKE '%". esc_sql( $args['needle'] ) ."%' OR ".$fa.".`body` LIKE '%". esc_sql( $args['needle'] ) ."%' )";
$orders[] = "matches";
$orders[] = "`created`";
}elseif($args['type'] === 'titles-only'){
$selects[] = "MATCH(".$fa.".`title`) AGAINST('$needle' IN BOOLEAN MODE) AS matches";
$wheres[] = "( MATCH(".$fa.".`title`) AGAINST('$needle' IN BOOLEAN MODE) OR ".$fa.".`title` LIKE '%". esc_sql( $args['needle'] ) ."%' )";
$orders[] = "matches";
$orders[] = "`created`";
}elseif($args['type'] === 'user-posts' || $args['type'] === 'user-topics'){
$innerjoins[] = "INNER JOIN `".WPF()->db->users."` u ON u.`ID` = ".$fa.".`userid`";
$wheres[] = "( u.`user_nicename` LIKE '%{$needle}%' OR u.`display_name` LIKE '%{$needle}%' )";
if($args['type'] === 'user-topics') $wheres[] = "".$fa.".`is_first_post` = 1";
}elseif($args['type'] === 'tag'){
$fa = "t";
$from = "`".WPF()->tables->topics."` " . $fa;
$selects = array($fa.'.`first_postid` AS postid', $fa.'.`topicid`', $fa.'.`private`', $fa.'.`status`', $fa.'.`forumid`', $fa.'.`userid`', $fa.'.`title`', $fa.'.`created`', '1 AS `is_first_post`');
$innerjoins = array();
$wheres = array( "( ".$fa.".`tags` LIKE '%{$needle}%' )" );
// $wheres = array( "( FIND_IN_SET('{$needle}', ".$fa.".`tags`) )" ); //exact version
}
}
if( $args['postids'] ) $wheres[] = "(".$fa.".`postid` IN(". implode(',', $args['postids']) ."))";
if($args['orderby'] === 'date'){
$orders = array($fa.'.`created`');
}elseif($args['orderby'] === 'user'){
$orders = array($fa.'.`userid`');
}elseif($args['orderby'] === 'forum'){
$orders = array($fa.'.`forumid`');
}
$sql = "SELECT COUNT(*) FROM " . $from . " " . implode(' ', $innerjoins);
if($wheres) $sql .= " WHERE " . implode( " AND ", $wheres );
$items_count = (int) WPF()->db->get_var($sql);
if( $this->options['search_max_results'] && $items_count > $this->options['search_max_results'] ) $items_count = (int) $this->options['search_max_results'];
$sql = "SELECT " . implode(', ', $selects) . " FROM " . $from . " " . implode(' ', $innerjoins);
if($wheres) $sql .= " WHERE " . implode( " AND ", $wheres );
if($orders) $sql .= " ORDER BY " . implode(' ' . $args['order'] . ', ', $orders) . " " . $args['order'];
if( $this->options['search_max_results'] ) $sql = "SELECT * FROM (" . $sql . " LIMIT ". $this->options['search_max_results'] .") AS p";
if( $args['row_count'] ) $sql .= " LIMIT " . intval($args['offset']) . "," . intval($args['row_count']);
$posts = WPF()->db->get_results($sql, ARRAY_A);
do_action( 'wpforo_search_result_after', $args, $items_count, $posts, $sql );
foreach($posts as $key => $post){
if( !WPF()->perm->forum_can( 'vf', $post['forumid'] ) ) unset($posts[$key]);
if( !WPF()->perm->forum_can( 'vt', $post['forumid'] ) ) unset($posts[$key]);
if( !$post['is_first_post'] && !WPF()->perm->forum_can( 'vr', $post['forumid'] ) ) unset($posts[$key]);
if( $post['private'] && !WPF()->perm->forum_can( 'vp', $post['forumid'] ) ) unset($posts[$key]);
if( $post['status'] && !WPF()->perm->forum_can( 'au', $post['forumid'] ) ) unset($posts[$key]);
}
return $posts;
}
/**
* return likes count by post id
*
* Return likes count
*
* @since 1.0.0
*
* @param int
*
* @return int
*/
function get_post_likes_count($postid){
return WPF()->db->get_var( WPF()->db->prepare( "SELECT COUNT(`likeid`) FROM `".WPF()->tables->likes."` WHERE `postid` = %d", $postid ) );
}
/**
* return usernames who likes this post
*
* Return array with username
*
* @since 1.0.0
*
* @param int
*
* @return array
*/
function get_likers_usernames($postid){
return WPF()->db->get_results("SELECT u.ID, u.display_name FROM `".WPF()->tables->likes."` l, `".WPF()->db->users."` u WHERE `l`.`userid` = `u`.ID AND `l`.`postid` = ".intval($postid)." ORDER BY l.`userid` = " . intval(WPF()->current_userid) . " DESC, l.`likeid` DESC LIMIT 3", ARRAY_A);
}
/**
* return like ID or null
*
* @since 1.0.0
*
* @param int int
*
* @return null or like id
*/
function is_liked($postid, $userid){
$returned_value = WPF()->db->get_var("SELECT likeid FROM `".WPF()->tables->likes."` WHERE `postid` = ".intval($postid)." AND `userid` = ".intval($userid) );
if(is_null($returned_value)){
return FALSE;
}else{
return $returned_value;
}
}
/**
* return votes sum by post id
*
* Return votes count
*
* @since 1.0.0
*
* @param int
*
* @return int
*/
function get_post_votes_sum($postid){
$sum = WPF()->db->get_var("SELECT sum(`reaction`) FROM `".WPF()->tables->votes."` WHERE `postid` = ".intval($postid) );
if($sum == null){
$sum = 0;
}
return $sum;
}
/**
* return forum slug
*
* string (slug)
*
* @since 1.0.0
*
* @param int
*
* @return string or false
*/
function get_forumslug_byid($postid){
$cache = WPF()->cache->on('memory_cashe');
if( $cache && isset(self::$cache['forum_slug'][$postid]) ){
return self::$cache['forum_slug'][$postid];
}
$slug = WPF()->db->get_var("SELECT `slug` FROM ".WPF()->tables->forums." WHERE `forumid` =(SELECT forumid FROM `".WPF()->tables->topics."` WHERE `topicid` =(SELECT `topicid` FROM `".WPF()->tables->posts."` WHERE postid = ".intval($postid)."))");
if($cache && isset($postid)){
self::$cache['forum_slug'][$postid] = $slug;
}
if($slug){
return $slug;
}else{
return FALSE;
}
}
/**
* return topic slug
*
* string (slug)
*
* @since 1.0.0
*
* @param int
*
* @return string or false
*/
function get_topicslug_byid( $postid ){
$cache = WPF()->cache->on('memory_cashe');
if( $cache && isset(self::$cache['topic_slug'][$postid]) ){
return self::$cache['topic_slug'][$postid];
}
$slug = WPF()->db->get_var("SELECT `slug` FROM ".WPF()->tables->topics." WHERE `topicid` =(SELECT `topicid` FROM `".WPF()->tables->posts."` WHERE postid = ".intval($postid).")");
if($cache && isset($postid)){
self::$cache['topic_slug'][$postid] = $slug;
}
if($slug){
return $slug;
}else{
return FALSE;
}
}
/**
* return post full url by id
*
* @since 1.0.0
*
* @param mixed $arg
* @param bool $absolute
*
* @return string $url
*/
function get_post_url( $arg, $absolute = true ) {
if ( isset( $arg ) && ! is_array( $arg ) ) {
$postid = wpforo_bigintval( $arg );
$post = $this->get_post( $postid, false );
} elseif ( ! empty( $arg ) && isset( $arg['postid'] ) ) {
$post = $arg;
$postid = $post['postid'];
}
if ( ! empty( $post ) && is_array( $post ) && !empty($postid) ) {
$forum_slug = (wpfval($post, 'forumid')) ? wpforo_forum($post['forumid'], 'slug') : $this->get_forumslug_byid( $postid );
$topic_slug = (wpfval($post, 'topicid')) ? wpforo_topic($post['topicid'], 'slug') : $this->get_topicslug_byid( $postid );
$url = $forum_slug . '/' . $topic_slug;
if ( $post['topicid'] ) {
$layout = WPF()->forum->get_layout( $post['forumid'] );
$pid = $postid;
if ( $post['parentid'] ) {
switch ( $layout ) {
case 3:
$pid = $post['parentid'];
break;
case 4:
$pid = $post['root'];
break;
}
}
$where = "";
$orderby = "`is_first_post` DESC, `created` ASC, `postid` ASC";
if ( $layout == 3 ) {
$where .= " AND NOT p.`parentid` ";
$orderby = "`is_first_post` DESC, `is_answer` DESC, `votes` DESC, `created` ASC, `postid` ASC";
} elseif ( $layout == 4 ) {
$where .= " AND NOT p.`parentid` ";
}
if ( ! wpforo_current_user_is( 'admin' ) && ! wpforo_current_user_is( 'moderator' ) && ! WPF()->perm->forum_can( 'au', $post['forumid'] ) ) {
if ( WPF()->current_userid ) {
$where .= " AND ( p.`status` = 0 OR (p.`status` = 1 AND p.`userid` = %d) ) ";
$where = WPF()->db->prepare( $where, WPF()->current_userid );
} elseif ( WPF()->current_user_email ) {
$where .= " AND ( p.`status` = 0 OR (p.`status` = 1 AND p.`email` = %s) ) ";
$where = WPF()->db->prepare( $where, sanitize_email( WPF()->current_user_email ) );
} else {
$where .= " AND NOT p.`status` ";
}
}
$sql = "SELECT tmp_view.`rownum` FROM
(SELECT @rownum := @rownum + 1 AS rownum, p.`postid`
FROM `" . WPF()->tables->posts . "` p
CROSS JOIN ( SELECT @rownum := 0 ) AS init_var
WHERE p.`topicid` = %d
" . $where . "
ORDER BY " . $orderby . ") AS tmp_view
WHERE tmp_view.`postid` = %d";
$position = wpforo_bigintval( WPF()->db->get_var( WPF()->db->prepare($sql, $post['topicid'], $pid) ) );
$items_per_page = $this->get_option_items_per_page($layout);
if ( $position <= $items_per_page ) {
return wpforo_home_url( $url, false, $absolute ) . "#post-" . wpforo_bigintval( $postid );
}
if ( $position && $items_per_page ) {
$paged = ceil( $position / $items_per_page );
} else {
$paged = 1;
}
return wpforo_home_url( $url . "/" . wpforo_get_template_slug('paged') . "/" . $paged, false, $absolute ) . "#post-" . wpforo_bigintval( $postid );
}
}
return wpforo_home_url();
}
/**
*
* @since 1.0.0
*
* @param int $postid
*
* @return int
*/
function is_answered( $postid ) {
$is_answered = WPF()->db->get_var( WPF()->db->prepare(
" SELECT is_answer
FROM `" . WPF()->tables->posts . "`
WHERE postid = %d
",
$postid
) );
return $is_answered;
}
function is_approved( $postid ){
$post = WPF()->db->get_var( "SELECT `status` FROM ".WPF()->tables->posts." WHERE `postid` = " . intval($postid) );
if( $post ) return FALSE;
return TRUE;
}
function get_count( $args = array() ){
$sql = "SELECT SQL_NO_CACHE COUNT(*) FROM `".WPF()->tables->posts."`";
if($args && is_array($args)){
$wheres = array();
foreach ($args as $key => $value) $wheres[] = "`$key` = '" . esc_sql($value) . "'";
if($wheres) $sql .= " WHERE " . implode(' AND ', $wheres);
}
return WPF()->db->get_var($sql);
}
function unapproved_count(){
return WPF()->db->get_var( "SELECT COUNT(*) FROM `".WPF()->tables->posts."` WHERE `status` = 1" );
}
function get_attachment_id( $filename ){
$attach_id = WPF()->db->get_var( "SELECT `post_id` FROM `".WPF()->db->postmeta."` WHERE `meta_key` = '_wp_attached_file' AND `meta_value` LIKE '%" . esc_sql($filename) . "' LIMIT 1");
return $attach_id;
}
function delete_attachments( $postid ){
$post = $this->get_post($postid);
if( isset($post['body']) && $post['body'] ){
if( preg_match_all('|\/wpforo\/default_attachments\/([^\s\"\]]+)|is', $post['body'], $attachments, PREG_SET_ORDER) ){
$upload_dir = wp_upload_dir();
$default_attachments_dir = $upload_dir['basedir'] . '/wpforo/default_attachments/';
foreach( $attachments as $attachment ){
$filename = trim($attachment[1]);
$file = $default_attachments_dir . $filename;
if( file_exists($file) ){
$posts = WPF()->db->get_var( "SELECT COUNT(*) as posts FROM `".WPF()->tables->posts."` WHERE `body` LIKE '%" . esc_sql( $attachment[0] ) . "%'" );
if( is_numeric($posts) && $posts == 1 ){
$attachmentid = $this->get_attachment_id( '/' . $filename );
if ( !wp_delete_attachment( $attachmentid ) ){
@unlink($file);
}
}
}
}
}
}
}
public function status( $postid, $status ){
if( !$postid = wpforo_bigintval($postid) ) return false;
if( !$post = $this->get_post( $postid, false ) ) return false;
if( $post['is_first_post'] ) {
WPF()->topic->status($post['topicid'], $status);
}
if( false !== WPF()->db->update(
WPF()->tables->posts,
array( 'status' => intval($status) ),
array( 'postid' => $postid ),
array( '%d' ),
array( '%d' )
)){
if( $status ){
$this->last_post($post, 'remove');
do_action( 'wpforo_post_unapprove', $post );
} else {
$this->last_post($post, 'add');
do_action( 'wpforo_post_approve', $post );
}
do_action( 'wpforo_post_status_update', $postid, $status );
wpforo_clean_cache('topic', $postid, $post);
WPF()->notice->add('Done!', 'success');
return true;
}
WPF()->notice->add('error: Change Status action', 'error');
return false;
}
public function last_post($post, $action = 'add'){
if( is_numeric($post) ) $post = $this->get_post($post, false);
if( !empty($post) && isset($post['postid']) && isset($post['topicid']) && isset($post['forumid']) && isset($post['userid']) ) {
if( $action == 'add' ){
$answ_incr = '';
$comm_incr = '';
if ( WPF()->forum->get_layout($post) == 3 ) {
if ( $post['parentid'] ) {
$comm_incr = ', `comments` = `comments` + 1 ';
} else {
$answ_incr = ', `answers` = `answers` + 1 ';
}
}
WPF()->db->query( "UPDATE `" . WPF()->tables->profiles . "` SET `posts` = `posts` + 1 $answ_incr $comm_incr WHERE `userid` = " . wpforo_bigintval( $post['userid'] ) );
$topic = WPF()->topic->get_topic($post['topicid']);
WPF()->topic->rebuild_first_last($topic);
WPF()->topic->rebuild_stats($topic);
WPF()->forum->rebuild_last_infos($post['forumid']);
WPF()->forum->rebuild_stats($post['forumid']);
} elseif( $action == 'remove' ) {
$comm_incr = '';
$answ_incr = '';
$layout = WPF()->forum->get_layout($post);
if($layout == 3){
if($post['parentid']){
$comm_incr = ', `comments` = IF( (`comments` - 1) < 0, 0, `comments` - 1 ) ';
}else{
$answ_incr = ', `answers` = IF( (`answers` - 1) < 0, 0, `answers` - 1 ) ';
}
}
WPF()->db->query( "UPDATE IGNORE `".WPF()->tables->profiles."` SET `posts` = IF( (`posts` - 1) < 0, 0, `posts` - 1 ) $answ_incr $comm_incr WHERE `userid` = " . wpforo_bigintval($post['userid']) );
$excerpt = ($post['is_first_post']) ? ' AND `topicid` != ' . intval($post['topicid']) . ' ' : ' AND `postid` != ' . intval($post['postid']) . ' ';
$last_topic_post = WPF()->db->get_row("SELECT * FROM `".WPF()->tables->posts."` WHERE `topicid` = " . intval($post['topicid']) . " AND `postid` != " . intval($post['postid']) . " AND `status` = 0 AND `private` = 0 ORDER BY `created` DESC, `postid` DESC LIMIT 1", ARRAY_A);
$last_forum_post = WPF()->db->get_row("SELECT * FROM `".WPF()->tables->posts."` WHERE `forumid` = " . intval($post['forumid']) . " " . $excerpt . " AND `status` = 0 AND `private` = 0 ORDER BY `created` DESC, `postid` DESC LIMIT 1", ARRAY_A);
if( !empty($last_topic_post) && !$last_topic_post['is_first_post'] ) {
$answers = ( !$last_topic_post['parentid'] ) ? ', `answers` = `answers` - 1 ' : '';
WPF()->db->query("UPDATE `".WPF()->tables->topics."` SET `last_post` = " . intval($last_topic_post['postid']) . ", `modified` = '" . esc_sql($last_topic_post['created']) . "', `posts` = `posts` - 1 " . $answers . " WHERE `topicid` = " . intval($post['topicid']) );
}
if( !empty($last_forum_post) ) {
$topics = ( $last_forum_post['is_first_post'] ) ? ', `topics` = `topics` - 1 ' : '';
WPF()->db->query("UPDATE `".WPF()->tables->forums."` SET `last_post_date` = '" . esc_sql($last_forum_post['created']) . "', `last_userid` = " . intval($last_forum_post['userid']). ", `last_topicid` = " . intval($last_forum_post['topicid']) . ", `last_postid` = " . intval($last_forum_post['postid']) . ", `posts` = `posts` - 1 " . $topics . " WHERE `forumid` = " . intval($last_forum_post['forumid']) );
} else {
WPF()->db->query("UPDATE `".WPF()->tables->forums."` SET `last_post_date` = '0000-00-00 00:00:00', `last_userid` = 0, `last_topicid` = 0, `last_postid` = 0, `posts` = 0, `topics` = 0 WHERE `forumid` = " . intval($post['forumid']) );
}
}
WPF()->member->reset($post['userid']);
}
}
public function next_post( $postid, $topicid = 0 ){
if( !$topicid ) $topicid = wpforo_post($postid, 'topicid');
if( $topicid ) $next_postid = WPF()->db->get_var("SELECT `postid` FROM `". WPF()->tables->posts ."` WHERE `topicid` = " . intval( $topicid ) ." AND `postid` > " . intval( $postid ) . " AND `status` = 0 ORDER BY `created` ASC LIMIT 1" );
return intval($next_postid);
}
public function get_liked_posts( $args = array(), &$items_count ){
$default = array(
'userid' => NULL,
'order' => 'DESC',
'offset' => NULL,
'row_count' => NULL,
'where' => NULL,
'var' => NULL
);
$posts = array();
if(!wpfval($args, 'userid')) return array();
$args = wpforo_parse_args( $args, $default );
if(is_array($args) && !empty($args)){
extract($args, EXTR_OVERWRITE);
if( $row_count === 0 ) return array();
$items_count = WPF()->db->get_var("SELECT COUNT(*) FROM `".WPF()->tables->likes."` WHERE `userid` = " . intval($userid) );
$liked_posts = WPF()->db->get_col("SELECT `postid` FROM `".WPF()->tables->likes."` WHERE `userid` = " . intval($userid) ." ORDER BY `likeid` " . esc_sql($order) . " LIMIT " . intval($offset) . ", " . intval($row_count));
if(empty($liked_posts)){
$items_count = WPF()->db->get_var("SELECT COUNT(*) FROM `".WPF()->tables->votes."` WHERE `userid` = " . intval($userid) );
$liked_posts = WPF()->db->get_col("SELECT `postid` FROM `".WPF()->tables->votes."` WHERE `userid` = " . intval($userid) ." AND `reaction` = 1 ORDER BY `voteid` " . esc_sql($order) . " LIMIT " . intval($offset) . ", " . intval($row_count));
}
if(!empty($liked_posts)){
if($var == 'postid'){
return $liked_posts;
}
else{
$liked_posts = implode(',', $liked_posts);
$post_args = array( 'include' => $liked_posts, 'status' => 0, 'private' => 0 );
$posts = $this->get_posts( $post_args );
}
}
}
return $posts;
}
public function get_unread_posts($args, $limit = 10){
$unread_posts = array();
//If the unread post logging is disabled return an empty array.
if( !wpforo_feature('view-logging') ) return $unread_posts;
//If there is no information about last read post.
//Max number recent posts to search unread posts in.
$args['row_count'] = apply_filters( 'wpforo_max_number_of_unread_posts', 100 );
//Find the last unread postid, if so, add 'where' condition.
$last_read_postid = WPF()->log->get_all_read( 'post' );
if( $last_read_postid ){
$args['where'] = '`postid` > ' . intval($last_read_postid);
}
//Find unread posts based on last read postid's in topics
$posts = $this->get_posts($args);
$read_topics = WPF()->log->get_read_topics();
if( !empty($posts) ){
if( !empty($read_topics) ){
foreach( $posts as $key => $post ){
if( $key == $limit ) break;
if( !wpfkey($post, 'topicid') && $post ){
$post_ids = explode(',', $post);
if(!empty($post_ids)){
foreach( $post_ids as $post_id ){
$topicid = wpforo_post($post_id, 'topicid');
if( $topicid == wpfval(WPF()->current_object, 'topicid') ) continue;
if( wpfkey($read_topics, $topicid) ){
$last_read_postid = $read_topics[ $topicid ];
if( (int) $post_id > (int) $last_read_postid ){
$unread_posts[] = $post_id;
}
} else {
$unread_posts[] = $post_id;
}
}
}
}
elseif( wpfkey($post, 'topicid') && wpfkey($read_topics, $post['topicid']) ){
$last_read_postid = $read_topics[ $post['topicid'] ];
if( (int) $post['postid'] > (int) $last_read_postid ){
$unread_posts[] = $post;
}
}
else {
$unread_posts[] = $post;
}
}
} else {
$unread_posts = $posts;
}
}
return $unread_posts;
}
private function init_fields(){
if( $this->fields ) return;
$all_groupids = WPF()->usergroup->get_usergroups('groupid');
$all_groupids = array_map('intval', $all_groupids);
$this->fields = apply_filters( 'wpforo_post_before_init_fields', $this->fields );
$this->fields['title'] = array(
'fieldKey' => 'title',
'type' => 'text',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 1,
'isEditable' => 1,
'label' => wpforo_phrase( 'Topic Title', false ),
'title' => wpforo_phrase( 'Title', false ),
'placeholder' => wpforo_phrase( 'Enter title here', false ),
'minLength' => 0,
'maxLength' => 0,
'faIcon' => 'fas fa-pen-alt',
'name' => 'title',
'cantBeInactive' => array('topic'),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1
);
/*$this->fields['slug'] = array(
'fieldKey' => 'slug',
'type' => 'text',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Slug', false ),
'title' => wpforo_phrase( 'Slug', false ),
'placeholder' => wpforo_phrase( 'Slug', false ),
'minLength' => 0,
'maxLength' => 0,
'faIcon' => 'fas fa-link',
'name' => 'slug',
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1
);*/
$this->fields['body'] = array(
'fieldKey' => 'body',
'type' => 'tinymce',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 1,
'isEditable' => 1,
'title' => wpforo_phrase( 'Body', false ),
'placeholder' => wpforo_phrase( 'Body', false ),
'minLength' => 0,
'maxLength' => 0,
'faIcon' => '',
'name' => 'body',
'cantBeInactive' => array('topic', 'post', 'comment', 'reply'),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1
);
$this->fields['name'] = array(
'fieldKey' => 'name',
'type' => 'text',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Author Name', false ),
'title' => wpforo_phrase( 'Author Name', false ),
'placeholder' => wpforo_phrase( 'Your name', false ),
'minLength' => 0,
'maxLength' => 0,
'faIcon' => 'fas fa-id-card',
'name' => 'name',
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1,
'isOnlyForGuests' => 1
);
$this->fields['email'] = array(
'fieldKey' => 'email',
'type' => 'text',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Author Email', false ),
'title' => wpforo_phrase( 'Author Email', false ),
'placeholder' => wpforo_phrase( 'Your email', false ),
'minLength' => 0,
'maxLength' => 0,
'faIcon' => 'fas fa-at',
'name' => 'email',
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1,
'isOnlyForGuests' => 1
);
/*$this->fields['tags'] = array(
'fieldKey' => 'tags',
'type' => 'text',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Topic Tags', false ) . ' ' . wpforo_phrase( 'Separate tags using a comma', false ),
'title' => wpforo_phrase( 'Tags', false ),
'placeholder' => wpforo_phrase( 'Start typing tags here (maximum %d tags are allowed)...', false ),
'minLength' => 0,
'maxLength' => 0,
'faIcon' => 'fas fa-tag',
'name' => 'tags',
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1
);
$this->fields['sticky'] = array(
'fieldKey' => 'sticky',
'type' => 'checkbox',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Set Topic Sticky', false ),
'title' => wpforo_phrase( 'Set Topic Sticky', false ),
'placeholder' => wpforo_phrase( 'Set Topic Sticky', false ),
'faIcon' => 'fas fa-exclamation',
'name' => 'type',
'values' => '1 => ' . wpforo_phrase( 'Set Topic Sticky', false ),
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1
);
$this->fields['private'] = array(
'fieldKey' => 'private',
'type' => 'checkbox',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Private Topic', false ),
'title' => wpforo_phrase( 'Only Admins and Moderators can see your private topics.', false ),
'placeholder' => wpforo_phrase( 'Private Topic', false ),
'faIcon' => 'fas fa-eye-slash',
'name' => 'private',
'values' => '1 => ' . wpforo_phrase( 'Private Topic', false ),
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 1
);
$this->fields['subscribe'] = array(
'fieldKey' => 'subscribe',
'type' => 'checkbox',
'isDefault' => 1,
'isRemovable' => 0,
'isRequired' => 0,
'isEditable' => 1,
'label' => wpforo_phrase( 'Subscribe to this topic', false ),
'title' => wpforo_phrase( 'Subscribe to this topic', false ),
'placeholder' => wpforo_phrase( 'Subscribe to this topic', false ),
'faIcon' => 'fas fa-eye-slash',
'name' => 'wpforo_topic_subs',
'values' => '1 => ' . wpforo_phrase( 'Subscribe to this topic', false ),
'cantBeInactive' => array(),
'canEdit' => $all_groupids,
'canView' => $all_groupids,
'can' => '',
'isSearchable' => 0
);*/
$this->fields = (array) apply_filters( 'wpforo_post_after_init_fields', $this->fields );
$this->fields = array_map(array($this, 'fix_field'), $this->fields);
}
public function fix_field($field){
$field = array_merge(WPF()->form->default, (array) $field);
if( is_scalar($field['values']) ) $field['values'] = explode("\n", $field['values']);
return $field;
}
public function get_fields($only_defaults = false){
$this->init_fields();
$fields = $this->fields;
if($only_defaults) foreach ($fields as $k => $v) if( !wpfval($v, 'isDefault') ) unset($fields[$k]);
return $fields;
}
public function get_field($key){
if( is_string($key) ){
$this->init_fields();
return (array) wpfval($this->fields, $key);
}elseif( $this->is_field($key) ){
return $key;
}
return array();
}
public function is_field($field){
return wpfval($field, 'fieldKey') && wpfval($field, 'type') && wpfkey($field, 'isDefault');
}
public function get_field_key($field) {
return is_string($field) ? $field : (string) wpfval($field, 'fieldKey');
}
public function fields_structure_full_array($fields, &$used_fields = array() ){
if(is_string($fields)) $fields = maybe_unserialize($fields);
$fs = array(array(array()));
if(!is_array($fields)) return $fs;
foreach( $fields as $kr => $row ){
if( is_array($row) ){
foreach( $row as $kc => $cols ){
if( is_array($cols) ){
foreach( $cols as $kf => $field ){
$used_fields[] = $field_key = $this->get_field_key($field);
$fs[$kr][$kc][$field_key] = $this->get_field($field);
}
}
}
}
}
return $fs;
}
// -- START -- get topic fields
public function get_topic_fields_structure($only_defaults = false, $layout = 1, $guest = false){
if( $guest ) {
$fields[0][0][0] = 'name';
$fields[0][1][0] = 'email';
}
$fields[][] = array('title','body');
if(!$only_defaults) $fields = apply_filters('wpforo_get_topic_fields_structure', $fields, $layout, $guest);
return $fields;
}
public function get_topic_fields($forum, $values = array(), $guest = false ){
$fields = $this->fields_structure_full_array( $this->get_topic_fields_structure(false, $forum['cat_layout'], $guest), $used_fields );
if( !in_array('title', $used_fields, true) ) $fields[][][] = $this->get_field('title');
if( !in_array('body', $used_fields, true) ) $fields[][][] = $this->get_field('body');
/**
* apply old options to fields
*/
$values = wp_slash($values);
foreach( $fields as $kr => $row ){
foreach( $row as $kc => $cols ){
foreach( $cols as $kf => $field ){
if( $field ){
$field['value'] = wpfval($values, $kf);
switch ($kf){
case 'body':
if( $field['type'] === 'tinymce' ) {
$field['value'] = wpautop($field['value']);
$field['wp_editor_settings'] = WPF()->tpl->editor_buttons( 'topic' );
}
$field['textareaid'] = uniqid('wpf_topic_body_');
$field['minLength'] = $this->options['topic_body_min_length'];
$field['maxLength'] = $this->options['topic_body_max_length'];
$field['form_type'] = 'topic';
$field['meta'] = array( 'forum' => $forum, 'values' => $values );
break;
case 'title':
if( intval($forum['cat_layout']) === 3 ) $field['label'] = wpforo_phrase('Your question', false);
break;
}
if( $field && intval($field['isOnlyForGuests']) || in_array($kf, array('name', 'email'), true) ){
if( $guest ){
if( !$values ){
$g = WPF()->member->get_guest_cookies();
if( $kf === 'name' ){
$field['value'] = $g['name'];
}elseif( $kf === 'email' ){
$field['value'] = $g['email'];
}
}
}else{
$field = array();
}
}
$fields[$kr][$kc][$kf] = apply_filters( 'wpforo_topic_field', $field, $forum, $values, $guest );
}
}
}
}
return $fields;
}
public function get_topic_fields_list($only_defaults = false, $layout = 1, $guest = false){
$fields_list = array('title', 'body');
$fields_structure = $this->get_topic_fields_structure($only_defaults, $layout, $guest);
foreach ( $fields_structure as $r ){
foreach ( $r as $c ){
foreach ($c as $f){
$fields_list[] = $f;
}
}
}
return array_values(array_unique($fields_list));
}
// -- END -- get topic fields
// -- START -- get post fields
public function get_post_fields_structure($only_defaults = false, $layout = 1, $guest = false){
if( $guest ) {
$fields[0][0][0] = 'name';
$fields[0][1][0] = 'email';
}
$fields[][] = array('title','body');
if(!$only_defaults) $fields = apply_filters('wpforo_get_post_fields_structure', $fields, $layout, $guest);
return $fields;
}
public function get_post_fields($topic, $values = array(), $guest = false){
$fields = $this->fields_structure_full_array( $this->get_post_fields_structure(false, $topic['layout'], $guest), $used_fields );
if( !in_array('body', $used_fields, true) ) $fields[][][] = $this->get_field('body');
/**
* apply old options to fields
*/
$values = wp_slash($values);
foreach( $fields as $kr => $row ){
foreach( $row as $kc => $cols ){
foreach( $cols as $kf => $field ){
if( $field ){
$field['value'] = wpfval($values, $kf);
switch ($kf){
case 'body':
if( $field['type'] === 'tinymce' ) {
$field['value'] = wpautop($field['value']);
$field['wp_editor_settings'] = WPF()->tpl->editor_buttons( 'post' );
}
$field['textareaid'] = uniqid('wpf_post_body_');
$field['minLength'] = $this->options['post_body_min_length'];
$field['maxLength'] = $this->options['post_body_max_length'];
$field['form_type'] = 'reply';
$field['meta'] = array('topic' => $topic, 'values' => $values);
break;
case 'title':
$prefix_answer = wpforo_phrase('Answer to', false, 'default');
$prefix_re = wpforo_phrase('RE', false, 'default');
$prefix_patterns = array($prefix_answer,$prefix_re);
$pattern = array_map('preg_quote', $prefix_patterns);
$pattern = implode('|', $pattern);
$title = preg_replace('#^\s*(?:'. $pattern .')\s*: #isu', '', trim($field['value']), 1);
if( intval($topic['layout']) === 3 ) {
$field['label'] = wpforo_phrase( 'Your question', false );
if($title) $field['value'] = $prefix_answer . ': ' . $title;
}else{
$field['label'] = wpforo_phrase( 'Title', false );
if($title) $field['value'] = $prefix_re . ': ' . $title;
}
break;
}
if( $field && intval($field['isOnlyForGuests']) || in_array($kf, array('name', 'email'), true) ){
if( $guest ){
if( !$values || (count($values) === 1 && wpfkey($values, 'title')) ){
$g = WPF()->member->get_guest_cookies();
if( $kf === 'name' ){
$field['value'] = $g['name'];
}elseif( $kf === 'email' ){
$field['value'] = $g['email'];
}
}
}else{
$field = array();
}
}
$fields[$kr][$kc][$kf] = apply_filters( 'wpforo_post_field', $field, $topic, $values, $guest );
}
}
}
}
return $fields;
}
public function get_post_fields_list($only_defaults = false, $layout = 1, $guest = false){
$fields_list = array('body');
$fields_structure = $this->get_post_fields_structure($only_defaults, $layout, $guest);
foreach ( $fields_structure as $r ){
foreach ( $r as $c ){
foreach ($c as $f){
$fields_list[] = $f;
}
}
}
return array_values(array_unique($fields_list));
}
// -- END -- get post fields
// -- START -- get QA comment fields
public function get_comment_fields_structure($only_defaults = false, $guest = false){
if( $guest ) {
$fields[0][0][0] = 'name';
$fields[0][1][0] = 'email';
}
$fields[][] = array('body');
if(!$only_defaults) $fields = apply_filters('wpforo_get_comment_fields_structure', $fields, $guest);
return $fields;
}
public function get_comment_fields($only_defaults = false, $guest = false){
$fields = $this->fields_structure_full_array( $this->get_comment_fields_structure($only_defaults, $guest), $used_fields );
if( !$only_defaults ){
if( !in_array('body', $used_fields, true) ) $fields[][][] = $this->get_field('body');
}
/**
* apply old options to fields
*/
foreach( $fields as $kr => $row ){
foreach( $row as $kc => $cols ){
foreach( $cols as $kf => $field ){
if( $kf === 'body' && $field ){
if( $field['type'] === 'tinymce' ) $field['wp_editor_settings'] = WPF()->tpl->editor_buttons('post');
$field['type'] = WPF()->tpl->forms['qa_comments_rich_editor'] ? 'tinymce' : 'textarea';
$field['textareaid'] = uniqid('wpf_post_body_');
$field['minLength'] = $this->options['comment_body_min_length'];
$field['maxLength'] = $this->options['comment_body_max_length'];
$fields[$kr][$kc][$kf] = $field;
}
}
}
}
return $fields;
}
public function get_comment_fields_list($only_defaults = false, $guest = false){
$fields_list = array('body');
$fields_structure = $this->get_comment_fields_structure($only_defaults, $guest);
foreach ( $fields_structure as $r ){
foreach ( $r as $c ){
foreach ($c as $f){
$fields_list[] = $f;
}
}
}
return array_values(array_unique($fields_list));
}
// -- END -- get QA comment fields
// -- START -- get threaded reply fields
public function get_reply_fields_structure($only_defaults = false, $guest = false){
if( $guest ) {
$fields[0][0][0] = 'name';
$fields[0][1][0] = 'email';
}
$fields[][] = array('body');
if(!$only_defaults) $fields = apply_filters('wpforo_get_reply_fields_structure', $fields, $guest);
return $fields;
}
public function get_reply_fields($only_defaults = false, $guest = false){
$fields = $this->fields_structure_full_array( $this->get_reply_fields_structure($only_defaults, $guest), $used_fields );
if( !$only_defaults ){
if( !in_array('body', $used_fields, true) ) $fields[][][] = $this->get_field('body');
}
/**
* apply old options to fields
*/
foreach( $fields as $kr => $row ){
foreach( $row as $kc => $cols ){
foreach( $cols as $kf => $field ){
if( $kf === 'body' && $field ){
if( $field['type'] === 'tinymce' ) $field['wp_editor_settings'] = WPF()->tpl->editor_buttons('post');
$field['type'] = WPF()->tpl->forms['threaded_reply_rich_editor'] ? 'tinymce' : 'textarea';
$field['textareaid'] = uniqid('wpf_post_body_');
$field['minLength'] = $this->options['post_body_min_length'];
$field['maxLength'] = $this->options['post_body_max_length'];
$fields[$kr][$kc][$kf] = $field;
}
}
}
}
return $fields;
}
public function get_reply_fields_list($only_defaults = false, $guest = false){
$fields_list = array('body');
$fields_structure = $this->get_reply_fields_structure($only_defaults, $guest);
foreach ( $fields_structure as $r ){
foreach ( $r as $c ){
foreach ($c as $f){
$fields_list[] = $f;
}
}
}
return array_values(array_unique($fields_list));
}
// -- END -- get threaded reply fields
public function get_search_fields($values){
$values = (array) $values;
$values = wp_slash($values);
$fields = $this->get_fields();
$topic_fields = WPF()->post->get_topic_fields_list();
$topic_fields = array_flip($topic_fields);
$fields = array_intersect_key($fields, $topic_fields);
$search_fields = array();
foreach ( $fields as $kf => $field ){
if( !$field['isDefault'] && (int) wpfval($field, 'isSearchable') && !(int) wpfval($field, 'isOnlyForGuests') && wpfval($field, 'type') !== 'file' ){
$field['value'] = wpfval($values, $kf);
if( in_array( $field['type'], array( 'text', 'textarea', 'email', 'url' ), true ) ) $field['type'] = 'search';
$search_fields[0][0][$field['fieldKey']] = $field;
}
}
return $search_fields;
}
public function print_custom_fields($content, $post){
if( (int) wpfval($post, 'is_first_post') && ($postmetas = WPF()->postmeta->get_postmeta($post['postid'], '', true)) ){
$content .= '';
$content .= apply_filters('wpforo_topic_fields_before', '', $post);
$fields = WPF()->post->get_topic_fields_list();
foreach ( $fields as $field ){
if( $postmeta = wpfval($postmetas, $field) ){
$field = WPF()->post->get_field($field);
if( !(int) wpfval($field, 'isDefault') ){
$field['value'] = $postmeta;
$field = WPF()->form->prepare_values( WPF()->form->esc_field($field) );
$content .= sprintf(
' %2$s%3$s',
(string) wpfval($field, 'faIcon'),
(string) wpfval($field, 'label'),
(string) wpfval($field, 'value')
);
}
}
}
$content .= '';
}
return $content;
}
}