]+)>@im', $response_body, $response_links)) return false; foreach ($response_links[1] as $response_link_attributes) { $_link = array('rel' => false, 'href' => false); $response_link_attributes = preg_split('@\s+@im', $response_link_attributes, -1, PREG_SPLIT_NO_EMPTY); foreach ($response_link_attributes as $response_link_attribute) { if ($_link['rel'] == 'pingback' && $_link['href']) return $_link['href']; if (strpos($response_link_attribute, '=', 1) !== false) { list($_key, $_value) = explode('=', $response_link_attribute, 2); $_link[strtolower($_key)] = trim($_value, "'\""); } } } // Fail return false; } /** * Sends all pingbacks and other ping like requests * * At the moment only sends normal pingbacks, but may be * expanded in the future. * * @return integer The number of pings sent */ function send_all() { $pings = BB_Pingbacks::send_all_pingbacks(); return $pings; } /** * Sends all pingbacks * * @return integer The number of pings sent */ function send_all_pingbacks() { global $bbdb; $posts = $bbdb->get_results("SELECT {$bbdb->posts}.post_id, {$bbdb->posts}.topic_id, {$bbdb->posts}.post_text FROM {$bbdb->posts}, {$bbdb->meta} WHERE {$bbdb->posts}.post_id = {$bbdb->meta}.object_id AND {$bbdb->meta}.object_type = 'bb_post' AND {$bbdb->meta}.meta_key = 'pingback_queued';"); $pings = 0; foreach ($posts as $post) if ($sent = BB_Pingbacks::send_pingback($post->topic_id, $post->post_text)) { $pings += $sent; bb_delete_postmeta($post->post_id, 'pingback_queued'); } return $pings; } /** * Sends a single pingback if a link is found * * @return integer The number of pingbacks sent */ function send_pingback($topic_id, $post_text) { if (!$topic_id || !$post_text) return 0; // Get all links in the text and add them to an array if (!preg_match_all('@]+)>@im', make_clickable($post_text), $post_links)) return 0; $_links = array(); foreach ($post_links[1] as $post_link_attributes) { $post_link_attributes = preg_split('@\s+@im', $post_link_attributes, -1, PREG_SPLIT_NO_EMPTY); foreach ($post_link_attributes as $post_link_attribute) { if (strpos($post_link_attribute, '=', 1) !== false) { list($_key, $_value) = explode('=', $post_link_attribute, 2); if (strtolower($_key) === 'href') $_links[] = trim($_value, "'\""); } } } // Get pingbacks which have already been performed from this topic $past_pingbacks = bb_get_topicmeta($topic_id, 'pingback_performed'); $new_pingbacks = array(); foreach ($_links as $_link) { // If it's already been pingbacked, then skip it if ($past_pingbacks && in_array($_link, $past_pingbacks)) continue; // If it's trying to ping itself, then skip it if ($topic = bb_get_topic_from_uri($_link)) if ($topic->topic_id === $topic_id) continue; // Make sure it's a page on a site and not the root if (!$_url = parse_url($_link)) continue; if (!isset($_url['query'])) if ($_url['path'] == '' || $_url['path'] == '/') continue; // Add the URL to the array of those to be pingbacked $new_pingbacks[] = $_link; } include_once(BACKPRESS_PATH . '/class.ixr.php'); $count = 0; foreach ($new_pingbacks as $pingback_to_url) { if (!$pingback_endpoint_uri = BB_Pingbacks::get_endpoint_uri($pingback_to_url)) continue; // Stop this nonsense after 60 seconds @set_time_limit( 60 ); // Get the URL to pingback from $pingback_from_url = get_topic_link($topic_id); // Using a timeout of 3 seconds should be enough to cover slow servers $client = new IXR_Client($pingback_endpoint_uri); $client->timeout = 3; $client->useragent .= ' -- bbPress/' . bb_get_option('version'); // When set to true, this outputs debug messages by itself $client->debug = false; // If successful or the ping already exists then add to the pingbacked list if ( $client->query('pingback.ping', $pingback_from_url, $pingback_to_url) || (isset($client->error->code) && 48 == $client->error->code) ) { $count++; $past_pingbacks[] = $pingback_to_url; } } bb_update_topicmeta($topic_id, 'pingback_performed', $past_pingbacks); return $count; } } // END class BB_Pingbacks