AnsPress_Admin_Ajax()
Description #
This class should ideally be used to work with the administrative side of the WordPress site.
Source #
File: admin/ajax.php
class AnsPress_Admin_Ajax { /** * Initialize admin ajax */ public static function init() { anspress()->add_action( 'wp_ajax_ap_delete_flag', __CLASS__, 'ap_delete_flag' ); anspress()->add_action( 'ap_ajax_ap_clear_flag', __CLASS__, 'clear_flag' ); anspress()->add_action( 'ap_ajax_ap_admin_vote', __CLASS__, 'ap_admin_vote' ); anspress()->add_action( 'ap_ajax_get_all_answers', __CLASS__, 'get_all_answers' ); anspress()->add_action( 'wp_ajax_ap_uninstall_data', __CLASS__, 'ap_uninstall_data' ); anspress()->add_action( 'wp_ajax_ap_toggle_addon', __CLASS__, 'ap_toggle_addon' ); anspress()->add_action( 'wp_ajax_ap_recount_votes', __CLASS__, 'recount_votes' ); anspress()->add_action( 'wp_ajax_ap_recount_answers', __CLASS__, 'recount_answers' ); anspress()->add_action( 'wp_ajax_ap_recount_flagged', __CLASS__, 'recount_flagged' ); anspress()->add_action( 'wp_ajax_ap_recount_subscribers', __CLASS__, 'recount_subscribers' ); anspress()->add_action( 'wp_ajax_ap_recount_reputation', __CLASS__, 'recount_reputation' ); anspress()->add_action( 'wp_ajax_ap_recount_views', __CLASS__, 'recount_views' ); } /** * Delete post flag */ public static function ap_delete_flag() { $post_id = (int) ap_sanitize_unslash( 'id', 'p' ); if ( anspress_verify_nonce( 'flag_delete' . $post_id ) && current_user_can( 'manage_options' ) ) { ap_set_flag_count( $post_id, 0 ); } wp_die(); } /** * Clear post flags. * * @since 2.4.6 */ public static function clear_flag() { $post_id = ap_sanitize_unslash( 'post_id', 'p' ); if ( current_user_can( 'manage_options' ) && anspress_verify_nonce( 'clear_flag_' . $post_id ) ) { ap_delete_flags( $post_id, 'flag' ); echo 0; } wp_die(); } /** * Handle ajax vote in wp-admin post edit screen. * Cast vote as guest user with ID 0, so that when this vote never get * rest if user vote. * * @since 2.5 */ public static function ap_admin_vote() { $args = ap_sanitize_unslash( 'args', 'p' ); if ( current_user_can( 'manage_options' ) && anspress_verify_nonce( 'admin_vote' ) ) { $post = ap_get_post( $args[0] ); if ( $post ) { $value = 'up' === $args[1] ? true : false; $counts = ap_add_post_vote( $post->ID, 0, $value ); echo esc_attr( $counts['votes_net'] ); } } wp_die(); } /** * Ajax callback to get all answers. Used in wp-admin post edit screen to show * all answers of a question. * * @since 4.0 */ public static function get_all_answers() { global $answers; $question_id = ap_sanitize_unslash( 'question_id', 'p' ); $answers_arr = array(); $answers = ap_get_answers( array( 'question_id' => $question_id ) ); while ( ap_have_answers() ) : ap_the_answer(); global $post, $wp_post_statuses; if ( ap_user_can_view_post() ) : $answers_arr[] = array( 'ID' => get_the_ID(), 'content' => get_the_content(), 'avatar' => ap_get_author_avatar( 30 ), 'author' => ap_user_display_name( $post->post_author ), 'activity' => ap_get_recent_post_activity(), 'editLink' => esc_url_raw( get_edit_post_link() ), 'trashLink' => esc_url_raw( get_delete_post_link() ), 'status' => esc_attr( $wp_post_statuses[ $post->post_status ]->label ), 'selected' => ap_get_post_field( 'selected' ), ); endif; endwhile; wp_send_json( $answers_arr ); } /** * Uninstall actions. * * @since 4.0.0 */ public static function ap_uninstall_data() { check_ajax_referer( 'ap_uninstall_data', '__nonce' ); $data_type = ap_sanitize_unslash( 'data_type', 'r' ); $valid_data = array( 'qa', 'answers', 'options', 'userdata', 'terms', 'tables' ); global $wpdb; // Only allow super admin to delete data. if ( is_super_admin() && in_array( $data_type, $valid_data, true ) ) { $done = 0; if ( 'qa' === $data_type ) { $count = $wpdb->get_var( "SELECT count(*) FROM $wpdb->posts WHERE post_type='question' OR post_type='answer'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type='question' OR post_type='answer' LIMIT 30" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery foreach ( (array) $ids as $id ) { if ( false !== wp_delete_post( $id, true ) ) { ++$done; } } wp_send_json( array( 'done' => (int) $done, 'total' => (int) $count, ) ); } elseif ( 'answers' === $data_type ) { $count = $wpdb->get_var( "SELECT count(*) FROM $wpdb->posts WHERE post_type='answer'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type='answer' LIMIT 30" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery foreach ( (array) $ids as $id ) { if ( false !== wp_delete_post( $id, true ) ) { ++$done; } } wp_send_json( array( 'done' => (int) $done, 'total' => (int) $count, ) ); } elseif ( 'userdata' === $data_type ) { $wp_filesystem = new WP_Filesystem_Direct( false ); $upload_dir = wp_upload_dir(); $avatar_dir = $upload_dir['basedir'] . '/ap_avatars'; if ( $wp_filesystem->is_dir( $avatar_dir ) ) { $wp_filesystem->rmdir( $avatar_dir, true ); } // Remove user roles. AP_Roles::remove_roles(); // Delete vote meta. $wpdb->delete( $wpdb->usermeta, [ 'meta_key' => '__up_vote_casted' ], array( '%s' ) ); // @codingStandardsIgnoreLine $wpdb->delete( $wpdb->usermeta, [ 'meta_key' => '__down_vote_casted' ], array( '%s' ) ); // @codingStandardsIgnoreLine wp_send_json( array( 'done' => 1, 'total' => 0, ) ); } elseif ( 'options' === $data_type ) { delete_option( 'anspress_opt' ); delete_option( 'anspress_reputation_events' ); delete_option( 'anspress_addons' ); wp_send_json( array( 'done' => 1, 'total' => 0, ) ); } elseif ( 'terms' === $data_type ) { $question_taxo = (array) get_object_taxonomies( 'question', 'names' ); $answer_taxo = (array) get_object_taxonomies( 'answer', 'names' ); $taxos = $question_taxo + $answer_taxo; foreach ( (array) $taxos as $tax ) { $terms = get_terms( array( 'taxonomy' => $tax, 'hide_empty' => false, 'fields' => 'ids', ) ); foreach ( (array) $terms as $t ) { wp_delete_term( $t, $tax ); } } wp_send_json( array( 'done' => 1, 'total' => 0, ) ); } elseif ( 'tables' === $data_type ) { $tables = array( $wpdb->ap_qameta, $wpdb->ap_votes, $wpdb->ap_views, $wpdb->ap_reputations, $wpdb->ap_subscribers, $wpdb->prefix . 'ap_notifications' ); foreach ( $tables as $table ) { $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); // phpcs:ignore WordPress.DB } wp_send_json( array( 'done' => 1, 'total' => 0, ) ); } } // Send empty JSON if nothing done. wp_send_json( array() ); } /** * Toggle addons. */ public static function ap_toggle_addon() { check_ajax_referer( 'toggle_addon', '__nonce' ); if ( ! current_user_can( 'manage_options' ) ) { ap_ajax_json( array( 'success' => false, 'snackbar' => array( 'message' => __( 'Sorry, you do not have permission!', 'anspress-question-answer' ) ), ) ); } $addon_id = ap_sanitize_unslash( 'addon_id', 'r' ); if ( ap_is_addon_active( $addon_id ) ) { $message = __( 'Successfully disabled addon. Redirecting!', 'anspress-question-answer' ); ap_deactivate_addon( $addon_id ); } else { $message = __( 'Successfully enabled addon. Redirecting!', 'anspress-question-answer' ); ap_activate_addon( $addon_id ); } // Delete page check transient. delete_transient( 'ap_pages_check' ); ap_ajax_json( array( 'success' => true, 'addon_id' => $addon_id, 'snackbar' => array( 'message' => $message ), 'cb' => 'toggleAddon', ) ); } /** * Ajax callback for 'ap_recount_votes` which recounting votes of posts. * * @return void * @since 4.0.5 */ public static function recount_votes() { if ( ! anspress_verify_nonce( 'recount_votes' ) || ! current_user_can( 'manage_options' ) ) { wp_die(); } $paged = (int) ap_sanitize_unslash( 'paged', 'r', 0 ); $offset = absint( $paged * 100 ); global $wpdb; $ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS ID FROM {$wpdb->posts} WHERE post_type IN ('question', 'answer') LIMIT {$offset},100" ); // phpcs:ignore WordPress.DB $total_found = $wpdb->get_var( 'SELECT FOUND_ROWS()' ); // phpcs:ignore WordPress.DB foreach ( (array) $ids as $id ) { ap_update_votes_count( $id ); } $done = $offset + count( $ids ); $remain = $total_found - ( $offset + count( $ids ) ); $json = array( 'success' => true, 'total' => $total_found, 'remain' => $remain, 'el' => '.ap-recount-votes', // translators: %1 is total completed, %2 is total found count. 'msg' => sprintf( __( '%1$d done out of %2$d', 'anspress-question-answer' ), $done, $total_found ), ); if ( $remain > 0 ) { $json['q'] = array( 'action' => 'ap_recount_votes', '__nonce' => wp_create_nonce( 'recount_votes' ), 'paged' => $paged + 1, ); } ap_send_json( $json ); } /** * Ajax callback for 'ap_recount_answers` which recounting answers of questions. * * @return void * @since 4.0.5 */ public static function recount_answers() { if ( ! anspress_verify_nonce( 'recount_answers' ) || ! current_user_can( 'manage_options' ) ) { wp_die(); } $paged = (int) ap_sanitize_unslash( 'paged', 'r', 0 ); $offset = absint( $paged * 100 ); global $wpdb; $ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS ID FROM {$wpdb->posts} WHERE post_type = 'question' LIMIT {$offset},100" ); // phpcs:ignore WordPress.DB // @todo Do not use FOUND_ROWS(). $total_found = $wpdb->get_var( 'SELECT FOUND_ROWS()' ); // phpcs:ignore WordPress.DB foreach ( (array) $ids as $id ) { ap_update_answers_count( $id, false, false ); } $done = $offset + count( $ids ); $remain = $total_found - ( $offset + count( $ids ) ); $json = array( 'success' => true, 'total' => $total_found, 'remain' => $remain, 'el' => '.ap-recount-answers', // translators: %1 is total completed, %2 is total found count. 'msg' => sprintf( __( '%1$d done out of %2$d', 'anspress-question-answer' ), $done, $total_found ), ); if ( $remain > 0 ) { $json['q'] = array( 'action' => 'ap_recount_answers', '__nonce' => wp_create_nonce( 'recount_answers' ), 'paged' => $paged + 1, ); } ap_send_json( $json ); } /** * Recount flags of posts. * * @return void * @since 4.0.5 */ public static function recount_flagged() { if ( ! anspress_verify_nonce( 'recount_flagged' ) || ! current_user_can( 'manage_options' ) ) { wp_die(); } global $wpdb; $paged = (int) ap_sanitize_unslash( 'paged', 'r', 0 ); $offset = absint( $paged * 100 ); $ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS ID FROM {$wpdb->posts} WHERE post_type IN ('question', 'answer') LIMIT {$offset},100" ); // phpcs:ignore WordPress.DB $total_found = $wpdb->get_var( 'SELECT FOUND_ROWS()' ); // phpcs:ignore WordPress.DB foreach ( (array) $ids as $id ) { ap_update_flags_count( $id ); } $done = $offset + count( $ids ); $remain = $total_found - ( $offset + count( $ids ) ); $json = array( 'success' => true, 'total' => $total_found, 'remain' => $remain, 'el' => '.ap-recount-flagged', // translators: %1 is total completed, %2 is total found count. 'msg' => sprintf( __( '%1$d done out of %2$d', 'anspress-question-answer' ), $done, $total_found ), ); if ( $remain > 0 ) { $json['q'] = array( 'action' => 'ap_recount_flagged', '__nonce' => wp_create_nonce( 'recount_flagged' ), 'paged' => $paged + 1, ); } ap_send_json( $json ); } /** * Recount question subscribers. * * @return void * @since 4.0.5 */ public static function recount_subscribers() { if ( ! anspress_verify_nonce( 'recount_subscribers' ) || ! current_user_can( 'manage_options' ) ) { wp_die(); } global $wpdb; $paged = (int) ap_sanitize_unslash( 'paged', 'r', 0 ); $offset = absint( $paged * 100 ); $ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS ID FROM {$wpdb->posts} WHERE post_type = 'question' LIMIT {$offset},100" ); // phpcs:ignore WordPress.DB $total_found = $wpdb->get_var( 'SELECT FOUND_ROWS()' ); // phpcs:ignore WordPress.DB foreach ( (array) $ids as $id ) { ap_update_subscribers_count( $id ); } $done = $offset + count( $ids ); $remain = $total_found - ( $offset + count( $ids ) ); $json = array( 'success' => true, 'total' => $total_found, 'remain' => $remain, 'el' => '.ap-recount-subscribers', // translators: %1 is total completed, %2 is total found count. 'msg' => sprintf( __( '%1$d done out of %2$d', 'anspress-question-answer' ), $done, $total_found ), ); if ( $remain > 0 ) { $json['q'] = array( 'action' => 'ap_recount_subscribers', '__nonce' => wp_create_nonce( 'recount_subscribers' ), 'paged' => $paged + 1, ); } ap_send_json( $json ); } /** * Recount users reputation. * * @return void * @since 4.0.5 */ public static function recount_reputation() { if ( ! anspress_verify_nonce( 'recount_reputation' ) || ! current_user_can( 'manage_options' ) ) { wp_die(); } global $wpdb; $paged = (int) ap_sanitize_unslash( 'paged', 'r', 0 ); $offset = absint( $paged * 100 ); $ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS ID FROM {$wpdb->users} LIMIT {$offset},100" ); // phpcs:ignore WordPress.DB $total_found = $wpdb->get_var( 'SELECT FOUND_ROWS()' ); // phpcs:ignore WordPress.DB foreach ( (array) $ids as $id ) { ap_update_user_reputation_meta( $id ); } $done = $offset + count( $ids ); $remain = $total_found - ( $offset + count( $ids ) ); $json = array( 'success' => true, 'total' => $total_found, 'remain' => $remain, 'el' => '.ap-recount-reputation', // translators: %1 is total completed, %2 is total found count. 'msg' => sprintf( __( '%1$d done out of %2$d', 'anspress-question-answer' ), $done, $total_found ), ); if ( $remain > 0 ) { $json['q'] = array( 'action' => 'ap_recount_reputation', '__nonce' => wp_create_nonce( 'recount_reputation' ), 'paged' => $paged + 1, ); } ap_send_json( $json ); } /** * Recount question views. * * @return void * @since 4.0.5 */ public static function recount_views() { if ( ! anspress_verify_nonce( 'recount_views' ) || ! current_user_can( 'manage_options' ) ) { wp_die(); } global $wpdb; $args = wp_parse_args( ap_sanitize_unslash( 'args', 'r', '' ), array( 'fake_views' => false, 'min_views' => 100, 'max_views' => 200, ) ); $paged = (int) ap_sanitize_unslash( 'paged', 'r', 0 ); $offset = absint( $paged * 100 ); $ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS ID FROM {$wpdb->posts} WHERE post_type = 'question' LIMIT {$offset},100" ); // phpcs:ignore WordPress.DB $total_found = $wpdb->get_var( 'SELECT FOUND_ROWS()' ); // phpcs:ignore WordPress.DB foreach ( (array) $ids as $id ) { $table_views = (int) ap_get_views( $id ); $qameta_views = (int) ap_get_post_field( 'views', $id ); if ( $qameta_views < $table_views ) { $views = $table_views + $qameta_views; } else { $views = $qameta_views; } if ( $args['fake_views'] ) { $views = $views + ap_rand( $args['min_views'], $args['max_views'], 0.5 ); } ap_update_views_count( $id, $views ); } $done = $offset + count( $ids ); $remain = $total_found - ( $offset + count( $ids ) ); $json = array( 'success' => true, 'total' => $total_found, 'remain' => $remain, 'el' => '.ap-recount-views', // translators: %1 is total completed, %2 is total found count. 'msg' => sprintf( __( '%1$d done out of %2$d', 'anspress-question-answer' ), $done, $total_found ), ); if ( $remain > 0 ) { $json['q'] = array( 'action' => 'ap_recount_views', '__nonce' => wp_create_nonce( 'recount_views' ), 'paged' => $paged + 1, ); } ap_send_json( $json ); } }
Expand full source code Collapse full source code View on GitHub: admin/ajax.php:25
Add your comment