Ping a Bitacoles.net
Lectures: 586
Des que vaig començar amb el Wordpress, una de les coses que m'han tocat més la moral ha estat el fer ping a Bitàcoles. És una cosa que em porta molt mosca perquè abans, amb l'antic blog, m'ho vaig fer jo a mà i funcionava perfectament. Vaig suposar que al ser un CMS seriòs la cosa no donaria tants problemes, però és que ja frega la desesperació. No hi ha forma.
La configuració la tinc correcte i la direcció per fer ping també (http://www.bitacoles.net/notificacio.php). Però no sabia com debugar-ho, i sospitava que potser hi havia algun missatge d'error que no podia veure. Després de barallar-me unes hores ho vaig deixar estar, però avui, donant-li voltes, he trobat un blog que explicant una altra història m'ha donat una pista de per on començar. Allà mencionava quina era la funció i en quin arxiu es troba l'encarregat d'enviar el missatge XML del ping. És que el problema és que el Wordpress anomena Ping al fet de que algú et faci Trackback, i això, mirant codi, em desconcertava.
Total, que en l'arxiu functions.php hi ha una funció anomenada weblog_ping(), que és qui realitza la petició. Però aquesta és molt simple: només dóna el nom del blog i l'adreça general d'aquest, no la del post nou. A més, he trobat que hi ha una variable que posant-la a true printa per pantalla un debug de la crida i de la resposta realitzada.
Així que després de veure que la crida no dóna problemes (el problema deu estar a bitàcoles, que em deuen tenir banejat), m'he dedicat a elaborar una mica més el procés de ping. He hagut de modificar la funció que crida a aquesta per tal de que li passés el ID del post, per que la funció de ping faci una consulta a la base de dades i recuperi el títol i la ruta del post en si, per poder passar-ho en el ping i em llistin el títol del post, no només el nom del blog.
No tinc gaire temps, així que penjo el codi de les dues funcions que he hagut de tocar (ambdues dins de functions.php). La primera és la funció que rep el id del post i crida la funció que realitza el ping.
-
function generic_ping($post_id = 0) {
-
$services = get_settings('ping_sites');
-
if ( '' != $services ) {
-
foreach ($services as $service) {
-
weblog_ping($service,'',$post_id);
-
}
-
}
-
-
return $post_id;
-
}
La segona, és la que realitza el ping en sí. Fixeu-vos que he hagut d'introduir un nou paràmetre en la crida del mètode, i per que sigui compatible amb altres possibles crides, deixar-la amb un paràmetre per defecte i un if per si no li arriba el ID:
-
function weblog_ping($server = '', $path = '', $post_id = 0) {
-
include_once (ABSPATH . WPINC . '/class-IXR.php');
-
-
// using a timeout of 3 seconds should be enough to cover slow servers
-
$client->timeout = 3;
-
$client->useragent .= ' -- WordPress/'.$wp_version;
-
-
//Recuperem el títol del post
-
$post_title = "";
-
$post_url = "";
-
if($post_id != 0)
-
{
-
$post = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID = ".$post_id);
-
$post_url = $post[0]->guid;
-
}
-
-
// when set to true, this outputs debug messages by itself
-
$client->debug = false;
-
//$client->debug = true;
-
$home = ($post_url == "" ? trailingslashit( get_option('home') ) : trailingslashit( $post_url ));
-
//if ( !$client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
-
$client->query('weblogUpdates.ping', get_settings('blogname').$post_title, $home);
-
}
Així és com han quedat. La veritat és que substituint directament les dues funcions per aquestes ja tindrem un "ping avançat" per a Wordpress. Si necessiteu més ajuda, afegiu un comentari en aquest post.
Editat: Sembla ser que alguna cosa s'ha fet. Avui he vist que tinc una entrada llistada, però en el format antic (només el nom del blog i la direcció general). El fet curiós és que m'apareix a les 8:48 del matí, una hora que no he publicat res. Possiblement el correu que vaig enviar va tenir el seu efecte... però acabo de fer una prova i no apraixo a la llista
Carai! el que arriba a costar!
Torno a editar: He rebut resposta de Bitàcoles. En Dani em comenta que van eliminar la possibilitat d'enviar la URL directa al post, i que no usen banejos. Diu que només cal que estigui registrat (carai, que ho estic!). Així que torno a modificar la funció que envia la petició XML, comentant la línia que adquireix la URL directe:
-
//$post_url = $post[0]->guid;
Així que la funció ara queda de la següent manera:
-
function weblog_ping($server = '', $path = '', $post_id = 0) {
-
include_once (ABSPATH . WPINC . '/class-IXR.php');
-
-
// using a timeout of 3 seconds should be enough to cover slow servers
-
$client->timeout = 3;
-
$client->useragent .= ' -- WordPress/'.$wp_version;
-
-
//Recuperem el títol del post
-
$post_title = "";
-
$post_url = "";
-
if($post_id != 0)
-
{
-
$post = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID = ".$post_id);
-
//$post_url = $post[0]->guid;
-
}
-
-
// when set to true, this outputs debug messages by itself
-
$client->debug = false;
-
//$client->debug = true;
-
$home = ($post_url == "" ? trailingslashit( get_option('home') ) : trailingslashit( $post_url ));
-
//if ( !$client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
-
$client->query('weblogUpdates.ping', get_settings('blogname').$post_title, $home);
-
}
Al penjar aquesta edició d'aquest post, hauria de poder veure l'entrada al llistat de bitàcoles...
Edito per últim cop: Finalment, entre aquesta pista i una tonteria que m'ha passat pel cap, crec que ja ho tinc solucionat, perquè la prova ha funcionat... Resulta que tampoc es pot enviar la direcció amb la barra al final, és a dir, és correcte http://www.ladragonera.com, però no és correcte http://www.ladragonera.com/. Per tal de fer això, he hagut de canviar la línia que afegia una barra al final per una simple crida a la direcció del blog. Finalment, la funció queda d'aquesta manera:
-
function weblog_ping($server = '', $path = '', $post_id = 0) {
-
include_once (ABSPATH . WPINC . '/class-IXR.php');
-
-
// using a timeout of 3 seconds should be enough to cover slow servers
-
$client->timeout = 3;
-
$client->useragent .= ' -- WordPress/'.$wp_version;
-
-
//Recuperem el títol del post
-
$post_title = "";
-
$post_url = "";
-
if($post_id != 0)
-
{
-
$post = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID = ".$post_id);
-
//$post_url = $post[0]->guid;
-
}
-
-
// when set to true, this outputs debug messages by itself
-
$client->debug = false;
-
//$client->debug = true;
-
//$home = ($post_url == "" ? trailingslashit( get_option('home') ) : trailingslashit( $post_url ));
-
$home = get_option('home');
-
//if ( !$client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
-
$client->query('weblogUpdates.ping', get_settings('blogname').$post_title, $home);
-
}
Home
Tecnologia
Flashos
Humor
Videos
Lletres
Fotos






