0.3, see readme.text
This commit is contained in:
parent
9b980e55a3
commit
86b05a29ee
2 changed files with 116 additions and 20 deletions
|
@ -4,7 +4,7 @@ Donate link: https://paypal.me/petermolnar/3
|
||||||
Tags: shortlink, shorturl, slug
|
Tags: shortlink, shorturl, slug
|
||||||
Requires at least: 3.0
|
Requires at least: 3.0
|
||||||
Tested up to: 4.4
|
Tested up to: 4.4
|
||||||
Stable tag: 0.2
|
Stable tag: 0.3
|
||||||
License: GPLv3
|
License: GPLv3
|
||||||
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
||||||
Required minimum PHP version: 5.3
|
Required minimum PHP version: 5.3
|
||||||
|
@ -32,6 +32,13 @@ Version numbering logic:
|
||||||
* every .B version indicates new features.
|
* every .B version indicates new features.
|
||||||
* every ..C indicates bugfixes for A.B version.
|
* every ..C indicates bugfixes for A.B version.
|
||||||
|
|
||||||
|
= 0.3 =
|
||||||
|
*2016-03-01*
|
||||||
|
|
||||||
|
* added auto-cleanup on publish
|
||||||
|
* added auto-cleanup for impossible shortslugs
|
||||||
|
* added better logging
|
||||||
|
|
||||||
= 0.2 =
|
= 0.2 =
|
||||||
*2015-12-03*
|
*2015-12-03*
|
||||||
|
|
||||||
|
|
127
wp-shortslug.php
127
wp-shortslug.php
|
@ -3,7 +3,7 @@
|
||||||
Plugin Name: wp-shortslug
|
Plugin Name: wp-shortslug
|
||||||
Plugin URI: https://github.com/petermolnar/wp-shortslug
|
Plugin URI: https://github.com/petermolnar/wp-shortslug
|
||||||
Description: reversible automatic short slug based on post pubdate epoch for WordPress
|
Description: reversible automatic short slug based on post pubdate epoch for WordPress
|
||||||
Version: 0.2
|
Version: 0.3
|
||||||
Author: Peter Molnar <hello@petermolnar.eu>
|
Author: Peter Molnar <hello@petermolnar.eu>
|
||||||
Author URI: http://petermolnar.eu/
|
Author URI: http://petermolnar.eu/
|
||||||
License: GPLv3
|
License: GPLv3
|
||||||
|
@ -44,6 +44,11 @@ class WP_SHORTSLUG {
|
||||||
// trigger fallback redirection by _wp_old_slug
|
// trigger fallback redirection by _wp_old_slug
|
||||||
add_action( 'wp_head', array(&$this, 'try_redirect'));
|
add_action( 'wp_head', array(&$this, 'try_redirect'));
|
||||||
|
|
||||||
|
// register new posts
|
||||||
|
add_action( "transition_post_status", array(&$this, "maybe_generate_slug"), 1, 3 );
|
||||||
|
add_action( "transition_post_status", array( &$this, 'check_shorturl' ), 2, 3 );
|
||||||
|
|
||||||
|
/*
|
||||||
if (function_exists('is_admin') && is_admin() && !defined('DOING_AJAX')) {
|
if (function_exists('is_admin') && is_admin() && !defined('DOING_AJAX')) {
|
||||||
$statuses = array ('new', 'draft', 'auto-draft', 'pending', 'private', 'future' );
|
$statuses = array ('new', 'draft', 'auto-draft', 'pending', 'private', 'future' );
|
||||||
foreach ($statuses as $status) {
|
foreach ($statuses as $status) {
|
||||||
|
@ -51,6 +56,7 @@ class WP_SHORTSLUG {
|
||||||
add_action("{$status}_to_publish", array(&$this, "maybe_generate_slug"), 1);
|
add_action("{$status}_to_publish", array(&$this, "maybe_generate_slug"), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +98,11 @@ class WP_SHORTSLUG {
|
||||||
|
|
||||||
$url = static::shortslug($post);
|
$url = static::shortslug($post);
|
||||||
|
|
||||||
$base = rtrim( get_bloginfo('url'), '/' ) . '/';
|
if ( defined ('SHORTSLUG_BASE') )
|
||||||
|
$base = SHORTSLUG_BASE . '/';
|
||||||
|
else
|
||||||
|
$base = rtrim( get_bloginfo('url'), '/' ) . '/';
|
||||||
|
|
||||||
return $base.$url;
|
return $base.$url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,20 +148,36 @@ class WP_SHORTSLUG {
|
||||||
* since WordPress has it's built-in rewrite engine, it's eaiser to use
|
* since WordPress has it's built-in rewrite engine, it's eaiser to use
|
||||||
* that for adding the short urls
|
* that for adding the short urls
|
||||||
*/
|
*/
|
||||||
public static function check_shorturl($post = null) {
|
public static function check_shorturl( $new_status = false, $old_status = false, $post = null ) {
|
||||||
$post = static::fix_post($post);
|
$post = static::fix_post($post);
|
||||||
|
|
||||||
if ($post === false)
|
if ($post === false)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
$meta = get_post_meta( $post->ID, '_wp_old_slug', false);
|
||||||
$url36 = static::shortslug($post);
|
$url36 = static::shortslug($post);
|
||||||
|
static::debug("current slug for #{$post->ID}: '{$url36}'" );
|
||||||
|
$epoch = get_the_time('U', $post->ID);
|
||||||
|
|
||||||
|
foreach ($meta as $key => $slug ) {
|
||||||
|
$decoded = static::url2epoch ( $slug );
|
||||||
|
|
||||||
|
// base36 matches which are older than the publish date should be deleted
|
||||||
|
if (preg_match('/^[0-9a-z]{5,6}$/', $slug) && $decoded < $epoch && $slug != $url36 ) {
|
||||||
|
static::debug( "deleting slug '{$slug}' from #{$post->ID} - it's older than publish date so it can't be in use" );
|
||||||
|
delete_post_meta($post->ID, '_wp_old_slug', $slug);
|
||||||
|
unset($meta[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// back away at this point if this post is not yet published
|
||||||
|
if ( 'publish' != $new_status )
|
||||||
|
return false;
|
||||||
|
|
||||||
// if the generated url is the same as the current slug, walk away
|
// if the generated url is the same as the current slug, walk away
|
||||||
if ( $url36 == $post->post_name )
|
if ( $url36 == $post->post_name )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$meta = get_post_meta( $post->ID, '_wp_old_slug', false);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* there should be only our shorturl living here, so in case
|
* there should be only our shorturl living here, so in case
|
||||||
* WP did something nasty, clean up the too many shortslugs
|
* WP did something nasty, clean up the too many shortslugs
|
||||||
|
@ -160,8 +186,10 @@ class WP_SHORTSLUG {
|
||||||
* matching the criteria of lowecase-with-nums, 5 at max 6 char length
|
* matching the criteria of lowecase-with-nums, 5 at max 6 char length
|
||||||
* shouldn't really exist
|
* shouldn't really exist
|
||||||
*
|
*
|
||||||
*/
|
* also do this if this is a fresh post publish to clean up leftovers
|
||||||
if ( count($meta) > 6 ) {
|
*
|
||||||
|
*
|
||||||
|
if ( count($meta) > 3 ) ) {
|
||||||
foreach ($meta as $key => $slug ) {
|
foreach ($meta as $key => $slug ) {
|
||||||
// base36 matches
|
// base36 matches
|
||||||
if (preg_match('/^[0-9a-z]{5,6}$/', $slug)) {
|
if (preg_match('/^[0-9a-z]{5,6}$/', $slug)) {
|
||||||
|
@ -171,7 +199,9 @@ class WP_SHORTSLUG {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// if we somehow deleted the actual slug, fix it
|
||||||
if ( !in_array($url36,$meta)) {
|
if ( !in_array($url36,$meta)) {
|
||||||
static::debug('adding slug ' . $url36 . ' to ' . $post->ID );
|
static::debug('adding slug ' . $url36 . ' to ' . $post->ID );
|
||||||
add_post_meta($post->ID, '_wp_old_slug', $url36);
|
add_post_meta($post->ID, '_wp_old_slug', $url36);
|
||||||
|
@ -184,7 +214,7 @@ class WP_SHORTSLUG {
|
||||||
* since WordPress has it's built-in rewrite engine, it's eaiser to use
|
* since WordPress has it's built-in rewrite engine, it's eaiser to use
|
||||||
* that for adding the short urls
|
* that for adding the short urls
|
||||||
*/
|
*/
|
||||||
public static function maybe_generate_slug($post = null) {
|
public static function maybe_generate_slug( $new_status, $old_status, $post ) {
|
||||||
$post = static::fix_post($post);
|
$post = static::fix_post($post);
|
||||||
|
|
||||||
if ($post === false)
|
if ($post === false)
|
||||||
|
@ -198,10 +228,21 @@ class WP_SHORTSLUG {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$url36 = static::shortslug($post);
|
|
||||||
|
|
||||||
static::debug( 'replacing slug of '. $post->ID .' with shortslug: ' . $url36 );
|
static::debug( 'replacing slug of '. $post->ID .' with shortslug: ' . $url36 );
|
||||||
|
|
||||||
|
// generate new
|
||||||
|
$url36 = static::shortslug($post);
|
||||||
|
// save old, just in case
|
||||||
|
add_post_meta( $post->ID, '_wp_old_slug', $post->post_name );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this is depricated, but I'll leave it in the code for the future me:
|
||||||
|
* in case you use wp_update_post, it will trigger a post transition, so
|
||||||
|
* that will trigger _everything_ that hooks to that, which is not what we
|
||||||
|
* want. In that case we'll end up with a duplicate event, for both the old
|
||||||
|
* and the new slug and, for example, in a webmention hook's case that is
|
||||||
|
* far from ideal.
|
||||||
|
|
||||||
$_post = array(
|
$_post = array(
|
||||||
'ID' => $post->ID,
|
'ID' => $post->ID,
|
||||||
'post_name' => $url36,
|
'post_name' => $url36,
|
||||||
|
@ -214,6 +255,23 @@ class WP_SHORTSLUG {
|
||||||
$errors = json_encode($post_id->get_error_messages());
|
$errors = json_encode($post_id->get_error_messages());
|
||||||
static::debug( $errors );
|
static::debug( $errors );
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
global $wpdb;
|
||||||
|
$dbname = "{$wpdb->prefix}posts";
|
||||||
|
$req = false;
|
||||||
|
|
||||||
|
static::debug("Updating post slug for #{$post->ID}");
|
||||||
|
|
||||||
|
$q = $wpdb->prepare( "UPDATE `{$dbname}` SET `post_name`='%s' WHERE `ID`='{$post->ID}' LIMIT 1", $url36 );
|
||||||
|
|
||||||
|
try {
|
||||||
|
$req = $wpdb->query( $q );
|
||||||
|
}
|
||||||
|
catch (Exception $e) {
|
||||||
|
static::debug('Something went wrong: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$meta = get_post_meta( $post->ID, '_wp_old_slug', false);
|
$meta = get_post_meta( $post->ID, '_wp_old_slug', false);
|
||||||
if (in_array($url36,$meta)) {
|
if (in_array($url36,$meta)) {
|
||||||
|
@ -299,23 +357,54 @@ class WP_SHORTSLUG {
|
||||||
*
|
*
|
||||||
* @param string $message
|
* @param string $message
|
||||||
* @param int $level
|
* @param int $level
|
||||||
|
*
|
||||||
|
* @output log to syslog | wp_die on high level
|
||||||
|
* @return false on not taking action, true on log sent
|
||||||
*/
|
*/
|
||||||
public static function debug( $message, $level = LOG_NOTICE ) {
|
public static function debug( $message, $level = LOG_NOTICE ) {
|
||||||
|
if ( empty( $message ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
if ( @is_array( $message ) || @is_object ( $message ) )
|
if ( @is_array( $message ) || @is_object ( $message ) )
|
||||||
$message = json_encode($message);
|
$message = json_encode($message);
|
||||||
|
|
||||||
|
$levels = array (
|
||||||
|
LOG_EMERG => 0, // system is unusable
|
||||||
|
LOG_ALERT => 1, // Alert action must be taken immediately
|
||||||
|
LOG_CRIT => 2, // Critical critical conditions
|
||||||
|
LOG_ERR => 3, // Error error conditions
|
||||||
|
LOG_WARNING => 4, // Warning warning conditions
|
||||||
|
LOG_NOTICE => 5, // Notice normal but significant condition
|
||||||
|
LOG_INFO => 6, // Informational informational messages
|
||||||
|
LOG_DEBUG => 7, // Debug debug-level messages
|
||||||
|
);
|
||||||
|
|
||||||
switch ( $level ) {
|
// number for number based comparison
|
||||||
case LOG_ERR :
|
// should work with the defines only, this is just a make-it-sure step
|
||||||
wp_die( '<h1>Error:</h1>' . '<p>' . $message . '</p>' );
|
$level_ = $levels [ $level ];
|
||||||
exit;
|
|
||||||
default:
|
// in case WordPress debug log has a minimum level
|
||||||
if ( !defined( 'WP_DEBUG' ) || WP_DEBUG != true )
|
if ( defined ( 'WP_DEBUG_LEVEL' ) ) {
|
||||||
return;
|
$wp_level = $levels [ WP_DEBUG_LEVEL ];
|
||||||
break;
|
if ( $level_ < $wp_level ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log( __CLASS__ . ": " . $message );
|
// ERR, CRIT, ALERT and EMERG
|
||||||
|
if ( 3 >= $level_ ) {
|
||||||
|
wp_die( '<h1>Error:</h1>' . '<p>' . $message . '</p>' );
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$trace = debug_backtrace();
|
||||||
|
$caller = $trace[1];
|
||||||
|
$parent = $caller['function'];
|
||||||
|
|
||||||
|
if (isset($caller['class']))
|
||||||
|
$parent = $caller['class'] . '::' . $parent;
|
||||||
|
|
||||||
|
return error_log( "{$parent}: {$message}" );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue