From 16f0c6877e1679b446ea3fb10ac2491e0ed3eadb Mon Sep 17 00:00:00 2001 From: Gary Pendergast Date: Fri, 21 Oct 2016 06:00:31 +0000 Subject: [PATCH] Pings: Allow ping functions to accept `WP_Post` objects as well as post IDs. This removes the use of several `global $wpdb` instances, as well as bringing the ping functions into line with other post-related functions, which will accept a post ID or `WP_Post` object. Props dshanke. Fixes #38202. Built from https://develop.svn.wordpress.org/trunk@38852 git-svn-id: http://core.svn.wordpress.org/trunk@38795 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/comment.php | 49 +++++++++++++++++++++------------ wp-includes/post.php | 61 +++++++++++++++++++++++++++-------------- wp-includes/version.php | 2 +- 3 files changed, 73 insertions(+), 39 deletions(-) diff --git a/wp-includes/comment.php b/wp-includes/comment.php index 36a277aeea..49ddda8b6d 100644 --- a/wp-includes/comment.php +++ b/wp-includes/comment.php @@ -2405,19 +2405,23 @@ function do_all_pings() { * Perform trackbacks. * * @since 1.5.0 + * @since 4.7.0 $post_id can be a WP_Post object. * * @global wpdb $wpdb WordPress database abstraction object. * - * @param int $post_id Post ID to do trackbacks on. + * @param int|WP_Post $post_id Post object or ID to do trackbacks on. */ -function do_trackbacks($post_id) { +function do_trackbacks( $post_id ) { global $wpdb; - $post = get_post( $post_id ); - $to_ping = get_to_ping($post_id); - $pinged = get_pung($post_id); - if ( empty($to_ping) ) { - $wpdb->update($wpdb->posts, array('to_ping' => ''), array('ID' => $post_id) ); + if ( ! $post ) { + return false; + } + + $to_ping = get_to_ping( $post ); + $pinged = get_pung( $post ); + if ( empty( $to_ping ) ) { + $wpdb->update($wpdb->posts, array( 'to_ping' => '' ), array( 'ID' => $post->ID ) ); return; } @@ -2440,10 +2444,11 @@ function do_trackbacks($post_id) { foreach ( (array) $to_ping as $tb_ping ) { $tb_ping = trim($tb_ping); if ( !in_array($tb_ping, $pinged) ) { - trackback($tb_ping, $post_title, $excerpt, $post_id); + trackback( $tb_ping, $post_title, $excerpt, $post->ID ); $pinged[] = $tb_ping; } else { - $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d", $tb_ping, $post_id) ); + $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, + '')) WHERE ID = %d", $tb_ping, $post->ID ) ); } } } @@ -2474,18 +2479,28 @@ function generic_ping( $post_id = 0 ) { * Pings back the links found in a post. * * @since 0.71 + * @since 4.7.0 $post_id can be a WP_Post object. * - * @param string $content Post content to check for links. - * @param int $post_ID Post ID. + * @param string $content Post content to check for links. If empty will retrieve from post. + * @param int|WP_Post $post_id Post Object or ID. */ -function pingback($content, $post_ID) { +function pingback( $content, $post_id ) { include_once( ABSPATH . WPINC . '/class-IXR.php' ); include_once( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' ); // original code by Mort (http://mort.mine.nu:8080) $post_links = array(); - $pung = get_pung($post_ID); + $post = get_post( $post_id ); + if ( ! $post ) { + return; + } + + $pung = get_pung( $post ); + + if ( empty( $content ) ) { + $content = $post->post_content; + } // Step 1 // Parsing the post, external links (if any) are stored in the $post_links array @@ -2501,7 +2516,7 @@ function pingback($content, $post_ID) { // We don't wanna ping first and second types, even if they have a valid foreach ( (array) $post_links_temp as $link_test ) : - if ( !in_array($link_test, $pung) && (url_to_postid($link_test) != $post_ID) // If we haven't pung it already and it isn't a link to itself + if ( ! in_array( $link_test, $pung ) && ( url_to_postid( $link_test ) != $post->ID ) // If we haven't pung it already and it isn't a link to itself && !is_local_attachment($link_test) ) : // Also, let's never ping local attachments. if ( $test = @parse_url($link_test) ) { if ( isset($test['query']) ) @@ -2522,7 +2537,7 @@ function pingback($content, $post_ID) { * @param array &$pung Whether a link has already been pinged, passed by reference. * @param int $post_ID The post ID. */ - do_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post_ID ) ); + do_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post->ID ) ); foreach ( (array) $post_links as $pagelinkedto ) { $pingback_server_url = discover_pingback_server_uri( $pagelinkedto ); @@ -2530,7 +2545,7 @@ function pingback($content, $post_ID) { if ( $pingback_server_url ) { @ set_time_limit( 60 ); // Now, the RPC call - $pagelinkedfrom = get_permalink($post_ID); + $pagelinkedfrom = get_permalink( $post ); // using a timeout of 3 seconds should be enough to cover slow servers $client = new WP_HTTP_IXR_Client($pingback_server_url); @@ -2552,7 +2567,7 @@ function pingback($content, $post_ID) { $client->debug = false; if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto) || ( isset($client->error->code) && 48 == $client->error->code ) ) // Already registered - add_ping( $post_ID, $pagelinkedto ); + add_ping( $post, $pagelinkedto ); } } } diff --git a/wp-includes/post.php b/wp-includes/post.php index 6376e90bfd..cd6233fee8 100644 --- a/wp-includes/post.php +++ b/wp-includes/post.php @@ -3991,19 +3991,32 @@ function wp_transition_post_status( $new_status, $old_status, $post ) { * Add a URL to those already pinged. * * @since 1.5.0 + * @since 4.7.0 $post_id can be a WP_Post object. + * @since 4.7.0 $uri can be an array of URIs. * * @global wpdb $wpdb WordPress database abstraction object. * - * @param int $post_id Post ID. - * @param string $uri Ping URI. + * @param int|WP_Post $post_id Post object or ID. + * @param string|array $uri Ping URI or array of URIs. * @return int|false How many rows were updated. */ function add_ping( $post_id, $uri ) { global $wpdb; - $pung = $wpdb->get_var( $wpdb->prepare( "SELECT pinged FROM $wpdb->posts WHERE ID = %d", $post_id )); - $pung = trim($pung); - $pung = preg_split('/\s/', $pung); - $pung[] = $uri; + + $post = get_post( $post_id ); + if ( ! $post ) { + return false; + } + + $pung = trim( $post->pinged ); + $pung = preg_split( '/\s/', $pung ); + + if ( is_array( $uri ) ) { + $pung = array_merge( $pung, $uri ); + } + else { + $pung[] = $uri; + } $new = implode("\n", $pung); /** @@ -4015,9 +4028,9 @@ function add_ping( $post_id, $uri ) { */ $new = apply_filters( 'add_ping', $new ); - // expected_slashed ($new). - $new = wp_unslash($new); - return $wpdb->update( $wpdb->posts, array( 'pinged' => $new ), array( 'ID' => $post_id ) ); + $return = $wpdb->update( $wpdb->posts, array( 'pinged' => $new ), array( 'ID' => $post->ID ) ); + clean_post_cache( $post->ID ); + return $return; } /** @@ -4059,16 +4072,19 @@ function get_enclosed( $post_id ) { * * @since 1.5.0 * - * @global wpdb $wpdb WordPress database abstraction object. + * @since 4.7.0 $post_id can be a WP_Post object. * - * @param int $post_id Post ID. + * @param int|WP_Post $post_id Post ID or object. * @return array */ function get_pung( $post_id ) { - global $wpdb; - $pung = $wpdb->get_var( $wpdb->prepare( "SELECT pinged FROM $wpdb->posts WHERE ID = %d", $post_id )); - $pung = trim($pung); - $pung = preg_split('/\s/', $pung); + $post = get_post( $post_id ); + if ( ! $post ) { + return false; + } + + $pung = trim( $post->pinged ); + $pung = preg_split( '/\s/', $pung ); /** * Filters the list of already-pinged URLs for the given post. @@ -4084,16 +4100,19 @@ function get_pung( $post_id ) { * Retrieve URLs that need to be pinged. * * @since 1.5.0 + * @since 4.7.0 $post_id can be a WP_Post object. * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $post_id Post ID + * @param int|WP_Post $post_id Post Object or ID * @return array */ function get_to_ping( $post_id ) { - global $wpdb; - $to_ping = $wpdb->get_var( $wpdb->prepare( "SELECT to_ping FROM $wpdb->posts WHERE ID = %d", $post_id )); - $to_ping = sanitize_trackback_urls( $to_ping ); + $post = get_post( $post_id ); + + if ( ! $post ) { + return false; + } + + $to_ping = sanitize_trackback_urls( $post->to_ping ); $to_ping = preg_split('/\s/', $to_ping, -1, PREG_SPLIT_NO_EMPTY); /** diff --git a/wp-includes/version.php b/wp-includes/version.php index 1088c2769d..23c6a160e3 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -4,7 +4,7 @@ * * @global string $wp_version */ -$wp_version = '4.7-alpha-38851'; +$wp_version = '4.7-alpha-38852'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.