plugin_name = $plugin_name;
$this->title_length = Poll_Maker_Ays_Admin::get_listtables_title_length('results');
parent::__construct(array(
'singular' =>esc_html__('Result', "poll-maker"), //singular name of the listed records
'plural' =>esc_html__('Results', "poll-maker"), //plural name of the listed records
'ajax' => false, //does this table support ajax?
));
add_action('admin_notices', array($this, 'results_notices'));
}
/**
* Retrieve customers data from the database
*
* @param int $per_page
* @param int $page_number
*
* @return mixed
*/
public static function get_reports( $per_page = 50, $page_number = 1 ) {
global $wpdb;
if (isset($_SERVER['HTTP_HOST']) && sanitize_text_field($_SERVER['HTTP_HOST']) == "playground.wordpress.net") {
$sql = "SELECT
{$wpdb->prefix}ayspoll_polls.id,
SUM(CAST({$wpdb->prefix}ayspoll_answers.votes AS INTEGER)) AS voted,
{$wpdb->prefix}ayspoll_answers.poll_id,
{$wpdb->prefix}ayspoll_polls.categories
FROM {$wpdb->prefix}ayspoll_answers
INNER JOIN {$wpdb->prefix}ayspoll_polls
ON {$wpdb->prefix}ayspoll_answers.poll_id = {$wpdb->prefix}ayspoll_polls.id ";
} else {
$sql = "SELECT
{$wpdb->prefix}ayspoll_polls.id,
SUM({$wpdb->prefix}ayspoll_answers.votes) AS voted,
{$wpdb->prefix}ayspoll_answers.poll_id,
{$wpdb->prefix}ayspoll_polls.categories
FROM {$wpdb->prefix}ayspoll_answers
INNER JOIN {$wpdb->prefix}ayspoll_polls
ON {$wpdb->prefix}ayspoll_answers.poll_id = {$wpdb->prefix}ayspoll_polls.id ";
}
if (isset($_REQUEST['orderbypoll']) && $_REQUEST['orderbypoll'] > 0) {
$poll_id = absint(sanitize_text_field( $_REQUEST['orderbypoll'] ));
$sql .= " AND {$wpdb->prefix}ayspoll_reports.answer_id IN (SELECT {$wpdb->prefix}ayspoll_answers.id FROM {$wpdb->prefix}ayspoll_answers WHERE {$wpdb->prefix}ayspoll_answers.poll_id='$poll_id')";
}
if (isset($_REQUEST['orderbycat']) && $_REQUEST['orderbycat'] > 0) {
$cat_id = absint(sanitize_text_field( $_REQUEST['orderbycat'] ));
$sql .= " AND {$wpdb->prefix}ayspoll_polls.categories LIKE('%,{$cat_id},%')";
}
$sql .= "GROUP BY {$wpdb->prefix}ayspoll_answers.poll_id";
if (!empty($_REQUEST['orderby'])) {
$order_by = ( isset( $_REQUEST['orderby'] ) && sanitize_text_field( $_REQUEST['orderby'] ) != '' ) ? sanitize_text_field( $_REQUEST['orderby'] ) : 'id';
$order_by = str_replace('id', $wpdb->prefix . 'ayspoll_polls.id', $order_by);
$order_by .= ( ! empty( $_REQUEST['order'] ) && strtolower( $_REQUEST['order'] ) == 'asc' ) ? ' ASC' : ' DESC';
$sql_orderby = sanitize_sql_orderby($order_by);
if ( $sql_orderby ) {
$sql .= ' ORDER BY ' . $sql_orderby;
} else {
$sql .= ' ORDER BY ' . $wpdb->prefix . 'ayspoll_polls.id DESC';
}
} else {
$sql .= ' ORDER BY ' . $wpdb->prefix . 'ayspoll_polls.id DESC';
}
$sql .= " LIMIT %d";
$args[] = $per_page;
$offset = ($page_number - 1) * $per_page;
$sql .= " OFFSET %d";
$args[] = $offset;
$result = $wpdb->get_results(
$wpdb->prepare( $sql, $args),
'ARRAY_A'
);
return $result;
}
public function display_tablenav( $which ) {
?>
bulk_actions( $which ); ?>
extra_tablenav( $which );
$this->pagination( $which );
?>
ays_category_filter_content();
}
public function get_report_by_id( $id ) {
global $wpdb;
$report_id = absint(sanitize_text_field($id));
$report_table = esc_sql($wpdb->prefix."ayspoll_reports");
$sql = "SELECT * FROM ".$report_table." WHERE id=%d";
$result = $wpdb->get_row(
$wpdb->prepare( $sql, $report_id),
'ARRAY_A'
);
return $result;
}
public static function get_answer_by_id( $id ) {
global $wpdb;
$answ_id = absint(sanitize_text_field($id));
$answ_table = esc_sql($wpdb->prefix."ayspoll_answers");
$sql = "SELECT * FROM ".$answ_table." WHERE id=%d";
$result = $wpdb->get_row(
$wpdb->prepare( $sql, $answ_id),
'ARRAY_A'
);
return $result;
}
public function get_polls() {
global $wpdb;
$poll_table = esc_sql($wpdb->prefix."ayspoll_polls");
$sql = "SELECT * FROM ".$poll_table;
$result = $wpdb->get_results($sql, 'ARRAY_A');
return $result;
}
/**
* Delete a customer record.
*
* @param int $id customer ID
*/
public static function delete_reports( $id ) {
global $wpdb;
$wpdb->update(
"{$wpdb->prefix}ayspoll_answers",
array(
"votes" => 0
),
array(
'poll_id' => $id
)
);
if (isset($_SERVER['HTTP_HOST']) && sanitize_text_field($_SERVER['HTTP_HOST']) == "playground.wordpress.net") {
$sql = "DELETE FROM {$wpdb->prefix}ayspoll_reports
WHERE answer_id IN (
SELECT id FROM {$wpdb->prefix}ayspoll_answers
WHERE poll_id = $id
)";
} else {
$sql = "DELETE r FROM {$wpdb->prefix}ayspoll_reports as r
JOIN {$wpdb->prefix}ayspoll_answers ON {$wpdb->prefix}ayspoll_answers.id = r.answer_id
WHERE {$wpdb->prefix}ayspoll_answers.poll_id = $id";
}
$res = $wpdb->query($sql);
return $res > 0;
}
/**
* Returns the count of records in the database.
*
* @return null|string
*/
public static function record_count() {
global $wpdb;
$sql = "SELECT COUNT(*) FROM {$wpdb->prefix}ayspoll_polls";
return $wpdb->get_var($sql);
}
/** Text displayed when no customer data is available */
public function no_items() {
_e('There are no results yet.', "poll-maker");
}
/**
* Render a column when no column specific method exist.
*
* @param array $item
* @param string $column_name
*
* @return mixed
*/
public function column_default( $item, $column_name ) {
switch ( $column_name ) {
case 'poll_title':
case 'voted':
case 'unread':
case 'id':
return $item[$column_name];
break;
default:
return print_r($item, true); //Show the whole array for troubleshooting purposes
}
}
/**
* Render the bulk edit checkbox
*
* @param array $item
*
* @return string
*/
function column_cb( $item ) {
return sprintf(
'', $item['id']
);
}
function column_poll_title( $item ) {
global $wpdb;
$delete_nonce = wp_create_nonce($this->plugin_name . '-delete-result');
$res = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}ayspoll_polls WHERE id={$item['id']}", "ARRAY_A");
$restitle = Poll_Maker_Ays_Admin::ays_restriction_string("word",stripcslashes($res['title']), $this->title_length);
$title = sprintf('' . $restitle . '', esc_attr($_REQUEST['page']), absint($item['id']), stripslashes($res['title']));
$actions = [
'delete' => sprintf(
'%s',
esc_attr( $_REQUEST['page'] ),
'delete',
absint( $item['id'] ),
$delete_nonce,
__( 'Delete', 'poll-maker' )
),
];
return $title . $this->row_actions($actions);
}
function get_poll_title( $item ) {
global $wpdb;
$delete_nonce = wp_create_nonce($this->plugin_name . '-delete-result');
$result = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}ayspoll_answers WHERE id={$item['answer_id']}", "ARRAY_A");
$res = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}ayspoll_polls WHERE id={$result['poll_id']}", "ARRAY_A");
return stripslashes($res['title']);
}
function column_answer( $item ) {
global $wpdb;
$delete_nonce = wp_create_nonce($this->plugin_name . '-delete-result');
$result = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}ayspoll_answers WHERE id={$item['answer_id']}", "ARRAY_A");
$poll_type = $this->get_poll_type($result['poll_id']);
$result['answer'] = $poll_type['type'] == 'voting' && $result['answer'] == '1' ? 'Like' : $result['answer'];
$result['answer'] = $poll_type['type'] == 'voting' && $result['answer'] == '-1' ? 'Dislike' : $result['answer'];
return stripslashes($result['answer']);
}
function column_voted( $item ) {
global $wpdb;
$sql = "SELECT
COUNT({$wpdb->prefix}ayspoll_reports.id)
FROM
{$wpdb->prefix}ayspoll_reports
JOIN {$wpdb->prefix}ayspoll_answers ON {$wpdb->prefix}ayspoll_answers.id = {$wpdb->prefix}ayspoll_reports.answer_id
WHERE {$wpdb->prefix}ayspoll_answers.poll_id = {$item['id']}
GROUP BY {$wpdb->prefix}ayspoll_answers.poll_id";
$res = $wpdb->get_var($sql);
return $res ? $res : 0;
}
function column_unread( $item ) {
global $wpdb;
$sql = "SELECT
COUNT({$wpdb->prefix}ayspoll_reports.unread)
FROM
{$wpdb->prefix}ayspoll_reports
JOIN {$wpdb->prefix}ayspoll_answers ON {$wpdb->prefix}ayspoll_answers.id = {$wpdb->prefix}ayspoll_reports.answer_id
WHERE {$wpdb->prefix}ayspoll_answers.poll_id = {$item['id']} AND {$wpdb->prefix}ayspoll_reports.unread = 1
GROUP BY {$wpdb->prefix}ayspoll_answers.poll_id";
$res = $wpdb->get_var($sql);
$result = $res ? $res : 0;
$unread = $res ? 'ays_poll_unread' : '';
$count = sprintf('' . $result . '', $unread);
return $count;
}
/**
* Associative array of columns
*
* @return array
*/
function get_columns() {
$columns = array(
'cb' => '',
'poll_title' =>esc_html__('Poll',"poll-maker"),
'voted' =>esc_html__('Voters count',"poll-maker"),
'unread' =>esc_html__('New results count',"poll-maker"),
'id' =>esc_html__('ID',"poll-maker")
);
return $columns;
}
/**
* Columns to make sortable.
*
* @return array
*/
public function get_sortable_columns() {
$sortable_columns = array(
'vote_date' => array('vote_date', true),
'id' => array('id', true),
);
return $sortable_columns;
}
/**
* Returns an associative array containing the bulk action
*
* @return array
*/
public function get_bulk_actions() {
$actions = array(
'bulk-read' =>esc_html__('Mark as read', "poll-maker"),
'bulk-delete' =>esc_html__('Delete', "poll-maker"),
);
return $actions;
}
/**
* Handles data query and filter, sorting, and pagination.
*/
public function prepare_items() {
$this->_column_headers = $this->get_column_info();
/** Process bulk action */
$this->process_bulk_action();
$per_page = $this->get_items_per_page('poll_results_per_page', 50);
$current_page = $this->get_pagenum();
$total_items = self::record_count();
$this->set_pagination_args(array(
'total_items' => $total_items, //WE have to calculate the total number of items
'per_page' => $per_page, //WE have to determine how many items to show on a page
));
$this->items = self::get_reports($per_page, $current_page);
}
public function process_bulk_action() {
//Detect when a bulk action is being triggered...
if ('delete' === $this->current_action()) {
// In our file that handles the request, verify the nonce.
$nonce = esc_attr($_REQUEST['_wpnonce']);
if (!wp_verify_nonce($nonce, $this->plugin_name . '-delete-result')) {
die('Go get a life script kiddies');
} else {
self::delete_reports(absint($_GET['result']));
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$message = 'deleted';
$url = esc_url_raw(remove_query_arg([
'action',
'result',
'_wpnonce'
])) . '&status=' . $message;
wp_redirect($url);
}
}
// Process bulk-delete action
if ((isset($_POST['action']) && $_POST['action'] == 'bulk-delete')
|| (isset($_POST['action2']) && $_POST['action2'] == 'bulk-delete')
) {
if (!empty($_POST['bulk-action']) && is_array($_POST['bulk-action'])) {
$delete_ids = array_map('intval', $_POST['bulk-action']);
foreach ($delete_ids as $id) {
self::delete_reports($id);
}
}
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$message = 'deleted';
$url = esc_url_raw(remove_query_arg(['action', 'result', '_wpnonce'])) . '&status=' . $message;
wp_redirect($url);
} elseif ((isset($_POST['action']) && 'bulk-read' == $_POST['action'])
|| (isset($_POST['action2']) && 'bulk-read' == $_POST['action2'])
) {
if (empty($_POST['bulk-action']) || !is_array($_POST['bulk-action'])) {
return;
}
$read_ids = array_map('intval', $_POST['bulk-action']);
// loop over the array of record IDs and mark as readed them
foreach ( $read_ids as $id ) {
echo $id . "
";
self::mark_as_read_reports($id);
}
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$message = 'read';
$url = esc_url_raw(remove_query_arg(['action', 'result', '_wpnonce'])) . '&status=' . $message;
wp_redirect($url);
}
}
/**
* Mark as read a result record.
*
* @param int $id result ID
*/
public static function mark_as_read_reports( $id ) {
global $wpdb;
$sql = "UPDATE {$wpdb->prefix}ayspoll_reports
JOIN {$wpdb->prefix}ayspoll_answers ON {$wpdb->prefix}ayspoll_answers.id = {$wpdb->prefix}ayspoll_reports.answer_id
SET {$wpdb->prefix}ayspoll_reports.unread = 0
WHERE {$wpdb->prefix}ayspoll_answers.poll_id = $id";
$res = $wpdb->query($sql);
return $res > 0 ? true : false;
}
public function results_notices() {
$status = (isset($_REQUEST['status'])) ? sanitize_text_field($_REQUEST['status']) : '';
if (empty($status)) {
return;
}
if ('deleted' == $status) {
$updated_message = esc_html( esc_html__('Result deleted.', "poll-maker"));
}
if (empty($updated_message)) {
return;
}
?>
prefix."ayspoll_polls");
$sql = "SELECT type FROM ".$poll_table." WHERE id=%d";
$result = $wpdb->get_row(
$wpdb->prepare( $sql, $id),
'ARRAY_A'
);
return $result;
}
public function ays_category_filter_content(){
$poll_cats = $this->get_categories();
$content = "";
if(isset($poll_cats)){
$content = '
';
$content .= '';
if(isset($_REQUEST['filter_by_cat'])){
$new_url = remove_query_arg("orderbycat")."&orderbycat=".$this_cat_id;
wp_redirect($new_url);
}
}
echo $content;
}
public function get_categories() {
global $wpdb;
$category_table = $wpdb->prefix . 'ayspoll_categories';
$sql = "SELECT id,title FROM ".$category_table." ORDER BY title";
$results = $wpdb->get_results($sql , "ARRAY_A");
if(isset($results) && !empty($results)){
return $results;
}
else{
return array();
}
}
// Get answers modified
public function get_poll_answers($poll_id){
global $wpdb;
$sql = "SELECT * FROM `{$wpdb->prefix}ayspoll_reports` WHERE poll_id=$poll_id";
$result = $wpdb->get_results($sql, "ARRAY_A");
$multivote_answers_ids = array();
$multivote_answers = array();
foreach ($result as $r_key => $r_value) {
$r_value['multi_answer_id'] = json_decode($r_value['multi_answer_ids'], true);
$multivote_res = false;
if (isset($r_value['multi_answer_id']) && count($r_value['multi_answer_id']) > 0) {
$multivote_res = true;
}
if ($multivote_res) {
foreach ($r_value['multi_answer_id'] as $m_key => $m_val) {
$multivote_answers_ids[] = $m_val;
$multi_answer = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}ayspoll_answers WHERE id=".$m_val, "ARRAY_A");
$multivote_answers[ $m_val ] = $multi_answer['answer'];
}
$answ_poll_id = $multi_answer['poll_id'];
} else {
$answer = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}ayspoll_answers WHERE id={$r_value['answer_id']}", "ARRAY_A");
$multivote_answers_ids[] = $r_value['answer_id'];
$multivote_answers[ $r_value['answer_id'] ] = $answer['answer'];
$answ_poll_id = $answer['poll_id'];
}
}
$multivote_answers_count_arr = array_count_values( $multivote_answers_ids );
$res = array();
foreach ($multivote_answers_count_arr as $key => $value) {
$res[] = array(
"votes" => $value,
"answer" => $multivote_answers[ $key ],
);
}
if ( is_null( $res ) || empty( $res ) ) {
$res = array();
}
return $res;
}
}