/home/coolpkct/www/websites/alylela.com/wp-content/plugins/dw-question-answer/inc/Posts/Base.php
<?php
add_action( 'init', 'dwqa_anonymous_create_session' );
function dwqa_anonymous_create_session() {
if ( !dwqa_get_current_user_session() ) {
$expire = time() + 10*YEAR_IN_SECONDS;
$secure = is_ssl();
$secure_in_cookie = $secure && 'https' === parse_url( get_option( 'home' ), PHP_URL_SCHEME );
if ( $secure ) {
$auth_cookie_secure = SECURE_AUTH_COOKIE;
} else {
$auth_cookie_secure = AUTH_COOKIE;
}
$token = wp_generate_password( 43, false, false );
setcookie('dwqa_anonymous', $token, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_in_cookie, true );
if ( COOKIEPATH != SITECOOKIEPATH ) {
setcookie('dwqa_anonymous', $token, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_in_cookie, true );
}
}
}
function dwqa_get_current_user_session() {
return isset( $_COOKIE['dwqa_anonymous'] ) && !empty( $_COOKIE['dwqa_anonymous'] ) ? $_COOKIE['dwqa_anonymous'] : false;
}
function dwqa_action_vote( ) {
$result = array(
'error_code' => 'authorization',
'error_message' => __( 'Are you cheating, huh?', 'dw-question-answer' ),
);
$vote_for = isset( $_POST['vote_for'] ) && sanitize_text_field( $_POST['vote_for'] ) == 'question'
? 'question' : 'answer';
if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( $_POST['nonce'] ), '_dwqa_'.$vote_for.'_vote_nonce' ) ) {
wp_send_json_error( $result );
}
if ( ! isset( $_POST[ 'post' ] ) ) {
$result['error_code'] = 'missing ' . $vote_for;
$result['error_message'] = __( 'What '.$vote_for.' are you looking for?', 'dw-question-answer' );
wp_send_json_error( $result );
}
$post_id = sanitize_text_field( $_POST[ 'post' ] );
$point = isset( $_POST['type'] ) && sanitize_text_field( $_POST['type'] ) == 'up' ? 1 : -1;
//vote
$dwqa_user_vote_id = '';
if ( is_user_logged_in( ) ) {
global $current_user;
$dwqa_user_vote_id = $current_user->ID;
}else{
global $dwqa_general_settings;
if(isset($dwqa_general_settings['allow-anonymous-vote']) && $dwqa_general_settings['allow-anonymous-vote']){
$dwqa_user_vote_id = dwqa_get_current_user_session();
}
}
if ($dwqa_user_vote_id!=''){
if ( ! dwqa_is_user_voted( $post_id, $point, $dwqa_user_vote_id ) ) {
$votes = get_post_meta( $post_id, '_dwqa_votes_log', true );
//remove vote serialize
$data_votes = @unserialize($votes);
if ($data_votes !== false) {
$votes = $data_votes;
}
if(!$votes || !is_array($votes)){
$votes = array();
}
$votes[$dwqa_user_vote_id] = $point;
//update
do_action( 'dwqa_vote_'.$vote_for, $post_id, ( int ) $point );
update_post_meta( $post_id, '_dwqa_votes_log', $votes);
// Update vote point
dwqa_update_vote_count( $post_id );
$point = dwqa_vote_count( $post_id );
if ( $point > 0 ) {
$point = '+' . $point;
}
wp_send_json_success( array( 'vote' => $point ) );
} else {
$result['error_code'] = 'voted';
$result['error_message'] = __( 'You voted for this ' . $vote_for, 'dw-question-answer' );
wp_send_json_error( $result );
}
}else{
$result['error_code'] = 'anonymous';
$result['error_message'] = __( 'You aren\'t allowed voted for this ' . $vote_for, 'dw-question-answer' );
wp_send_json_error( $result );
}
}
add_action( 'wp_ajax_dwqa-action-vote', 'dwqa_action_vote' );
add_action( 'wp_ajax_nopriv_dwqa-action-vote', 'dwqa_action_vote' );
/**
* Check for current user can vote for the question
* @param int $post_id ID of object ( question /answer ) post
* @param int $point Point of vote
* @param boolean $user Current user id
* @return boolean Voted or not
*/
function dwqa_is_user_voted( $post_id, $point, $user = false ) {
if ( ! $user ) {
global $current_user;
$user = $current_user->ID;
}
$votes = get_post_meta( $post_id, '_dwqa_votes_log', true );
if ( empty( $votes ) ) {
return false;
}
if ( array_key_exists( $user, $votes ) ) {
if ( ( int ) $votes[$user] == $point ) {
return $votes[$user];
}
}
return false;
}
function dwqa_get_user_vote( $post_id, $user = false ) {
if ( ! $user ) {
global $current_user;
$user = $current_user->ID;
}
if ( dwqa_is_user_voted( $post_id, 1, $user ) ) {
return 'up';
} else if ( dwqa_is_user_voted( $post_id, -1, $user ) ) {
return 'down';
}
return false;
}
/**
* Calculate number of votes for specify post
* @param int $post_id ID of post
* @return void
*/
function dwqa_update_vote_count( $post_id ) {
if ( ! $post_id ) {
global $post;
$post_id = $post->ID;
}
$votes = get_post_meta( $post_id, '_dwqa_votes_log', true );
if ( empty( $votes ) ) {
return 0;
}
$total = array_sum( $votes );
update_post_meta( $post_id, '_dwqa_votes', $total );
return $total;
}
/**
* Return vote point of post
* @param int $post_id ID of post
* @param boolean $echo Print or not
* @return int Vote point
*/
function dwqa_vote_count( $post_id = false, $echo = false ) {
if ( ! $post_id ) {
global $post;
$post_id = $post->ID;
if( isset( $post->vote_count ) ) {
return $post->vote_count;
}
}
$votes = get_post_meta( $post_id, '_dwqa_votes', true );
if ( empty( $votes ) ) {
return 0;
}
if ( $echo ) {
echo $votes;
}
return ( int ) $votes;
}
function dwqa_decode_pre_entities( $matches ) {
$content = $matches[0];
$content = str_replace( $matches[1], '', $content );
$content = str_replace( $matches[5], '', $content );
$content = str_replace( $matches[2], '', $content );
//$content = str_replace( $matches[3], html_entity_decode( $matches[3] ), $content );
return $content;
}
function dwqa_content_html_decode( $content ) {
return preg_replace_callback( '/( <pre> )<code( [^>]* )>( .* )<\/( code )[^>]*>( <\/pre[^>]*> )/isU' , 'dwqa_decode_pre_entities', $content );
}
/**
* Is post was submitted by a guest
* @param int $post_id question/answer id
* @return boolean
*/
function dwqa_is_anonymous( $post_id = 0 ) {
if ( empty( $post_id ) ) $post_id = get_the_ID();
$anonymous = get_post_meta( $post_id, '_dwqa_is_anonymous', true );
if ( $anonymous ) {
return true;
}
return false;
}
function dwqa_answer_get_edit_content( $post_id = false ) {
if ( ! $post_id ) {
$post_id = get_the_ID();
}
$content = get_post_field( 'post_content', $post_id );
return apply_filters( 'dwqa_answer_get_edit_content', $content, $post_id );
}
function dwqa_question_get_edit_content( $post_id = false ) {
if ( ! $post_id ) {
$post_id = get_the_ID();
}
$content = get_post_field( 'post_content', $post_id );
return apply_filters( 'dwqa_question_get_edit_content', $content, $post_id );
}
function dwqa_question_get_edit_title( $post_id = false ) {
if ( $post_id ) {
$post_id = get_the_ID();
}
$title = get_the_title( $post_id );
return apply_filters( 'dwqa_question_get_edit_title', $title, $post_id );
}
function dwqa_comment_get_edit_content( $comment_id ) {
$comment_content = get_comment_text( $comment_id );
return apply_filters( 'dwqa_comment_get_edit_content', $comment_content, $comment_id );
}
function dwqa_get_latest_action_date( $question = false, $before = '<span>', $after = '</span>' ){
if ( ! $question ) {
$question = get_the_ID();
}
global $post, $dwqa_general_settings;
$message = '';
$question_list_link = isset( $dwqa_general_settings['pages']['archive-question'] ) ? get_permalink( $dwqa_general_settings['pages']['archive-question'] ) : false;
$latest_answer = dwqa_get_latest_answer( $question );
$last_activity_date = $latest_answer ? $latest_answer->post_date_gmt : get_post_field( 'post_date_gmt', $question );
$post_id = $latest_answer ? $latest_answer->ID : $question;
$author_id = $post->post_author;
if ( $author_id == 0 || dwqa_is_anonymous( $post_id ) ) {
$anonymous_name = get_post_meta( $post_id, '_dwqa_anonymous_name', true );
$author_email = get_post_meta( $post_id, '_dwqa_anonymous_email', true );
if ( $anonymous_name ) {
$display_name = $anonymous_name . ' ';
} else {
$display_name = __( 'Anonymous', 'dw-question-answer' ) . ' ';
}
} else {
$display_name = get_the_author_meta( 'display_name', $author_id );
$author_url = $question_list_link ? add_query_arg( array( 'user-question' => get_the_author_meta( 'user_login', $author_id ) ), $question_list_link ) : the_author_posts_link( $author_id );
$author_email = get_the_author_meta( 'user_email', $author_id );
}
$author_avatar = wp_cache_get( 'avatar_of_' . $author_id, 'dwqa' );
if ( false === $author_avatar ) {
$author_avatar = get_avatar( $author_email, 48 );
wp_cache_set( 'avatar_of_'. $author_email, $author_avatar, 'dwqa', 60*60*24*7 );
}
$author_display = dwqa_is_anonymous() ? $display_name : sprintf( '<a href="%1$s" title="%2$s" rel="author">%3$s</a>', $author_url, esc_attr( sprintf( __( 'Posts by %s' ), $display_name ) ), $display_name );
$author_link = sprintf(
'<span class="dwqa-author"><span class="dwqa-user-avatar">%2$s</span>%1$s</span>',
$author_display,
$author_avatar
);
if ( $last_activity_date && $post->last_activity_type == 'answer' ) {
$date = human_time_diff( strtotime( $last_activity_date ), current_time( 'timestamp' ) );
return sprintf( __( '%s answered <span class="dwqa-date">%s</span> ago', 'dw-question-answer' ), $author_link, $date );
}
if ( 'dwqa-answer' == get_post_type( $question ) ) {
return sprintf( __( '%s answered <span class="dwqa-date">%s</span> ago', 'dw-question-answer' ), $author_link, human_time_diff( get_post_time( 'U', true, $question ) ) );
}
return sprintf( __( '%s asked <span class="dwqa-date">%s</span> ago', 'dw-question-answer' ), $author_link, human_time_diff( get_post_time( 'U', true, $question ) ) );
}
function dwqa_is_edit() {
$gets = array( 'edit', 'comment_edit' );
foreach( $gets as $get ) {
if ( isset( $_GET[ $get ] ) && is_numeric( $_GET[ $get ] ) ) {
return true;
}
}
return false;
}
class DWQA_Posts_Base {
private $slug;
private $labels;
public function __construct( $slug, $labels ) {
$this->slug = $slug;
$this->labels = is_array( $labels ) ? $labels : array();
// add posttype
add_action( 'init', array( $this, 'register' ) );
// Do any init by it self
add_action( 'init', array( $this, 'init' ) );
// Custom Admin List Table
add_filter( 'manage_posts_columns', array( $this, 'columns_head' ) );
// Auto convert url in the conthen to clickable and no-follow
add_filter( 'the_content', array( $this, 'auto_convert_urls' ) );
add_filter( 'wp_insert_post_data', array( $this, 'hook_on_update_anonymous_post' ), 10, 2 );
}
// Abstract, do all init actions for itself
public function init(){}
public function columns_head( $default ){ return $default; }
public function get_slug() {
return $this->slug;
}
public function get_name_labels() {
return wp_parse_args( $this->labels, array(
'plural' => __( 'DWQA Posts', 'dw-question-answer' ),
'singular' => __( 'DWQA Post', 'dw-question-answer' ),
'rewrite' => true,
) );
}
public function set_labels() {
$names = $this->get_name_labels();
return $labels = array(
'name' => $names['plural'],
'singular_name' => $names['singular'],
'add_new' => _x( 'Add New', 'dwqa', 'dw-question-answer' ) . ' ' . $names['singular'],
'add_new_item' => __( 'Add New', 'dw-question-answer' ) . ' ' . $names['singular'],
'edit_item' => __( 'Edit', 'dw-question-answer' ) . ' ' . $names['singular'],
'new_item' => __( 'New', 'dw-question-answer' ) . ' ' . $names['singular'],
'view_item' => __( 'View', 'dw-question-answer' ) . ' ' . $names['singular'],
'search_items' => __( 'Search ', 'dw-question-answer' ) . $names['plural'],
'not_found' => $names['plural'] . ' ' . __( 'not found', 'dw-question-answer' ),
'not_found_in_trash' => $names['plural'] . ' ' . __( 'not found in Trash', 'dw-question-answer' ),
'parent_item_colon' => __( 'Parent:', 'dw-question-answer' ) . ' ' . $names['singular'],
'menu_name' => isset( $names['menu'] ) ? $names['menu'] : $names['plural'],
);
}
public function register() {
$names = $this->get_name_labels();
$this->register_taxonomy();
$args = array(
'labels' => array(),
'hierarchical' => false,
'description' => 'description',
'taxonomies' => array(),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_admin_bar' => true,
'menu_position' => null,
'menu_icon' => null,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'has_archive' => true,
'query_var' => true,
'can_export' => true,
'rewrite' => $names['rewrite'],
'capability_type' => 'post',
'supports' => array(
'title', 'editor', 'author', 'thumbnail',
'excerpt','custom-fields', 'trackbacks', 'comments',
'revisions', 'page-attributes', 'post-formats'
)
);
foreach ( $args as $key => $value ) {
$method = 'set_' . $key;
if ( method_exists( $this, $method ) ) {
$args[$key] = call_user_func( array( $this, $method ) );
}
}
register_post_type( $this->get_slug(), $args );
}
public function register_taxonomy() {}
public function pre_content_filter( $content ) {
return preg_replace_callback( '/<( code )( [^>]* )>( .* )<\/( code )[^>]*>/isU' , array( $this, 'convert_pre_entities' ), $content );
}
public function pre_content_kses( $content ) {
// tags allowed for post content
$filter = apply_filters( 'dwqa_filter_kses', array(
'a' => array(
'href' => array(),
'title' => array()
),
'br' => array(),
'em' => array(),
'strong' => array(),
'code' => array(
'class' => array()
),
'blockquote' => array(),
'quote' => array(),
'span' => array(
'style' => array()
),
'img' => array(
'src' => array(),
'alt' => array(),
'width' => array(),
'height' => array(),
'style' => array()
),
'ul' => array(),
'li' => array(),
'ol' => array(),
'pre' => array()
));
return wp_kses( $content, $filter );
}
public function convert_pre_entities( $matches ) {
$string = $matches[0];
preg_match( '/class=\\\"( [^\\\"]* )\\\"/', $matches[2], $sub_match );
if ( empty( $sub_match ) ) {
$string = str_replace( $matches[1], $matches[1] . ' class="prettyprint"', $string );
} else {
if ( strpos( $sub_match[1], 'prettyprint' ) === false ) {
$new_class = str_replace( $sub_match[1], $sub_match[1] . ' prettyprint', $sub_match[0] );
$string = str_replace( $matches[2], str_replace( $sub_match[0], $new_class, $matches[2] ), $string );
}
}
$string = str_replace( $matches[3], htmlentities( $matches[3], ENT_COMPAT , 'UTF-8', false ), $string );
return '<pre>' . $string . '</pre>';
}
public function auto_convert_urls( $content ) {
global $post;
if ( is_single() && ( 'dwqa-question' == $post->post_type || 'dwqa-answer' == $post->post_type ) ) {
$content = make_clickable( $content );
$content = preg_replace_callback( '|<a (.+?)>|i', array( $this, 'auto_nofollow_callback' ), $content );
}
return $content;
}
public function auto_nofollow_callback( $matches ) {
$text = $matches[1];
$text = str_replace( array( ' rel="nofollow"', " rel='nofollow'" ), '', $text );
return "<a $text rel=\"nofollow\">";
}
public function hook_on_update_anonymous_post( $data, $postarr ) {
if ( isset( $postarr['ID'] ) && get_post_meta( $postarr['ID'], '_dwqa_is_anonymous', true ) ) {
$data['post_author'] = 0;
}
return $data;
}
public function rewrite() {
return true;
}
}
?>