Advertisements

discover_pingback_server_uri

Definition:
function discover_pingback_server_uri( $url, $deprecated = '' ) {}

Finds a pingback server URI based on the given URL.
Checks the HTML for the rel="pingback" link and x-pingback headers. It does a check for the x-pingback headers first and returns that, if available. The check for the rel="pingback" has more overhead than just the header.

Parameters

  • string $url: URL to ping.
  • int $deprecated: Not Used.

Return values

returns:False on failure, string containing URI on success.

Source code

function discover_pingback_server_uri( $url, $deprecated = '' ) {

	if ( !empty( $deprecated ) )

		_deprecated_argument( __FUNCTION__, '2.7' );



	$pingback_str_dquote = 'rel="pingback"';

	$pingback_str_squote = 'rel=\'pingback\'';



	/** @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.

		return false;



	//Do not search for a pingback server on our own uploads

	$uploads_dir = wp_upload_dir();

	if ( 0 === strpos($url, $uploads_dir['baseurl']) )

		return false;



	$response = wp_remote_head( $url, array( 'timeout' => 2, 'httpversion' => '1.0' ) );



	if ( is_wp_error( $response ) )

		return false;



	if ( wp_remote_retrieve_header( $response, 'x-pingback' ) )

		return wp_remote_retrieve_header( $response, 'x-pingback' );



	// Not an (x)html, sgml, or xml page, no use going further.

	if ( preg_match('#(image|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'content-type' )) )

		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' => 2, 'httpversion' => '1.0' ) );



	if ( is_wp_error( $response ) )

		return false;



	$contents = wp_remote_retrieve_body( $response );



	$pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);

	$pingback_link_offset_squote = strpos($contents, $pingback_str_squote);

	if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {

		$quote = ($pingback_link_offset_dquote) ? '"' : '\'';

		$pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;

		$pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);

		$pingback_href_start = $pingback_href_pos+6;

		$pingback_href_end = @strpos($contents, $quote, $pingback_href_start);

		$pingback_server_url_len = $pingback_href_end - $pingback_href_start;

		$pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);



		// We may find rel="pingback" but an incomplete pingback URL

		if ( $pingback_server_url_len > 0 ) { // We got it!

			return $pingback_server_url;

		}

	}



	return false;

}

882

Advertisements

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: