diff --git a/eth-simple-shortlinks.php b/eth-simple-shortlinks.php index 3abbdabdd76c92d8fb363efa7b34b9d49fce7343..24c3244668c36e55cfb60e41a60b6eee3c591540 100644 --- a/eth-simple-shortlinks.php +++ b/eth-simple-shortlinks.php @@ -4,7 +4,7 @@ Plugin Name: ETH Simple Shortlinks Plugin URI: https://ethitter.com/plugins/ Description: Simple non-GET shortlinks using post IDs Author: Erick Hitter -Version: 0.2 +Version: 0.3 Author URI: https://ethitter.com/ This program is free software; you can redistribute it and/or modify @@ -56,17 +56,24 @@ class ETH_Simple_Shortlinks { private $slug = 'p'; private $qv = 'eth-shortlink'; + private $supported_post_types = array(); + private $supported_post_statuses = array(); + /** - * + * Register actions and filters */ private function __construct() { // Request add_action( 'init', array( $this, 'add_rewrite_rule' ) ); + add_action( 'wp_loaded', array( $this, 'filter_support' ) ); add_filter( 'query_vars', array( $this, 'filter_query_vars' ) ); add_action( 'parse_request', array( $this, 'action_parse_request' ) ); // Shortlink add_filter( 'get_shortlink', array( $this, 'filter_get_shortlink' ), 10, 2 ); + add_action( 'admin_head-edit.php', array( $this, 'add_admin_header_assets' ) ); + add_filter( 'post_row_actions', array( $this, 'filter_row_actions' ), 10, 2 ); + add_filter( 'page_row_actions', array( $this, 'filter_row_actions' ), 10, 2 ); } /** @@ -76,6 +83,14 @@ class ETH_Simple_Shortlinks { add_rewrite_rule( '^' . $this->slug . '/([\d]+)/?$', 'index.php?p=$matches[1]&' . $this->qv . '=1', 'top' ); } + /** + * Allow filtering of supported statuses and types + */ + public function filter_support() { + $this->supported_post_statuses = apply_filters( 'eth_simple_shortlinks_allowed_post_statuses', array( 'publish', 'future' ) ); + $this->supported_post_types = apply_filters( 'eth_simple_shortlinks_allowed_post_types', array( 'post', 'page' ) ); + } + /** * Add custom query var to those permitted, so it can be detected at `parse_request` */ @@ -119,16 +134,71 @@ class ETH_Simple_Shortlinks { return $shortlink; } - if ( ! in_array( get_post_status( $id ), apply_filters( 'eth_simple_shortlinks_allowed_post_statuses', array( 'publish', 'future' ) ) ) ) { + if ( ! in_array( get_post_status( $id ), $this->supported_post_statuses ) ) { return $shortlink; } - if ( ! in_array( get_post_type( $id ), apply_filters( 'eth_simple_shortlinks_allowed_post_types', array( 'post', 'page' ) ) ) ) { + if ( ! in_array( get_post_type( $id ), $this->supported_post_types ) ) { return $shortlink; } - return user_trailingslashit( home_url( sprintf( '%s/%d', $this->slug, $id ) ) ); + return $this->get_shortlink( $id ); + } + + /** + * Header assets for shortlink in row actions + */ + public function add_admin_header_assets() { + global $typenow; + if ( ! in_array( $typenow, $this->supported_post_types ) ) { + return; + } + + ?> + <script type="text/javascript"> + + jQuery( document ) .ready( function( $ ) { + $( '.row-actions .shortlink a' ).click( function( e ) { + e.preventDefault(); + + prompt( 'URL:', $( this ).attr('href') ); + } ); + } ); + </script> + <?php + } + + /** + * Provide the shortlink in row actions for easy access + */ + public function filter_row_actions( $actions, $post ) { + if ( ! in_array( get_post_type( $post ), $this->supported_post_types ) ) { + return $actions; + } + + $actions['shortlink'] = '<a href="' . esc_js( $this->get_shortlink( $post->ID ) ) . '">Shortlink</a>'; + + return $actions; + } + + /** + * Utility method for building permlink + */ + public function get_shortlink( $post_id ) { + return user_trailingslashit( home_url( sprintf( '%s/%d', $this->slug, $post_id ) ) ); } } ETH_Simple_Shortlinks::get_instance(); + +/** + * Shortcut for using the shortlink outside of this plugin's considerations + */ +function eth_simple_shortlinks_get( $post_id ) { + if ( ! did_action( 'wp_loaded' ) ) { + _doing_it_wrong( __FUNCTION__, 'Shortlinks cannot be generated until after <code>wp_loaded</code>; this ensures that all post types are registered.', '0.3' ); + return false; + } + + return ETH_Simple_Shortlinks::get_instance()->get_shortlink( $post_id ); +}