ID ) || ( doing_filter( 'the_content' ) && isset( $wp_filters['the_content'] ) && (int) $wp_filters['the_content'] !== $filter_calls ) ) { return $content; } // Exclude posts that should not display the viewed count. $exclude_on_post_ids = explode( ',', \tptn_get_option( 'exclude_on_post_ids' ) ); if ( isset( $post ) && in_array( $post->ID, $exclude_on_post_ids, true ) ) { return $content; } // Determine where to add the viewed count. $add_to = wp_parse_list( \tptn_get_option( 'add_to', array() ) ); $conditions = array( 'single' => is_single(), 'page' => is_page(), 'home' => is_home(), 'category_archives' => is_category(), 'tag_archives' => is_tag(), 'other_archives' => is_tax() || is_author() || is_date(), ); foreach ( $conditions as $key => $condition ) { if ( $condition && in_array( $key, $add_to, true ) ) { return $content . self::echo_post_count( 0 ); } } return $content; } /** * Filter to display the post count when viewing feeds. * * @since 1.9.8 * * @param string $content Post content. * @return string Filtered post content */ public static function rss_filter( $content ) { global $post; $id = intval( $post->ID ); $add_to = \tptn_get_option( 'add_to', false ); if ( ! empty( $add_to['feed'] ) ) { return $content . '
' . self::get_post_count( $id ) . '
'; } else { return $content; } } /** * Function to manually display count. * * @since 1.0 * @param int|boolean $echo_output Flag to echo the output. * @return string|void Formatted string if $echo_output is set to 0|false */ public static function echo_post_count( $echo_output = 1 ) { global $post; $home_url = home_url( '/' ); /** * Filter the script URL of the counter. * * @since 2.0 */ $home_url = apply_filters( 'tptn_view_counter_script_url', $home_url ); // Strip any query strings since we don't need them. $home_url = strtok( $home_url, '?' ); $id = intval( $post->ID ); if ( \tptn_get_option( 'dynamic_post_count' ) ) { $nonce_action = 'tptn-nonce-' . $id; $nonce = wp_create_nonce( $nonce_action ); $fetch_url = add_query_arg( array( 'top_ten_id' => $id, 'view_counter' => 1, '_wpnonce' => $nonce, ), $home_url ); wp_enqueue_script( 'tptn-counter', plugins_url( 'includes/js/top-10-counter.min.js', TOP_TEN_PLUGIN_FILE ), array(), TOP_TEN_VERSION, true ); $output = sprintf( '
', $id, esc_url( $fetch_url ) ); } else { $output = '
' . self::get_post_count( $id ) . '
'; } /** * Filter the viewed count script * * @since 2.0.0 * * @param string $output Counter viewed count code */ $output = apply_filters( 'tptn_view_post_count', $output ); if ( $echo_output ) { echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } else { return $output; } } /** * Return the formatted post count for the supplied ID. * * @since 3.3.0 * @since 4.0.0 Added $args parameter. * * @param int|string|\WP_Post $post Post ID or WP_Post object. * @param int|string $blog_id Blog ID. * @param array $args Additional arguments. * @return string Formatted post count */ public static function get_post_count( $post = 0, $blog_id = 0, $args = array() ) { if ( $post instanceof \WP_Post ) { $id = $post->ID; } else { $id = absint( $post ); } if ( $id <= 0 ) { return ''; } $count_disp_form = isset( $args['count_disp_form'] ) ? $args['count_disp_form'] : stripslashes( \tptn_get_option( 'count_disp_form' ) ); $count_disp_form_zero = isset( $args['count_disp_form_zero'] ) ? $args['count_disp_form_zero'] : stripslashes( \tptn_get_option( 'count_disp_form_zero' ) ); $total_count = self::get_post_count_only( $id, 'total', $blog_id ); $is_singular = is_singular(); $is_zero_total_count = ( 0 === (int) $total_count ); if ( $is_zero_total_count && ! $is_singular ) { $count_disp_form_zero = str_replace( '%totalcount%', (string) $total_count, $count_disp_form_zero ); } else { $count_disp_form = str_replace( '%totalcount%', Helpers::number_format_i18n( $is_zero_total_count ? $total_count + 1 : $total_count ), $count_disp_form ); } foreach ( array( 'daily', 'overall' ) as $type ) { if ( false !== strpos( $count_disp_form, "%{$type}count%" ) || false !== strpos( $count_disp_form_zero, "%{$type}count%" ) ) { $count = self::get_post_count_only( $id, $type ); if ( $is_zero_total_count && ! $is_singular ) { $count_disp_form_zero = str_replace( "%{$type}count%", (string) $count, $count_disp_form_zero ); } else { $is_zero_cntaccess = ( 0 === (int) $count ); $count_disp_form = str_replace( "%{$type}count%", Helpers::number_format_i18n( $is_zero_cntaccess ? $count + 1 : $count ), $count_disp_form ); } } } return apply_filters( 'tptn_post_count', ( $is_zero_total_count && ! $is_singular ) ? $count_disp_form_zero : $count_disp_form ); } /** * Returns the post count. * * @since 3.3.0 * * @param int|\WP_Post $post Post ID or WP_Post object. * @param string $counter Which count to return? total, daily or overall. * @param int $blog_id Blog ID. * @param array $args Additional arguments. * @return int|string Post count */ public static function get_post_count_only( $post = 0, $counter = 'total', $blog_id = 0, $args = array() ) { global $wpdb; if ( $post instanceof \WP_Post ) { $id = $post->ID; } else { $id = absint( $post ); } $defaults = array( 'format_number' => false, 'from_date' => '', 'to_date' => '', ); $args = wp_parse_args( $args, $defaults ); // Sanitize the attributes. $args = Helpers::sanitize_args( $args ); if ( empty( $blog_id ) ) { $blog_id = get_current_blog_id(); } if ( $id > 0 || 'overall' === $counter ) { $post_count = 0; switch ( $counter ) { case 'total': $post_count = Database::get_count( $id, $blog_id, false ); break; case 'daily': $date_range = array(); if ( ! empty( $args['from_date'] ) ) { $date_range['from_date'] = Helpers::get_from_date( $args['from_date'], 0, 0 ); } if ( ! empty( $args['to_date'] ) ) { $date_range['to_date'] = Helpers::get_from_date( $args['to_date'], 0, 0 ); } if ( empty( $date_range ) ) { $date_range['from_date'] = Helpers::get_from_date(); } $post_count = Database::get_count( $id, $blog_id, true, $date_range ); break; case 'overall': $post_count = Database::get_total_count( $blog_id, false ); break; } if ( $args['format_number'] ) { $post_count = number_format_i18n( $post_count ); } /** * Returns the post count. * * @since 2.6.0 * * @param int|string $post_count Post count. * @param mixed $id Post ID. * @param string $counter Which count to return? total, daily or overall. * @param int $blog_id Blog ID. */ return apply_filters( 'tptn_post_count_only', $post_count, $id, $counter, $blog_id ); } else { return 0; } } /** * Delete the counts from the selected table. * * @since 3.3.0 * * @param string|array $args { * Optional. Array or string of Query parameters. * * @type bool $daily Set to true for daily table. False for overall. * @type array|string $post_id An array or comma-separated string of post IDs. Empty string or array for all IDs. Default is blank. * @type array|string $blog_id An array or comma-separated string of blog IDs. Empty string or array for all IDs. Default is current blog ID. * @type string $db_date The date before which to delete data. Default is empty string which means all dates. Applies to daily table only. * } * @return int|false The number of rows updated, or false on error. */ public static function delete_counts( $args = array() ) { $defaults = array( 'daily' => true, 'post_id' => '', 'blog_id' => get_current_blog_id(), 'dp_date' => '', ); $args = wp_parse_args( $args, $defaults ); // Convert the arguments to match Database class format. $db_args = array( 'daily' => $args['daily'], 'post_ids' => wp_parse_id_list( $args['post_id'] ), 'to_date' => $args['dp_date'], ); // Handle blog_id conversion. if ( ! empty( $args['blog_id'] ) && is_array( $args['blog_id'] ) ) { // If multiple blog IDs, we need to delete for each one. $result = 0; foreach ( $args['blog_id'] as $blog_id ) { $db_args['blog_id'] = $blog_id; $result += Database::delete_counts( $db_args ); } return $result; } else { $db_args['blog_id'] = is_array( $args['blog_id'] ) ? reset( $args['blog_id'] ) : $args['blog_id']; return Database::delete_counts( $db_args ); } } /** * Delete post count. * * @since 3.3.0 * * @param int $post_id Post ID. * @param int $blog_id Blog ID. * @param bool $daily Daily flag. * @return bool|int Number of rows affected or false if error. */ public static function delete_count( $post_id, $blog_id, $daily = false ) { global $wpdb; $post_id = intval( $post_id ); $blog_id = intval( $blog_id ); if ( empty( $post_id ) || empty( $blog_id ) ) { return false; } $results = self::delete_counts( array( 'post_id' => $post_id, 'blog_id' => $blog_id, 'daily' => $daily, ) ); return $results; } /** * Function to update the Top 10 count with ajax. * * @since 3.3.0 */ public static function edit_count_ajax() { // Security check. check_ajax_referer( 'top_ten_admin_nonce', 'top_ten_admin_nonce' ); if ( ! isset( $_REQUEST['total_count'] ) || ! isset( $_REQUEST['post_id'] ) || ! isset( $_REQUEST['total_count_original'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended wp_die(); } $results = 0; $post_id = absint( $_REQUEST['post_id'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended $blog_id = isset( $_REQUEST['blog_id'] ) ? absint( $_REQUEST['blog_id'] ) : get_current_blog_id(); // phpcs:ignore WordPress.Security.NonceVerification.Recommended $total_count = absint( filter_var( $_REQUEST['total_count'], FILTER_SANITIZE_NUMBER_INT ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.MissingUnslash $total_count_original = absint( filter_var( $_REQUEST['total_count_original'], FILTER_SANITIZE_NUMBER_INT ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.MissingUnslash // Check permissions. if ( isset( $_REQUEST['blog_id'] ) && absint( $_REQUEST['blog_id'] ) !== get_current_blog_id() ) { // In network mode (editing a different blog's data), require manage_network capability. if ( ! current_user_can( 'manage_network' ) ) { wp_die(); } } else { // Switch to the target blog to check edit permissions. $target_blog_id = isset( $_REQUEST['blog_id'] ) ? absint( $_REQUEST['blog_id'] ) : get_current_blog_id(); if ( get_current_blog_id() !== $target_blog_id ) { switch_to_blog( $target_blog_id ); } $can_edit = current_user_can( 'edit_post', $post_id ); // Switch back if we switched. if ( get_current_blog_id() !== $target_blog_id ) { restore_current_blog(); } if ( ! $can_edit ) { wp_die(); } } if ( $total_count_original !== $total_count ) { $results = self::edit_count( $post_id, $blog_id, $total_count ); } echo wp_json_encode( $results ); wp_die(); } /** * Edit post count. * * @since 3.3.0 * * @param int $post_id Post ID. * @param int $blog_id Blog ID. * @param int $total_count Total count. * @return bool|int Number of rows affected or false if error. */ public static function edit_count( $post_id, $blog_id, $total_count ) { $post_id = intval( $post_id ); $blog_id = intval( $blog_id ); $total_count = intval( $total_count ); if ( empty( $post_id ) || empty( $blog_id ) || empty( $total_count ) ) { return false; } return Database::set_count( $post_id, $total_count, $blog_id, false ); } }