In WordPress possiamo servire un feed RSS come JSON al codice lato client tramite AJAX.
Possiamo implementare la seguente soluzione.
function my_get_blog_feed() {
$url = trim( $_POST['url'] );
if( !filter_var( $url, FILTER_VALIDATE_URL ) ) {
wp_send_json( array( 'error' => 'Invalid URL.' ) );
}
$per_page = isset( $_POST['n'] ) && ctype_digit( $_POST['n'] ) ? (int) $_POST['n'] : 3;
$response = wp_remote_get( $url, array( 'timeout' => 5 ) );
$output = array();
$output['items'] = array();
$posts = array();
if( is_wp_error( $response ) ) {
wp_send_json( array( 'error' => 'Request error.' ) );
}
$feed = $response['body'];
$dom = new DOMDocument();
$dom->loadXML( $feed );
$items = $dom->getElementsByTagName( 'item' );
foreach( $items as $item ) {
$title = $item->getElementsByTagName( 'title' )->item( 0 )->firstChild->nodeValue;
$link = $item->getElementsByTagName( 'link' )->item( 0 )->firstChild->nodeValue;
$posts[] = compact( 'title', 'link' );
}
$length = ( $per_page > 0 && $per_page <= count( $posts ) ) ? $per_page : 3;
$output['items'] = array_slice( $posts, 0, $length );
wp_send_json( $output );
}
add_action( 'wp_ajax_my_get_blog_feed', 'my_get_blog_feed' );
add_action( 'wp_ajax_nopriv_my_get_blog_feed', 'my_get_blog_feed' );
Il client invia l'URL del feed RSS da reperire e facoltativamente il numero di elementi da restituire. Se l'URL è valido e non ci sono errori nella richiesta HTTP, il feed viene elaborato usando l'estensione DOM di PHP. Viene quindi restituito un oggetto JSON la cui proprietà items è un array di oggetti contenenti il titolo e l'URL di ciascun articolo.