* @copyright Copyright (c) 2010 - 2012, Justin Tadlock * @link http://justintadlock.com * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ /* Add post type support for 'entry-views'. */ add_action('init', 'entry_views_post_type_support'); /* Registers the entry views extension scripts if we're on the correct page. */ add_action('template_redirect', 'entry_views_load'); /* Add the entry views AJAX actions to the appropriate hooks. */ add_action('wp_ajax_entry_views', 'entry_views_update_ajax'); add_action('wp_ajax_nopriv_entry_views', 'entry_views_update_ajax'); /** * Adds support for 'entry-views' to the 'post', 'page', and 'attachment' post types (default WordPress * post types). For all other post types, the theme should explicitly register support for this feature. * * @since 0.2.0 * @access private * @return void */ function entry_views_post_type_support() { /* Add support for entry-views to the 'post' post type. */ add_post_type_support('post', array('entry-views')); /* Add support for entry-views to the 'page' post type. */ add_post_type_support('page', array('entry-views')); /* Add support for entry-views to the 'attachment' post type. */ add_post_type_support('attachment', array('entry-views')); } /** * Checks if we're on a singular post view and if the current post type supports the 'entry-views' * extension. If so, set the $post_id variable and load the needed JavaScript. * * @since 0.1.0 * @access private * @return void */ function entry_views_load() { global $_entry_views_post_id; /* Check if we're on a singular post view. */ if (is_singular() && !is_preview()) { /* Get the post object. */ $post = get_queried_object(); /* Check if the post type supports the 'entry-views' feature. */ if (post_type_supports($post->post_type, 'entry-views')) { /* Set the post ID for later use because we wouldn't want a custom query to change this. */ $_entry_views_post_id = get_queried_object_id(); /* Enqueue the jQuery library. */ wp_enqueue_script('jquery'); /* Load the entry views JavaScript in the footer. */ add_action('wp_footer', 'entry_views_load_scripts'); } } } /** * Updates the number of views when on a singular view of a post. This function uses post meta to store * the number of views per post. By default, the meta key is 'Views', but you can filter this with the * 'entry_views_meta_key' hook. * * @since 0.1.0 * @access public * @param int $post_id The ID of the post to update the meta for. * @return void */ function entry_views_update($post_id = '') { /* If we're on a singular view of a post, calculate the number of views. */ if (!empty($post_id)) { /* Allow devs to override the meta key used. By default, this is 'Views'. */ $meta_key = apply_filters('entry_views_meta_key', 'Views'); /* Get the number of views the post currently has. */ $old_views = get_post_meta($post_id, $meta_key, true); /* Add +1 to the number of current views. */ $new_views = absint($old_views) + 1; /* Update the view count with the new view count. */ update_post_meta($post_id, $meta_key, $new_views, $old_views); } } /** * Gets the number of views a specific post has. It also doubles as a shortcode, which is called with the * [entry-views] format. * * @since 0.1.0 * @access public * @param array $attr Attributes for use in the shortcode. * @return string */ function entry_views_get($attr = '') { /* Merge the defaults and the given attributes. */ $attr = shortcode_atts(array('before' => '', 'after' => '', 'post_id' => get_the_ID()), $attr); /* Allow devs to override the meta key used. */ $meta_key = apply_filters('entry_views_meta_key', 'Views'); /* Get the number of views the post has. */ $views = intval(get_post_meta($attr['post_id'], $meta_key, true)); /* Returns the formatted number of views. */ return $attr['before'] . number_format_i18n($views) . $attr['after']; } /** * Callback function hooked to 'wp_ajax_entry_views' and 'wp_ajax_nopriv_entry_views'. It checks the * AJAX nonce and passes the given $post_id to the entry views update function. * * @since 0.1.0 * @access private * @return void */ function entry_views_update_ajax() { /* Check the AJAX nonce to make sure this is a valid request. */ check_ajax_referer('entry_views_ajax'); /* If the post ID is set, set it to the $post_id variable and make sure it's an integer. */ if (isset($_POST['post_id'])) $post_id = absint($_POST['post_id']); /* If $post_id isn't empty, pass it to the entry_views_update() function to update the view count. */ if (!empty($post_id)) entry_views_update($post_id); } /** * Displays a small script that sends an AJAX request for the page. It passes the $post_id to the AJAX * callback function for updating the meta. * * @since 0.1.0 * @access private * @return void */ function entry_views_load_scripts() { global $_entry_views_post_id; /* Create a nonce for the AJAX request. */ $nonce = wp_create_nonce('entry_views_ajax'); /* Display the JavaScript needed. */ echo '' . "\n"; }