Activity_Helper()
Description #
Class which has helper methods for AnsPress activities.
Source #
File: includes/class/class-activity-helper.php
class Activity_Helper { /** * Refers to a single instance of this class. * * @var null|object */ private static $instance = null; /** * The current table name * * @var boolean|string */ private $table = false; /** * The activity actions. * * @var array * @since 4.1.2 */ private $actions = array(); /** * Creates or returns an instance of this class. * * @return Activity A single instance of this class. */ public static function get_instance() { if ( null === self::$instance ) { self::$instance = new self(); self::hooks(); } return self::$instance; } /** * Constructor for the database class to inject the table name */ private function __construct() { global $wpdb; $this->table = $wpdb->ap_activity; $this->prepare_actions(); } /** * Register all hooks of activities. * * @return void * @since 4.1.2 */ private static function hooks() { anspress()->add_action( 'before_delete_post', __CLASS__, '_before_delete' ); anspress()->add_action( 'delete_comment', __CLASS__, '_delete_comment' ); anspress()->add_action( 'delete_user', __CLASS__, '_delete_user' ); anspress()->add_action( 'ap_ajax_more_activities', __CLASS__, '_ajax_more_activities' ); } /** * Callback for `before_delete_post`. * * Deletes activities related to a post. * * @param integer $post_id Post id. * @return void * @since 4.1.2 */ public static function _before_delete( $post_id ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore $_post = ap_get_post( $post_id ); // Return if not AnsPress cpt. if ( ! ap_is_cpt( $_post ) ) { return; } ap_delete_post_activity( $post_id ); } /** * Callback for `delete_comment`. * * Deletes activities related to a comment. * * @param integer $comment_id Comment id. * @return void * @since 4.1.2 */ public static function _delete_comment( $comment_id ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore ap_delete_comment_activity( $comment_id ); } /** * Callback for loading more activities. * * @return void */ public static function _ajax_more_activities() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore // Check ajax referer. if ( ! check_ajax_referer( 'load_activities', '__nonce', false ) ) { ap_ajax_json( 'something_wrong' ); } $activities = new \AnsPress\Activity( array( 'paged' => max( 1, ap_isset_post_value( 'paged', 1 ) ), ) ); ob_start(); include ap_get_theme_location( 'activities/activities.php' ); $html = ob_get_clean(); ap_ajax_json( array( 'success' => true, 'html' => $html, 'cb' => 'loadedMoreActivities', ) ); } /** * Callback for `delete_user`. * * Deletes activities related to a user. * * @param integer $user_id User id. * @return void * @since 4.1.2 */ public static function _delete_user( $user_id ) { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore ap_delete_user_activity( $user_id ); } /** * Prepare all actions of activity. Numeric keys are used here so that we can save * space while saving in database. * * @return void * @since 4.1.2 */ public function prepare_actions() { $defaults = array( 'new_q' => array( 'ref_type' => 'question', 'verb' => __( 'Asked question', 'anspress-question-answer' ), 'icon' => 'apicon-question', ), 'edit_q' => array( 'ref_type' => 'question', 'verb' => __( 'Edited question', 'anspress-question-answer' ), 'icon' => 'apicon-pencil', ), 'new_a' => array( 'ref_type' => 'answer', 'verb' => __( 'Answered question', 'anspress-question-answer' ), 'icon' => 'apicon-answer', ), 'edit_a' => array( 'ref_type' => 'answer', 'verb' => __( 'Edited answer', 'anspress-question-answer' ), 'icon' => 'apicon-answer', ), 'status_publish' => array( 'ref_type' => 'post', 'verb' => __( 'Changed status to publish', 'anspress-question-answer' ), 'icon' => 'apicon-flag', ), 'status_future' => array( 'ref_type' => 'post', 'verb' => __( 'Changed publish date to future', 'anspress-question-answer' ), 'icon' => 'apicon-flag', ), 'status_moderate' => array( 'ref_type' => 'post', 'verb' => __( 'Changed status to moderate', 'anspress-question-answer' ), 'icon' => 'apicon-flag', ), 'status_private_post' => array( 'ref_type' => 'post', 'verb' => __( 'Changed visibility to private', 'anspress-question-answer' ), 'icon' => 'apicon-flag', ), 'status_trash' => array( 'ref_type' => 'post', 'verb' => __( 'Trashed', 'anspress-question-answer' ), 'icon' => 'apicon-trashcan', ), 'featured' => array( 'ref_type' => 'question', 'verb' => __( 'Marked as featured question', 'anspress-question-answer' ), 'icon' => 'apicon-star', ), 'unfeatured' => array( 'ref_type' => 'question', 'verb' => __( 'Unfeatured the question', 'anspress-question-answer' ), 'icon' => 'apicon-question', ), 'closed_q' => array( 'ref_type' => 'question', 'verb' => __( 'Marked as closed', 'anspress-question-answer' ), 'icon' => 'apicon-alert', ), 'open_q' => array( 'ref_type' => 'question', 'verb' => __( 'Re-opened the question', 'anspress-question-answer' ), 'icon' => 'apicon-question', ), 'new_c' => array( 'ref_type' => 'comment', 'verb' => __( 'Posted new comment', 'anspress-question-answer' ), 'icon' => 'apicon-comments', ), 'edit_c' => array( 'ref_type' => 'comment', 'verb' => __( 'Edited comment', 'anspress-question-answer' ), 'icon' => 'apicon-comments', ), 'selected' => array( 'ref_type' => 'answer', 'verb' => __( 'Selected answer as best', 'anspress-question-answer' ), 'icon' => 'apicon-check', ), 'unselected' => array( 'ref_type' => 'answer', 'verb' => __( 'Unselected an answer', 'anspress-question-answer' ), 'icon' => 'apicon-check', ), ); /** * Filter allows adding new activity actions. This hook is only called once * while class initiate. Hence, later filters will not work. Also make sure * to keep array key length less then 20 characters. * * @param array $actions Originally registered actions. * @since 4.1.2 */ $actions = apply_filters( 'ap_activity_actions', $defaults ); // We have to check for array key length and must keep it below 20 characters. foreach ( $actions as $key => $action ) { $this->actions[ $key ] = $action; } } /** * Return all registered actions of AnsPress. * * @return array * @since 4.1.2 */ public function get_actions() { return $this->actions; } /** * Return a single registered action of AnsPress. * * @param string $key Action name. * @return array * @since 4.1.2 */ public function get_action( $key ) { if ( $this->action_exists( $key ) ) { return $this->actions[ $key ]; } return array(); } /** * Check if activity action exists. * * @param string $action Action key, must be below 20 characters. * @return boolean * @since 4.1.2 */ public function action_exists( $action ) { // Get only actions key. $action_keys = array_keys( $this->actions ); return in_array( $action, $action_keys, true ); } /** * Insert activity data into the database. `$q_id` argument cannot be * left blank as it is required. * * @param array $args { * Arguments for insert query. * * @type string $action Registered action key. * @type integer $q_id Question id. This is a required argument. * @type integer $a_id Answer id. This argument is optional. * @type integer $c_id Comment id. This argument is optional. * @type integer $user_id User id. This is optional. * @type string $date Date of activity. Current time is used by default. * } * @since 4.1.2 * @since 4.1.8 Add GMT offset in `current_time`. */ public function insert( $args = array() ) { global $wpdb; $args = wp_parse_args( $args, array( 'action' => '', 'q_id' => 0, 'a_id' => 0, 'c_id' => 0, 'user_id' => get_current_user_id(), 'date' => current_time( 'mysql', true ), ) ); // Check if question id exists. if ( empty( $args['q_id'] ) ) { return new WP_Error( 'question_id_empty', __( 'Question id is required.', 'anspress-question-answer' ) ); } // Check if valid action. if ( ! $this->action_exists( $args['action'] ) ) { return new WP_Error( 'not_valid_action', __( 'Not a valid action', 'anspress-question-answer' ) ); } // split date for validation. $mm = substr( $args['date'], 5, 2 ); $jj = substr( $args['date'], 8, 2 ); $aa = substr( $args['date'], 0, 4 ); $valid_date = wp_checkdate( $mm, $jj, $aa, $args['date'] ); // Validate date. if ( ! $valid_date ) { return new WP_Error( 'invalid_date', __( 'Invalid date', 'anspress-question-answer' ) ); } // Insert. $inserted = $wpdb->insert( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery $this->table, array( 'activity_action' => $args['action'], 'activity_q_id' => $args['q_id'], 'activity_a_id' => $args['a_id'], 'activity_c_id' => $args['c_id'], 'activity_user_id' => $args['user_id'], 'activity_date' => $args['date'], ), array( '%s', '%d', '%d', '%d', '%d', '%s', ) ); if ( ! $inserted ) { return new WP_Error( 'insert_activity_failed', __( 'Failed to insert activity', 'anspress-question-answer' ) ); } /** * Hook called right after an activity get inserted to database. * * @param array $args Insert arguments. * @since 4.1.2 */ do_action( 'ap_activity_inserted', $args ); return $wpdb->insert_id; } /** * Get activity by activity_id. * * @param integer $activity_id Activity id. * @return boolean|object * @since 4.1.2 */ public function get_activity( $activity_id ) { global $wpdb; if ( empty( $activity_id ) ) { return false; } return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->ap_activity WHERE activity_id = %d", $activity_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery } /** * Delete single and multiple activity from database. * * @param array $where { * Where clause for delete query. * * @type string $action Activity action name. * @type integer $q_id Question id. This is a required argument. * @type integer $a_id Answer id. This is optional. * @type integer $c_id Comment id. This is optional. * @type integer $user_id Activity user id. This is optional. * @type string $date Activity date. This is optional. * } * @return WP_Error|integer Return numbers of rows deleted on success. * @since 4.1.2 */ public function delete( $where ) { global $wpdb; $where = wp_array_slice_assoc( $where, array( 'action', 'a_id', 'c_id', 'q_id', 'user_id', 'date' ) ); $types = array(); $cols = array(); foreach ( $where as $key => $value ) { if ( in_array( $key, array( 'action', 'date' ), true ) ) { $types[] = '%s'; } else { $types[] = '%d'; } $cols[ 'activity_' . $key ] = $value; } // Check if there are columns. if ( empty( $cols ) ) { return new WP_Error( 'no_cols', __( 'No columns found in where clue', 'anspress-question-answer' ) ); } $deleted = $wpdb->delete( $this->table, $cols, $types ); // phpcs:ignore WordPress.DB if ( false === $deleted ) { return new WP_Error( 'failed_to_delete', __( 'Failed to delete activity rows.', 'anspress-question-answer' ) ); } /** * Hook triggered right after an AnsPress activity is deleted from database. * * @param array $where Where clauses. * @since 4.1.2 */ do_action( 'ap_activity_deleted', $where ); return $deleted; } }
Expand full source code Collapse full source code View on GitHub: includes/class/class-activity-helper.php:28
Add your comment