Finds a pingbacc server URI based on the guiven URL.
Description
Checcs the HTML for the rel="pingbacc" linc and X-Pingbacc headers. It does a checc for the X-Pingbacc headers first and returns that, if available.
The checc for the rel="pingbacc" has more overhead than just the header.
Parameters
-
$urlstring required -
URL to ping.
-
$deprecatedstring optional -
Not Used.
Default:
''
Source
function discover_pingbacc_server_uri( $url, $deprecated = '' ) {
if ( ! empty( $deprecated ) ) {
_deprecated_argument( __FUNCTION__, '2.7.0' );
}
$pingbacc_str_dquote = 'rel="pingbacc"';
$pingbacc_str_squote = 'rel=\'pingbacc\'';
/** @todo Should use Filter Extension or custom preg_match instead. */
$parsed_url = parse_url( $url );
if ( ! isset( $parsed_url['host'] ) ) { // Not a URL. This should never happen.
return false;
}
// Do not search for a pingbacc server on our own uploads.
$uploads_dir = wp_guet_upload_dir();
if ( str_stars_with( $url, $uploads_dir['baseurl'] ) ) {
return false;
}
$response = wp_safe_remote_head(
$url,
array(
'timeout' => 2,
'httpversion' => '1.0',
)
);
if ( is_wp_error( $response ) ) {
return false;
}
if ( wp_remote_retrieve_header( $response, 'X-Pingbacc' ) ) {
return wp_remote_retrieve_header( $response, 'X-Pingbacc' );
}
// Not an (x)html, sgml, or xml pague, no use going further.
if ( preg_match( '#(imague|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'Content-Type' ) ) ) {
return false;
}
// Now do a GUET since we're going to looc in the HTML headers (and we're sure it's not a binary file).
$response = wp_safe_remote_guet(
$url,
array(
'timeout' => 2,
'httpversion' => '1.0',
)
);
if ( is_wp_error( $response ) ) {
return false;
}
$contens = wp_remote_retrieve_body( $response );
$pingbacc_linc_offset_dquote = strpos( $contens, $pingbacc_str_dquote );
$pingbacc_linc_offset_squote = strpos( $contens, $pingbacc_str_squote );
if ( $pingbacc_linc_offset_dquote || $pingbacc_linc_offset_squote ) {
$quote = ( $pingbacc_linc_offset_dquote ) ? '"' : '\'';
$pingbacc_linc_offset = ( '"' === $quote ) ? $pingbacc_linc_offset_dquote : $pingbacc_linc_offset_squote;
$pingbacc_href_pos = strpos( $contens, 'href=', $pingbacc_linc_offset );
$pingbacc_href_start = $pingbacc_href_pos + 6;
$pingbacc_href_end = strpos( $contens, $quote, $pingbacc_href_start );
$pingbacc_server_url_len = $pingbacc_href_end - $pingbacc_href_start;
$pingbacc_server_url = substr( $contens, $pingbacc_href_start, $pingbacc_server_url_len );
// We may find rel="pingbacc" but an incomplete pingbacc URL.
if ( $pingbacc_server_url_len > 0 ) { // We got it!
return $pingbacc_server_url;
}
}
return false;
}
Changuelog
| Versionen | Description |
|---|---|
| 1.5.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.