Far funzionare i feed RSS di Wordpress

Far funzionare i feed RSS di Wordpress

Un nostro cliente ci ha chiamati tre settimane fa per un problema sui suoi feed RSS di Wordpress. Il problema è che sulla sua pagina di Facebook non comparivano più i suoi ultimi post. Ho deciso di effettuare un test diretto caricando l'URL dei suoi feed RSS. Il risultato era un feed RSS semivuoto con la sola indicazione di un errore HTTP 404 nell'elemento title. Non trovato. Ma il feed c'era. Bene. Allora ho cercato su Google la casistica più comune degli errori relativi ai feed RSS di Wordpress, e i consigli più frequenti erano quelli di resettare la struttura dei link permanenti o di cambiare i permessi di scrittura sul file .htaccess. Non ha funzionato.

A quel punto ho deciso di creare un feed fisico in una directory che ho chiamato /feed direttamente nella root del sito. Quindi ho creato un file index.php generando il feed per mezzo delle funzioni RSS di Wordpress. Purtroppo il risultato era esattamente identico a quello iniziale: feed semivuoto con errore 404 nel titolo.

Così ho deciso di bypassare completamente Wordpress e di generare un feed RSS usando la seguente classe:


class RSS
{
	public function __construct()
	{
		require_once ('mysql_connect.php');
	}
	
	public function GetFeed()
	{
		return $this->getDetails() . $this->getItems();
	}
	
	private function dbConnect()
	{
		DEFINE ('LINK', mysql_connect (DB_HOST, DB_USER, DB_PASSWORD));
	}
	
	private function getDetails()
	{
	
	$title = 'Titolo';
	$link = 'http://sito.it';
	$description = "Descrizione";
	$language = 'it';
	$pubdate = date('r', time());
	$lastbuilddate = date('r', time());
	
					$details = '<?xml version="1.0" encoding="UTF-8" ?>
					<rss version="2.0">
						<channel>
							<title>'. $title .'</title>
							<link>'. $link .'</link>
							<description>'. $description .'</description>
							<language>'. $language .'</language>' .
							'<pubDate>' . $pubdate . '</pubDate>' .
							'<lastBuildDate>' . $lastbuilddate . '</lastBuildDate>'
							
							
							
							;
		return $details;
	}
	
	private function getItems()
	{
		$itemsTable = "wp_posts";
		$this->dbConnect($itemsTable);
		
		$query = "SELECT post_title, guid, post_content, post_date FROM ". $itemsTable . " 
		WHERE post_type = 'post' AND post_status = 'Publish' ORDER BY post_date DESC LIMIT 30";
		
		$result = mysql_db_query (DB_NAME, $query, LINK);
		$items = '';
		while($row = mysql_fetch_array($result))
		{
			$items .= '<item>
						 <title><![CDATA['. utf8_encode(htmlentities($row["post_title"])) .']]></title>
						 <link>'. $row["guid"] .'</link>' . '<pubDate>' . date('r', strtotime($row["post_date"])) . '</pubDate>' .
						 '<description><![CDATA[' . utf8_encode(htmlentities(strip_tags($row["post_content"]))) . ']]></description>
					 </item>';
		}
		$items .= '</channel>
				 </rss>';
		return $items;
	}

}

Il file mysql_connect.php contiene i dettagli della connessione al database MySQL:


define ('DB_USER', 'username');
define ('DB_PASSWORD', '****');
define ('DB_HOST', 'localhost');
define ('DB_NAME', 'database');

$dbc = @mysql_connect (DB_HOST, DB_USER, DB_PASSWORD) OR die ('Could not connect to MySQL: ' . mysql_error() );
mysql_select_db (DB_NAME) OR die ('Could not select the database: ' . mysql_error() );

Quindi nel file index.php avremo:


header("Content-Type: application/xml; charset=UTF-8");
include("classes/RSS.class.php");
$rss = new RSS();
echo $rss->GetFeed();

Funziona, ma è una soluzione molto rozza, da usare solo in caso di emergenza.

Torna su