wp_xmlrpc_server::pingback_ping() – Retrieves a pingback and registers it.

You appear to be a bot. Output may be restricted

Description

Retrieves a pingback and registers it.

Usage

$string|IXR_Error = wp_xmlrpc_server::pingback_ping( $args );

Parameters

$args
( array ) required – { Method arguments. Note: arguments must be ordered as documented.
$0
( string ) required – URL of page linked from.
$1
( string ) required – URL of page linked to. }

Returns

string|IXR_Error

Source

File name: wordpress/wp-includes/class-wp-xmlrpc-server.php
Lines:

1 to 100 of 231
  public function pingback_ping( $args ) {
    global $wpdb;

    
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
    do_action( 'xmlrpc_call', 'pingback.ping', $args, $this );

    $this->wp_xmlrpc_server::escape( $args );

    $pagelinkedfrom = str_replace( '&', '&', $args[0] );
    $pagelinkedto   = str_replace( '&', '&', $args[1] );
    $pagelinkedto   = str_replace( '&', '&', $pagelinkedto );

    
/**
 * Filters the pingback source URI.
 *
 * @since 3.6.0
 *
 * @param string $pagelinkedfrom URI of the page linked from.
 * @param string $pagelinkedto   URI of the page linked to.
 */
    $pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto );

    if ( ! $pagelinkedfrom ) {
      return $this->wp_xmlrpc_server::pingback_error( 0, __( 'A valid URL was not provided.' ) );
    }

    // Check if the page linked to is on our site.
    $pos1 = strpos( $pagelinkedto, str_replace( array( 'http://www.', 'http://', 'https://www.', 'https://' ), '', get_option( 'home' ) ) );
    if ( ! $pos1 ) {
      return $this->wp_xmlrpc_server::pingback_error( 0, __( 'Is there no link to us?' ) );
    }

    /*
		 * Let's find which post is linked to.
		 * FIXME: Does url_to_postid() cover all these cases already?
		 * If so, then let's use it and drop the old code.
		 */
    $urltest = parse_url( $pagelinkedto );
    $post_id = url_to_postid( $pagelinkedto );
    if ( $post_id ) {
      // $way
    } elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) {
      // The path defines the post_ID (archives/p/XXXX).
      $blah    = explode( '/', $match[0] );
      $post_id = (int) $blah[1];
    } elseif ( isset( $urltest['query'] ) && preg_match( '#p=[0-9]{1,}#', $urltest['query'], $match ) ) {
      // The query string defines the post_ID (?p=XXXX).
      $blah    = explode( '=', $match[0] );
      $post_id = (int) $blah[1];
    } elseif ( isset( $urltest['fragment'] ) ) {
      // An #anchor is there, it's either...
      if ( (int) $urltest['fragment'] ) {
        // ...an integer #XXXX (simplest case),
        $post_id = (int) $urltest['fragment'];
      } elseif ( preg_match( '/post-[0-9]+/', $urltest['fragment'] ) ) {
        // ...a post ID in the form 'post-###',
        $post_id = preg_replace( '/[^0-9]+/', '', $urltest['fragment'] );
      } elseif ( is_string( $urltest['fragment'] ) ) {
        // ...or a string #title, a little more complicated.
        $title   = preg_replace( '/[^a-z0-9]/i', '.', $urltest['fragment'] );
        $sql     = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title );
        $post_id = $wpdb->get_var( $sql );
        if ( ! $post_id ) {
          // Returning unknown error '0' is better than die()'ing.
          return $this->wp_xmlrpc_server::pingback_error( 0, '' );
        }
      }
    } else {
      // TODO: Attempt to extract a post ID from the given URL.
      return $this->wp_xmlrpc_server::pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
    }
    $post_id = (int) $post_id;

    $post = get_post( $post_id );

    if ( ! $post ) { // Post not found.
      return $this->wp_xmlrpc_server::pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
    }

    if ( url_to_postid( $pagelinkedfrom ) == $post_id ) {
      return $this->wp_xmlrpc_server::pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) );
    }

    // Check if pings are on.
    if ( ! pings_open( $post ) ) {
      return $this->wp_xmlrpc_server::pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
    }

    // Let's check that the remote site didn't already pingback this entry.
    if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_id, $pagelinkedfrom ) ) ) {
      return $this->wp_xmlrpc_server::pingback_error( 48, __( 'The pingback has already been registered.' ) );
    }

    // Very stupid, but gives time to the 'from' server to publish!
    sleep( 1 );

    $remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] );

    
/** This filter is documented in wp-includes/class-wp-http.php */
    $user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $pagelinkedfrom );
 

 View on GitHub View on Trac