coding standard cleanup
jump to
@@ -10,27 +10,27 @@ License: GPLv3
Required minimum PHP version: 5.3 */ -if (!class_exists('WP_WEBMENTION_AGAIN')): +if ( ! class_exists( 'WP_Webmention_Again' ) ): // global send_webmention function -if (!function_exists('send_webmention')) { +if ( ! function_exists( 'send_webmention' ) ) { function send_webmention( $source, $target ) { - return WP_WEBMENTION_AGAIN::send( $source, $target ); + return WP_Webmention_Again::send( $source, $target ); } } // something else might have loaded this already -if ( !class_exists('Mf2\Parser') ) { - require (__DIR__ . '/vendor/autoload.php'); +if ( ! class_exists( 'Mf2\Parser' ) ) { + require ( __DIR__ . '/vendor/autoload.php' ); } // if something has loaded Mf2 already, the autoload won't kick in, // and we need this -if (!class_exists('EmojiRecognizer')) { - require (__DIR__ . '/vendor/dissolve/single-emoji-recognizer/src/emoji.php'); +if ( ! class_exists( 'EmojiRecognizer' ) ) { + require ( __DIR__ . '/vendor/dissolve/single-emoji-recognizer/src/emoji.php' ); } -class WP_WEBMENTION_AGAIN { +class WP_Webmention_Again { // post meta key for queued incoming mentions const meta_received = '_webmention_received';@@ -44,7 +44,19 @@ // WP cache expiration seconds
const expire = 10; /** - * cron interval for processing incoming + * regular cron interval for processing incoming + * + * use 'wp-webmention-again_interval_received' to filter this integer + * + * @return int cron interval in seconds + * + */ + protected static function remote_timeout () { + return apply_filters( 'wp-webmention-again_remote_timeout', 100 ); + } + + /** + * regular cron interval for processing incoming * * use 'wp-webmention-again_interval_received' to filter this integer *@@ -52,11 +64,23 @@ * @return int cron interval in seconds
* */ protected static function interval_received () { - return apply_filters('wp-webmention-again_interval_received', 90); + return apply_filters( 'wp-webmention-again_interval_received', 600 ); } /** - * cron interval for processing outgoing + * minimum cron interval for processing incoming + * + * use 'wp-webmention-again_interval_received' to filter this integer + * + * @return int cron interval in seconds + * + */ + protected static function interval_received_min () { + return apply_filters( 'wp-webmention-again_interval_received_min', 60 ); + } + + /** + * regular cron interval for processing outgoing * * use 'wp-webmention-again_interval_send' to filter this integer *@@ -64,10 +88,21 @@ * @return int cron interval in seconds
* */ protected static function interval_send () { - return apply_filters('wp-webmention-again_interval_send', 90); + return apply_filters( 'wp-webmention-again_interval_send', 600 ); } /** + * minimum cron interval for processing outgoing + * + * use 'wp-webmention-again_interval_send' to filter this integer + * + * @return int cron interval in seconds + * + */ + protected static function interval_send_min () { + return apply_filters( 'wp-webmention-again_interval_send_min', 60 ); + } + /** * max number of retries ( both for outgoing and incoming ) * * use 'wp-webmention-again_retry' to filter this integer@@ -76,7 +111,7 @@ * @return int cron interval in seconds
* */ protected static function retry () { - return apply_filters('wp-webmention-again_retry', 5); + return apply_filters( 'wp-webmention-again_retry', 5 ); } /**@@ -88,7 +123,7 @@ * @return string name of endpoint
* */ protected static function endpoint() { - return apply_filters('wp-webmention-again_endpoint', 'webmention'); + return apply_filters( 'wp-webmention-again_endpoint', 'webmention' ); } /**@@ -100,7 +135,7 @@ * @return int posts per batch
* */ protected static function per_batch () { - return apply_filters('wp-webmention-again_per_batch', 10); + return apply_filters( 'wp-webmention-again_per_batch', 10 ); } /**@@ -129,7 +164,7 @@ // http://indiewebcamp.com/tag
'tag' => 'tag-of', ); - return apply_filters('wp-webmention-again_mftypes', $map ); + return apply_filters( 'wp-webmention-again_mftypes', $map ); } /**@@ -137,7 +172,7 @@ * runs on plugin load
*/ public function __construct() { - add_action( 'init', array( &$this, 'init')); + add_action( 'init', array( &$this, 'init' ) ); add_action( 'parse_query', array( &$this, 'receive' ) );@@ -145,12 +180,13 @@ add_action( 'wp_head', array( &$this, 'html_header' ), 99 );
add_action( 'send_headers', array( &$this, 'http_header' ) ); // this is mostly for debugging reasons - register_activation_hook( __FILE__ , array( &$this, 'plugin_activate' ) ); + register_activation_hook( __FILE__ , array( 'WP_Webmention_Again', 'plugin_activate' ) ); + // clear schedules if there's any on deactivation - register_deactivation_hook( __FILE__ , array( &$this, 'plugin_deactivate' ) ); + register_deactivation_hook( __FILE__ , array( 'WP_Webmention_Again', 'plugin_deactivate' ) ); // extend current cron schedules with our entry - add_filter( 'cron_schedules', array(&$this, 'add_cron_schedule' )); + add_filter( 'cron_schedules', array(&$this, 'add_cron_schedule' ) ); // register the action for processing received add_action( static::cron_received, array( &$this, 'process_received' ) );@@ -159,10 +195,10 @@ // register the action for processing received
add_action( static::cron_send, array( &$this, 'process_send' ) ); // additional comment types - add_action('admin_comment_types_dropdown', array(&$this, 'comment_types_dropdown')); + add_action( 'admin_comment_types_dropdown', array( &$this, 'comment_types_dropdown' ) ); // register new posts - add_action('transition_post_status', array( &$this, 'queue_send') ,12,5); + add_action( 'transition_post_status', array( &$this, 'queue_send' ), 12, 5 ); } /**@@ -175,16 +211,19 @@ // add webmention endpoint to query vars
add_filter( 'query_vars', array( &$this, 'add_query_var' ) ); // because this needs one more filter - add_filter('get_avatar_comment_types', array( &$this, 'add_comment_types')); + add_filter( 'get_avatar_comment_types', array( &$this, 'add_comment_types' ) ); // additional avatar filter - add_filter( 'get_avatar' , array(&$this, 'get_avatar'), 1, 5 ); + add_filter( 'get_avatar' , array( &$this, 'get_avatar' ), 1, 5 ); + + // get_pung is not restrictive enough + add_filter ( 'get_pung', array( &$this, 'get_pung' ) ); - if (!wp_get_schedule( static::cron_received )) { + if ( ! wp_get_schedule( static::cron_received ) ) { wp_schedule_event( time(), static::cron_received, static::cron_received ); } - if (!wp_get_schedule( static::cron_send )) { + if ( ! wp_get_schedule( static::cron_send ) ) { wp_schedule_event( time(), static::cron_send, static::cron_send ); }@@ -196,7 +235,7 @@ *
* dies if PHP version is too low * */ - public function plugin_activate() { + public static function plugin_activate() { if ( version_compare( phpversion(), 5.3, '<' ) ) { die( 'The minimum PHP version required for this plugin is 5.3' ); }@@ -210,7 +249,7 @@ *
* makes sure there are no scheduled cron hooks left * */ - public function plugin_deactivate () { + public static function plugin_deactivate () { wp_unschedule_event( time(), static::cron_received ); wp_clear_scheduled_hook( static::cron_received );@@ -230,12 +269,12 @@ * @return array $schedules - extended schedules list
*/ public function add_cron_schedule ( $schedules ) { - $schedules[ static::cron_received ] = array( + $schedules[ static::cron_received ] = array ( 'interval' => static::interval_received(), 'display' => sprintf(__( 'every %d seconds' ), static::interval_received() ) ); - $schedules[ static::cron_send ] = array( + $schedules[ static::cron_send ] = array ( 'interval' => static::interval_send(), 'display' => sprintf(__( 'every %d seconds' ), static::interval_send() ) );@@ -278,8 +317,8 @@ * @param array $vars current query vars
* * @return array extended vars */ - public function add_query_var($vars) { - array_push($vars, static::endpoint()); + public function add_query_var( $vars ) { + array_push( $vars, static::endpoint() ); return $vars; }@@ -293,14 +332,14 @@ * @return array plugin options
* */ public static function get_options () { - $options = get_option(__CLASS__); + $options = get_option( __CLASS__ ); - if (isset($options['comment_types']) && is_array($options['comment_types'])) + if ( isset( $options['comment_types'] ) && is_array( $options['comment_types'] ) ) $options['comment_types'] = array_merge($options['comment_types'], static::mftypes()); else $options['comment_types'] = static::mftypes(); - $options['comment_types'] = apply_filters('wp-webmention-again_comment_types', $options['comment_types']); + $options['comment_types'] = apply_filters( 'wp-webmention-again_comment_types', $options['comment_types'] ); return $options; }@@ -312,13 +351,14 @@ *
* @param char $reacji single emoticon character to add as comment type * */ - public static function register_reacji ($reacji) { + public static function register_reacji ( $reacji ) { $options = static::get_options(); - if (!in_array($reacji, $options['comment_types'])) { - $options['comment_types'][$reacji] = $reacji; + if ( ! in_array( $reacji, $options['comment_types'] ) ) { + $options['comment_types'][ $reacji ] = $reacji; update_option( __CLASS__ , $options ); } + } /**@@ -329,13 +369,13 @@ * @param array $types the different comment types
* * @return array the filtered comment types */ - public function comment_types_dropdown($types) { + public function comment_types_dropdown( $types ) { $options = static::get_options(); - foreach ($options['comment_types'] as $type => $fancy ) { - if (!isset($types[ $type ])) + foreach ( $options['comment_types'] as $type => $fancy ) + if ( ! isset( $types[ $type ] ) ) $types[ $type ] = ucfirst( $type ); - } + return $types; }@@ -350,10 +390,9 @@ */
public function add_comment_types ( $types ) { $options = static::get_options(); - foreach ($options['comment_types'] as $type => $fancy ) { - if (!in_array( $type, $types )) + foreach ( $options['comment_types'] as $type => $fancy ) + if ( ! in_array( $type, $types ) ) array_push( $types, $type ); - } return $types; }@@ -365,7 +404,7 @@ *
* @param mixed $wp WordPress Query * */ - public function receive( $wp ) { + public function receive ( $wp ) { // check if it is a webmention request or not if ( ! array_key_exists( static::endpoint(), $wp->query_vars ) )@@ -388,23 +427,24 @@ echo '"target" is missing';
exit; } - $target = filter_var($_POST['target'], FILTER_SANITIZE_URL); - $source = filter_var($_POST['source'], FILTER_SANITIZE_URL); + $target = filter_var( $_POST['target'], FILTER_SANITIZE_URL ); + $source = filter_var( $_POST['source'], FILTER_SANITIZE_URL ); - if ( filter_var($target, FILTER_VALIDATE_URL) === false ) { + if ( false === filter_var( $target, FILTER_VALIDATE_URL ) ) { status_header( 400 ); echo '"target" is an invalid URL'; exit; } - if ( filter_var($source, FILTER_VALIDATE_URL) === false ) { + if ( false === filter_var( $source, FILTER_VALIDATE_URL ) ) { status_header( 400 ); echo '"source" is an invalid URL'; exit; } - $post_id = static::validate_local($target); - if (!$post_id || $post_id == 0) { + $post_id = static::validate_local( $target ); + + if (! $post_id || 0 == $post_id ) { status_header( 404 ); echo '"target" not found.'; exit;@@ -418,9 +458,9 @@ exit;
} // queue here, the remote check will be async - $r = static::queue_receive($source, $target, $post_id); + $r = static::queue_receive( $source, $target, $post_id ); - if ($r) { + if ( true == $r ) { status_header( 202 ); echo 'Webmention accepted in the queue.'; }@@ -442,8 +482,8 @@ * @param int $post_id Post ID
* * @return bool|int result of add_post_meta */ - protected static function queue_receive ($source, $target, $post_id) { - if(empty($post_id) || empty($source) || empty($target)) + protected static function queue_receive ( $source, $target, $post_id ) { + if( empty( $post_id ) || empty( $source ) || empty( $target ) ) return false; $val = array (@@ -451,11 +491,18 @@ 'source' => $source,
'target' => $target ); - static::debug ("queueing {static::meta_received} meta for #{$post_id}; source: {$source}, target: {$target}"); - $r = add_post_meta($post_id, static::meta_received, $val, false); + static::debug( "queueing {static::meta_received} meta for #{$post_id}; source: {$source}, target: {$target}" ); - if ($r == false ) - static::debug ("adding {static::meta_received} meta for #{$post_id} failed"); + $r = add_post_meta( $post_id, static::meta_received, $val, false ); + + if ( false == $r ) { + static::debug( "adding {static::meta_received} meta for #{$post_id} failed" ); + } + else { + // fire up a single cron event if the scheduled is too far in the future + if ( wp_next_scheduled( static::cron_received ) > static::interval_received_min() ) + wp_schedule_single_event( time() , static::cron_received ); + } return $r; }@@ -470,34 +517,38 @@ public function process_received () {
$posts = static::get_received(); - if (empty($posts)) + if ( empty( $posts ) ) return true; - foreach ($posts as $post_id ) { - $received_mentions = get_post_meta ($post_id, static::meta_received, false); + foreach ( $posts as $post_id ) { + + $received_mentions = get_post_meta ( $post_id, static::meta_received, false ); - static::debug('todo: ' . json_encode($received_mentions)); - foreach ($received_mentions as $m) { + foreach ( $received_mentions as $m ) { // $m should not be modified as this is how the current entry can be identified! $_m = $m; - static::debug("working on webmention for post #{$post_id}"); + static::debug( "working on webmention for post #{$post_id}" ); // this really should not happen, but if it does, get rid of this entry immediately - if (!isset($_m['target']) || empty($_m['target']) || !isset($_m['source']) || empty($_m['source'])) { - static::debug(" target or souce empty, aborting"); + if (! isset( $_m['target'] ) || + empty( $_m['target'] ) || + ! isset( $_m['source'] ) || + empty( $_m['source'] ) + ) { + static::debug( " target or souce empty, aborting" ); continue; } - static::debug(" target: {$_m['target']}, source: {$_m['source']}"); + static::debug( " target: {$_m['target']}, source: {$_m['source']}" ); // if we'be been here before, we have retried counter already - $retries = isset($_m['retries']) ? intval($_m['retries']) : 0; + $retries = isset( $_m['retries'] ) ? intval( $_m['retries'] ) : 0; // too many retries, drop this mention and walk away - if ($retries >= static::retry() ) { - static::debug(" this mention was tried earlier and failed too many times, drop it"); - delete_post_meta($post_id, static::meta_received, $m); + if ( $retries >= static::retry() ) { + static::debug( " this mention was tried earlier and failed too many times, drop it" ); + delete_post_meta( $post_id, static::meta_received, $m ); continue; }@@ -506,27 +557,27 @@
// validate target $remote = static::try_receive_remote( $post_id, $_m['source'], $_m['target'] ); - if ($remote === false || empty($remote)) { - static::debug(" parsing this mention failed, retrying next time"); - update_post_meta($post_id, static::meta_received, $_m, $m); + if ( false === $remote || empty( $remote ) ) { + static::debug( " parsing this mention failed, retrying next time" ); + update_post_meta( $post_id, static::meta_received, $_m, $m ); continue; } // we have remote data ! - $c = static::try_parse_remote ($post_id, $_m['source'], $_m['target'], $remote); - $ins = static::insert_comment ($post_id, $_m['source'], $_m['target'], $remote, $c ); + $c = static::try_parse_remote ( $post_id, $_m['source'], $_m['target'], $remote ); + $ins = static::insert_comment ( $post_id, $_m['source'], $_m['target'], $remote, $c ); - if ($ins === true) { - static::debug(" duplicate (or something similar): this queue element has to be ignored; deleting queue entry"); - delete_post_meta($post_id, static::meta_received, $m); + if ( true === $ins ) { + static::debug( " duplicate (or something similar): this queue element has to be ignored; deleting queue entry" ); + delete_post_meta( $post_id, static::meta_received, $m ); } - elseif (is_numeric($ins)) { - static::debug(" all went well, we have a comment id: {$ins}, deleting queue entry"); - delete_post_meta($post_id, static::meta_received, $m); + elseif ( is_numeric( $ins ) ) { + static::debug( " all went well, we have a comment id: {$ins}, deleting queue entry" ); + delete_post_meta( $post_id, static::meta_received, $m ); } else { - static::debug("This is unexpected. Try again."); - update_post_meta($post_id, static::meta_received, $_m, $m); + static::debug( "This is unexpected. Try again." ); + update_post_meta( $post_id, static::meta_received, $_m, $m ); continue; } }@@ -549,31 +600,19 @@ $limit = static::per_batch();
$db_command = "SELECT DISTINCT `post_id` FROM `{$dbname}` WHERE `meta_key` = '{$key}' LIMIT {$limit}"; try { - $q = $wpdb->get_results($db_command); + $q = $wpdb->get_results( $db_command ); } - catch (Exception $e) { - static::debug('Something went wrong: ' . $e->getMessage()); + catch ( Exception $e ) { + static::debug( "Something went wrong: " . $e->getMessage() ); } - if (!empty($q) && is_array($q)) { - foreach ($q as $post) { - $r[] = $post->post_id; + if ( ! empty( $q ) && is_array( $q ) ) { + foreach ( $q as $post ) { + array_push( $r, $post->post_id ); } } return $r; - - /* - * this does not work reliably - $args = array( - 'posts_per_page' => static::per_batch(), - 'meta_key' => static::meta_received, - //'meta_value' => '*', - 'post_type' => 'any', - 'post_status' => 'publish', - ); - return get_posts( $args ); - */ }@@ -584,29 +623,29 @@ * @param string $source URL to pull
* * @return array wp_remote_get array */ - protected static function _wp_remote_get (&$source) { + protected static function _wp_remote_get ( &$source ) { $content = false; - static::debug(" fetching {$source}"); - $url = htmlspecialchars_decode($source); - $q = wp_remote_get($source); + static::debug( " fetching {$source}" ); + $url = htmlspecialchars_decode( $source ); + $q = wp_remote_get( $source ); - if (is_wp_error($q)) { - static::debug(' something went wrong: ' . $q->get_error_message()); + if ( is_wp_error( $q ) ) { + static::debug( " something went wrong: " . $q->get_error_message() ); return false; } - if (!is_array($q)) { - static::debug(' $q is not an array. It should be one.'); + if ( !is_array( $q ) ) { + static::debug( " $q is not an array. It should be one." ); return false; } - if (!isset($q['headers']) || !is_array($q['headers'])) { - static::debug(' missing response headers.'); + if ( ! isset( $q['headers'] ) || ! is_array( $q['headers'] ) ) { + static::debug( " missing response headers." ); return false; } - if (!isset($q['body']) || empty($q['body'])) { - static::debug(' missing body'); + if ( ! isset( $q['body'] ) || empty( $q['body'] ) ) { + static::debug( " missing body" ); return false; }@@ -626,44 +665,44 @@ */
protected static function try_receive_remote ( &$post_id, &$source, &$target ) { $content = false; - $q = static::_wp_remote_get($source); + $q = static::_wp_remote_get( $source ); - if ($q === false) + if ( false === $q ) return false; $t = $target; - $t = preg_replace('/https?:\/\/(?:www.)?/', '', $t); - $t = preg_replace('/#.*/', '', $t); - $t = untrailingslashit($t); + $t = preg_replace( '/https?:\/\/(?:www.)?/', '', $t ); + $t = preg_replace( '/#.*/', '', $t ); + $t = untrailingslashit( $t ); // check if source really links to target // this could be a temporary error, so we'll retry later this one as well - if (!stristr($q['body'],$t)) { - static::debug(" missing link to {$t} in remote body"); + if ( ! stristr( $q['body'], $t ) ) { + static::debug( " missing link to {$t} in remote body" ); return false; } - $ctype = isset($q['headers']['content-type']) ? $q['headers']['content-type'] : 'text/html'; + $ctype = isset( $q['headers']['content-type'] ) ? $q['headers']['content-type'] : 'text/html'; - if ($ctype == "text/plain") { - static::debug(" interesting, plain text webmention. I'm not prepared for this yet"); + if ( "text/plain" == $ctype ) { + static::debug( " interesting, plain text webmention. I'm not prepared for this yet" ); return false; } - elseif ($ctype == "application/json") { - static::debug(" content is JSON"); - $content = json_decode($q['body'], true); + elseif ( $ctype == "application/json" ) { + static::debug( " content is JSON" ); + $content = json_decode( $q['body'], true ); } else { - static::debug(" content is (probably) html, trying to parse it with MF2"); + static::debug( " content is (probably) html, trying to parse it with MF2" ); try { - $content = Mf2\parse($q['body'], $source); + $content = Mf2\parse( $q['body'], $source ); } - catch (Exception $e) { - static::debug(' parsing MF2 failed:' . $e->getMessage()); + catch ( Exception $e ) { + static::debug( " parsing MF2 failed: " . $e->getMessage() ); return false; } - $content = static::flatten_mf2_array($content); + $content = static::flatten_mf2_array( $content ); } return $content;@@ -684,21 +723,21 @@
$item = false; $p_authors = array(); - if (isset($content['items']['properties']) && isset($content['items']['type'])) { + if ( isset( $content['items']['properties'] ) && isset( $content['items']['type'] ) ) { $item = $content['items']; } - elseif (is_array($content['items']) && !empty($content['items']['type'])) { - foreach ($content['items'] as $i) { - if ($i['type'] == 'h-entry') { + elseif ( is_array($content['items'] ) && ! empty( $content['items']['type'] ) ) { + foreach ( $content['items'] as $i ) { + if ( 'h-entry' == $i['type'] ) { $item = $i; } - elseif ($i['type'] == 'h-card') { + elseif ( 'h-card' == $i['type'] ) { $p_authors[] = $i; } } } - if (!$item || empty($item)) { + if (! $item || empty( $item )) { static::debug(' no parseable h-entry found, saving as standard mention comment'); $c = array ( 'comment_author' => $source,@@ -710,7 +749,7 @@ 'comment_date' => date("Y-m-d H:i:s"),
'comment_date_gmt' => date("Y-m-d H:i:s"), 'comment_agent' => __CLASS__, 'comment_approved' => 0, - 'comment_content' => sprintf(__('This entry was webmentioned on <a href="%s">%s</a>.'), $source, $source), + 'comment_content' => sprintf( __( 'This entry was webmentioned on <a href="%s">%s</a>.' ), $source, $source ), ); return $c; }@@ -718,25 +757,25 @@
// process author $author_name = $author_url = $avatar = $a = false; - if (isset($item['properties']['author'])) { + if ( isset( $item['properties']['author'] ) ) { $a = $item['properties']['author']; } - elseif (!empty($p_authors)) { - $a = array_pop($p_authors); + elseif ( ! empty( $p_authors ) ) { + $a = array_pop( $p_authors ); } - if ($a && isset($a['properties'])) { + if ( $a && isset( $a['properties'] ) ) { $a = $a['properties']; - if (isset($a['name']) && !empty($a['name'])) + if ( isset($a['name']) && ! empty( $a['name'] ) ) $author_name = $a['name']; $try_photos = array ('photo', 'avatar'); $p = false; - foreach ($try_photos as $photo) { - if (isset($a[$photo]) && !empty($a[$photo])) { - $p = $a[$photo]; - if (!empty($p)) { + foreach ( $try_photos as $photo ) { + if (isset( $a[ $photo ]) && ! empty( $a[ $photo ] ) ) { + $p = $a[ $photo ]; + if ( !empty( $p ) ) { $avatar = $p; break; }@@ -747,36 +786,36 @@
// process type $type = 'webmention'; - foreach ( static::mftypes() as $k => $mapped) { - if (is_array($item['properties']) && isset($item['properties'][$mapped])) + foreach ( static::mftypes() as $k => $mapped ) { + if ( is_array( $item['properties'] ) && isset( $item['properties'][ $mapped ]) ) $type = $k; } //process content $c = ''; - if (isset($item['properties']['content']) && isset($item['properties']['content']['html'])) + if ( isset( $item['properties']['content'] ) && isset( $item['properties']['content']['html'] ) ) $c = $item['properties']['content']['html']; - if (isset($item['properties']['content']) && isset($item['properties']['content']['value'])) - $c = wp_filter_kses($item['properties']['content']['value']); + if ( isset( $item['properties']['content'] ) && isset( $item['properties']['content']['value'] ) ) + $c = wp_filter_kses( $item['properties']['content']['value'] ); // REACJI - $emoji = EmojiRecognizer::isSingleEmoji($c); + $emoji = EmojiRecognizer::isSingleEmoji( $c ); - if ($emoji) { - static::debug('wheeeee, reacji!'); - $type = trim($c); + if ( $emoji ) { + static::debug( "wheeeee, reacji!" ); + $type = trim( $c ); static::register_reacji( $type ); } // process date - if (isset($item['properties']['modified'])) - $date = strtotime($item['properties']['modified']); - elseif (isset($item['properties']['published'])) - $date = strtotime($item['properties']['published']); + if ( isset( $item['properties']['modified'] ) ) + $date = strtotime( $item['properties']['modified'] ); + elseif ( isset( $item['properties']['published'] ) ) + $date = strtotime( $item['properties']['published'] ); else $date = time(); - $name = empty($author_name) ? $source : $author_name; + $name = empty( $author_name ) ? $source : $author_name; $c = array ( 'comment_author' => $name,@@ -784,8 +823,8 @@ 'comment_author_url' => $source,
'comment_author_email' => '', 'comment_post_ID' => $post_id, 'comment_type' => $type, - 'comment_date' => date("Y-m-d H:i:s", $date ), - 'comment_date_gmt' => date("Y-m-d H:i:s", $date ), + 'comment_date' => date( "Y-m-d H:i:s", $date ), + 'comment_date_gmt' => date( "Y-m-d H:i:s", $date ), 'comment_agent' => __CLASS__, 'comment_approved' => 0, 'comment_content' => $c,@@ -810,9 +849,9 @@
$comment_id = false; $avatar = false; - if( isset( $comment['comment_avatar'])) { + if( isset( $comment['comment_avatar'] ) ) { $avatar = $comment['comment_avatar']; - unset($comment['comment_avatar']); + unset( $comment['comment_avatar'] ); } // safety first@@ -828,20 +867,20 @@ );
// so if the type is comment and you add type = 'comment', WP will not return the comments // such logical! - if ( $comment['comment_type'] != 'comment') + if ( 'comment' != $comment['comment_type'] ) $testargs['type'] = $comment['comment_type']; // in case it's a fav or a like, the date field is not always present // but there should be only one of those, so the lack of a date field indicates // that we should not look for a date when checking the existence of the // comment - if ( isset( $comment['comment_date']) && !empty($comment['comment_date']) ) { + if ( isset( $comment['comment_date'] ) && ! empty( $comment['comment_date'] ) ) { // in case you're aware of a nicer way of doing this, please tell me // or commit a change... $tmp = explode ( " ", $comment['comment_date'] ); - $d = explode( "-", $tmp[0]); - $t = explode (':',$tmp[1]); + $d = explode( "-", $tmp[0] ); + $t = explode ( ':', $tmp[1] ); $testargs['date_query'] = array( 'year' => $d[0],@@ -852,37 +891,34 @@ 'minute' => $t[1],
'second' => $t[2], ); - //$testargs['date_query'] = $comment['comment_date']; - //test if we already have this imported - static::debug("checking comment existence (with date) for post #{$post_id}"); + static::debug( "checking comment existence (with date) for post #{$post_id}" ); } else { // we do need a date - $comment['comment_date'] = date("Y-m-d H:i:s"); - $comment['comment_date_gmt'] = date("Y-m-d H:i:s"); + $comment['comment_date'] = date( "Y-m-d H:i:s" ); + $comment['comment_date_gmt'] = date( "Y-m-d H:i:s" ); - static::debug("checking comment existence (no date) for post #{$post_id}"); + static::debug( "checking comment existence (no date) for post #{$post_id}" ); } - $existing = get_comments($testargs); + $existing = get_comments( $testargs ); // no matching comment yet, insert it - if (!empty($existing)) { - static::debug ('comment already exists'); + if ( ! empty( $existing ) ) { + static::debug ( "comment already exists" ); return true; } // disable flood control, just in case - remove_filter('check_comment_flood', 'check_comment_flood_db', 10, 3); + remove_filter( 'check_comment_flood', 'check_comment_flood_db', 10, 3 ); $comment = apply_filters( 'preprocess_comment', $comment ); - if ( $comment_id = wp_new_comment($comment) ) { + if ( $comment_id = wp_new_comment( $comment ) ) { // add avatar for later use if present - if (!empty($avatar)) { + if ( ! empty( $avatar ) ) update_comment_meta( $comment_id, 'avatar', $avatar ); - } // full raw response for the vote, just in case update_comment_meta( $comment_id, 'webmention_source_mf2', $raw );@@ -901,14 +937,12 @@ $r = "something went wrong when trying to insert comment for post #{$post_id}";
} // re-add flood control - add_filter('check_comment_flood', 'check_comment_flood_db', 10, 3); + add_filter( 'check_comment_flood', 'check_comment_flood_db', 10, 3 ); - static::debug($r); + static::debug( $r ); + return $comment_id; } - - - /**@@ -920,20 +954,27 @@ * @param string $new_status New post status
* @param string $old_status Previous post status * @param object $post WP Post object */ - public function queue_send($new_status, $old_status, $post) { - if (!static::is_post($post)) { - static::debug("Woops, this is not a post."); + public function queue_send( $new_status, $old_status, $post ) { + if ( ! static::is_post( $post ) ) { + static::debug( "Whoops, this is not a post." ); return false; } - if ($new_status != 'publish') { - static::debug("Not adding {$post->ID} to mention queue yet; not published"); + if ( 'publish' != $new_status ) { + static::debug( "Not adding {$post->ID} to mention queue yet; not published" ); return false; } + $r = add_post_meta( $post->ID, static::meta_send, 1, true ); - if (! $r = add_post_meta($post->ID, static::meta_send, 1, true) ) - static::debug("Tried adding post #{$post->ID} to mention queue, but it didn't go well"); + if ( ! $r ) { + static::debug( "Tried adding post #{$post->ID} to mention queue, but it didn't go well" ); + } + else { + // fire up a single cron event if the scheduled is too far in the future + if ( wp_next_scheduled( static::cron_send ) > static::interval_send_min() ) + wp_schedule_single_event( time() , static::cron_send ); + } return $r; }@@ -946,14 +987,14 @@ */
public function process_send () { $posts = static::get_send(); - if (empty($posts)) + if ( empty( $posts ) ) return false; - foreach ($posts as $post_id) { - $post = get_post($post_id); + foreach ( $posts as $post_id ) { + $post = get_post( $post_id ); - if (!static::is_post($post)) { - delete_post_meta($post_id, static::meta_send); + if ( ! static::is_post( $post ) ) { + delete_post_meta( $post_id, static::meta_send ); continue; }@@ -963,62 +1004,64 @@ // try to avoid redirects, so no shortlink is sent for now
$source = get_permalink( $post->ID ); // process the content as if it was the_content() - $content = static::get_the_content($post); + $content = static::get_the_content( $post ); + // get all urls in content - $urls = static::extract_urls($content); + $urls = static::extract_urls( $content ); + // for special ocasions when someone wants to add to this list $urls = apply_filters( 'webmention_links', $urls, $post->ID ); - $urls = array_unique( $urls ); $todo = $urls; $failed = array(); - $pung = static::get_pung( $post->ID ); + $pung = get_pung( $post->ID ); foreach ( $urls as $target ) { - $target = strtolower($target); + $target = strtolower( $target ); static::debug(' url to ping: ' . $target ); // already pinged, skip - if (in_array( $target, $pung )) { - static::debug(' already pinged!' ); - $todo = array_diff($todo, array($target)); + if ( in_array( $target, $pung ) ) { + static::debug( " already pinged!" ); + $todo = array_diff( $todo, array( $target ) ); continue; } // tried too many times $try_key = static::meta_send . '_' . $target; - $tries = intval(get_post_meta( $post->ID, $try_key, true )); - if ($tries && $tries >= static::retry() ) { - static::debug(" failed too many times; skipping"); - $todo = array_diff($todo, array($target)); - array_push($failed, $try_key); + $tries = intval( get_post_meta( $post->ID, $try_key, true ) ); + + if ( false != $tries && $tries >= static::retry() ) { + static::debug( " failed too many times; skipping" ); + $todo = array_diff( $todo, array( $target ) ); + array_push( $failed, $try_key ); continue; } // try sending - $s = static::send($source, $target, $post->ID ); + $s = static::send( $source, $target, $post->ID ); - if (!$s) { + if ( !$s ) { $tries = $tries + 1; - static::debug(" sending failed; retrying later ({$tries} time)"); - update_post_meta($post->ID, $try_key, $tries ); + static::debug( " sending failed; retrying later ({$tries} time)" ); + update_post_meta( $post->ID, $try_key, $tries ); continue; } else { - static::debug(' sending succeeded!'); + static::debug( " sending succeeded!" ); add_ping( $post->ID, $target ); - $todo = array_diff($todo, array($target)); + $todo = array_diff( $todo, array( $target ) ); } } - if (empty($todo)) { - static::debug(' no more urls to ping or no more tries left, cleaning up'); + if ( empty( $todo ) ) { + static::debug( " no more urls to ping or no more tries left, cleaning up" ); - foreach ($failed as $try_key) - delete_post_meta($post->ID, $try_key); + foreach ( $failed as $try_key ) + delete_post_meta( $post->ID, $try_key ); - delete_post_meta($post->ID, static::meta_send); + delete_post_meta( $post->ID, static::meta_send ); }@@ -1026,14 +1069,20 @@ }
} /** + * make pung stricter + * + * @param array $pung array of pinged urls + * + * @return array a better array of pinged urls * */ - protected static function get_pung ($post_id) { - $pung = get_pung( $post_id ); - foreach ($pung as $k => $e ) { - $pung[$k] = strtolower($e); - } + public function get_pung ( $pung ) { + + foreach ($pung as $k => $e ) + $pung[ $k ] = strtolower( $e ); + $pung = array_unique($pung); + return $pung; }@@ -1044,6 +1093,7 @@ * @return array of WP Post objects
*/ protected static function get_send () { global $wpdb; + $r = array(); $dbname = "{$wpdb->prefix}postmeta";@@ -1052,35 +1102,19 @@ $limit = static::per_batch();
$db_command = "SELECT DISTINCT `post_id` FROM `{$dbname}` WHERE `meta_key` = '{$key}' LIMIT {$limit}"; try { - $q = $wpdb->get_results($db_command); + $q = $wpdb->get_results( $db_command ); } - catch (Exception $e) { - static::debug('Something went wrong: ' . $e->getMessage()); + catch ( Exception $e ) { + static::debug( "Something went wrong: " . $e->getMessage() ); } - if (!empty($q) && is_array($q)) { - foreach ($q as $post) { - $r[] = $post->post_id; + if ( ! empty( $q ) && is_array( $q ) ) { + foreach ( $q as $post ) { + array_push( $r, $post->post_id ); } } return $r; - - /* - * this is not reliable - $args = array( - //'posts_per_page' => static::per_batch(), - 'posts_per_page' => -1, - 'meta_key' => static::meta_send, - 'meta_value' => 1, - 'post_type' => 'any', - 'post_status' => 'publish', - ); - - - return get_posts( $args ); - */ - } /**@@ -1092,14 +1126,14 @@ public static function send ( $source, $target, $post_id = false ) {
$options = static::get_options(); // stop selfpings on the same URL - if ( isset($options['disable_selfpings_same_url']) && + if ( isset( $options['disable_selfpings_same_url'] ) && $options['disable_selfpings_same_url'] == '1' && $source === $target ) return false; // stop selfpings on the same domain - if ( isset($options['disable_selfpings_same_domain']) && + if ( isset( $options['disable_selfpings_same_domain'] ) && $options['disable_selfpings_same_domain'] == '1' && parse_url( $source, PHP_URL_HOST ) == parse_url( $target, PHP_URL_HOST ) )@@ -1114,10 +1148,10 @@
if ( $webmention_server_url ) { $args = array( 'body' => 'source=' . urlencode( $source ) . '&target=' . urlencode( $target ), - 'timeout' => 100, + 'timeout' => static::remote_timeout(), ); - static::debug('Sending webmention to: ' .$webmention_server_url . ' as: ' . $args['body']); + static::debug( "Sending webmention to: " .$webmention_server_url . " as: " . $args['body'] ); $response = wp_remote_post( $webmention_server_url, $args ); // use the response to do something usefull@@ -1143,22 +1177,20 @@ *
* @return bool|string False on failure, string containing URI on success */ protected static function discover_endpoint( $url ) { - /** @todo Should use Filter Extension or custom preg_match instead. */ - $parsed_url = parse_url( $url ); - if ( ! isset( $parsed_url['host'] ) ) { // Not an URL. This should never happen. + // Not an URL. This should never happen. + if ( false === filter_var( $url, FILTER_VALIDATE_URL ) ) return false; - } // do not search for a WebMention server on our own uploads $uploads_dir = wp_upload_dir(); - if ( 0 === strpos( $url, $uploads_dir['baseurl'] ) ) { + if ( 0 === strpos( $url, $uploads_dir['baseurl'] ) ) return false; - } - $response = wp_remote_head( $url, array( 'timeout' => 100, 'httpversion' => '1.0' ) ); + $response = wp_remote_head( $url, array( 'timeout' => static::remote_timeout(), 'httpversion' => '1.0' ) ); if ( is_wp_error( $response ) ) { + static::debug( "Something went wrong: " . $response->get_error_message() ); return false; }@@ -1183,7 +1215,7 @@ return false;
} // now do a GET since we're going to look in the html headers (and we're sure its not a binary file) - $response = wp_remote_get( $url, array( 'timeout' => 100, 'httpversion' => '1.0' ) ); + $response = wp_remote_get( $url, array( 'timeout' => static::remote_timeout(), 'httpversion' => '1.0' ) ); if ( is_wp_error( $response ) ) { return false;@@ -1269,6 +1301,9 @@ $matches = array();
preg_match_all("/\b(?:http|https)\:\/\/?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.[a-zA-Z0-9\.\/\?\:@\-_=#]*/i", $text, $matches); $matches = $matches[0]; + + $matches = array_unique($matches); + return $matches; }@@ -1347,23 +1382,22 @@ * @param string $size size for the image to display
* @param string $default optional fallback * @param string $alt alt text for the avatar image */ - public function get_avatar($avatar, $id_or_email, $size, $default = '', $alt = '') { - if (!is_object($id_or_email) || !isset($id_or_email->comment_type)) + public function get_avatar( $avatar, $id_or_email, $size, $default = '', $alt = '' ) { + if ( ! is_object( $id_or_email ) || ! isset( $id_or_email->comment_type ) ) return $avatar; // check if comment has an avatar - $c_avatar = get_comment_meta($id_or_email->comment_ID, 'avatar', true); + $c_avatar = get_comment_meta( $id_or_email->comment_ID, 'avatar', true ); - if (!$c_avatar) + if ( ! $c_avatar ) return $avatar; - if (false === $alt) + if ( false === $alt ) $safe_alt = ''; else - $safe_alt = esc_attr($alt); - + $safe_alt = esc_attr( $alt ); - return sprintf( '<img alt="%s" src="%s" class="avatar photo u-photo" style="width: %spx; height: %spx;" />', $safe_alt, $c_avatar, $size, $size ); + return sprintf( '<img alt="%s" src="%s" class="avatar photo u-photo" style="width: %dpx; height: %dpx;" />', $safe_alt, $c_avatar, $size, $size ); } /**@@ -1375,13 +1409,13 @@ * @return string the_content
*/ protected static function get_the_content( &$post ){ - if (!static::is_post($post)) + if ( ! static::is_post( $post ) ) return false; if ( $cached = wp_cache_get ( $post->ID, __CLASS__ . __FUNCTION__ ) ) return $cached; - $r = apply_filters('the_content', $post->post_content); + $r = apply_filters( 'the_content', $post->post_content ); wp_cache_set ( $post->ID, $r, __CLASS__ . __FUNCTION__, static::expire );@@ -1397,7 +1431,7 @@ * @param int $level
*/ protected static function debug( $message, $level = LOG_NOTICE ) { if ( @is_array( $message ) || @is_object ( $message ) ) - $message = json_encode($message); + $message = json_encode( $message ); switch ( $level ) {@@ -1405,7 +1439,7 @@ case LOG_ERR :
wp_die( '<h1>Error:</h1>' . '<p>' . $message . '</p>' ); exit; default: - if ( !defined( 'WP_DEBUG' ) || WP_DEBUG != true ) + if ( ! defined( 'WP_DEBUG' ) || true != WP_DEBUG ) return; break; }@@ -1414,6 +1448,6 @@ error_log( __CLASS__ . ": " . $message );
} } -$WP_WEBMENTION_AGAIN = new WP_WEBMENTION_AGAIN(); +$WP_Webmention_Again = new WP_Webmention_Again(); endif;