WordPress-Klassen und Funktionen außerhalb der Installation verwenden

Um alle WordPress-Funktionen und Klassen auch außerhalb der WordPress-Installation verwenden zu können, muss man nur die wp-config.php in das jeweilige Script includen. In diesem Snippet erstelle ich so beispielsweise ein XML-Feed meiner Blogposts indem ich die als global deklarierte Datenbank-Klasse $wpdb nutze.

<?php include_once('wordpress/wp-config.php');
 
	function create_xml_feed(){
 
		global $wpdb, $table_prefix;
 
		$result = $wpdb->get_results('SELECT * FROM '.$table_prefix.'posts
		WHERE post_status="publish" ORDER BY ID DESC');
 
		$xml = '<?xml version="1.0" encoding="UTF-8" ?>
		<buildup>';
 
		foreach($result as $post){
			$xml .=
			'
<post id="'.$post->ID.'">
				<ID>'.$post->ID.'</ID>
<post_author><![CDATA['.$post->post_author.']]></post_author>
<post_date>'.$post->post_date.'</post_date>
<post_date_gmt>'.$post->post_date_gmt.'</post_date_gmt>
<post_content><![CDATA['.$post->post_content.']]></post_content>
<post_title><![CDATA['.$post->post_title.']]></post_title>
<post_name>'.$post->post_name.'</post_name>
<post_modified>'.$post->post_modified.'</post_modified>
<post_modified_gmt>'.$post->post_modified_gmt.'</post_modified_gmt>
				<guid>'.$post->guid.'</guid>
				<comment_count>'.$post->comment_count.'</comment_count>
			</post>';
		}
 
		file_put_contents('feed.xml', $xml.'</buildup>');
 
	}
 
?>
Als Textdatei öffnen | since1985de_e2304277.txt | 1.05 Kilobyte

7. Februar 2010

  • Eingeordnet unter: WordPress
  • keine Antworten

PHP: SimpleXML-Tipp um Ausgabefehler frühzeitig zu vermeiden

Vor kurzem hat sich Script von mir zerschossen, weil beim umwandeln einer XML-Datei in ein Objekt via simplexml_load_file() ein Fehler durch das BOM in der XML-Datei ausgelöst wurde.

Als Byte Order Mark (BOM, dt. „Bytereihenfolge-Markierung“) wird das Unicode-Zeichen U+FEFF (zero-width non-breaking space) am Anfang eines Datenstroms bezeichnet, wo es als Signatur zur Definition der Byte-Reihenfolge und Kodierungsform in UCS/Unicode-Zeichenketten verwendet wird. http://de.wikipedia.org/wiki/Byte_Order_Mark

Mein Script war zu diesem Zeitpunkt noch sehr fehleranfällig: Ich habe lediglich geprüft, ob die benötigte XML-Datei auf dem Server vorhanden ist und sie im Erfolgsfall mittels simplexml_load_file() als Objekt zurück geben lassen.

<?php
	$file = 'xml/data.xml';
	if(file_exists($file)){
		$xml = simplexml_load_file($file);
		$txt = $xml->screen->txt;
	}
	echo $txt;
?>
Als Textdatei öffnen | since1985de_ef558f9b.txt | 185 Byte

Eine andere Lösung musste her.

Aber durch den vom BOM ausgelösten Fehler – der sich zwar durch manuelles entfernen beheben lassen würde – merkte ich, dass man, gerade wenn man keine Kontrolle über die XML-Dateien hat da sie von mehreren Anwendern bearbeitet werden, einen kleinen Umweg gehen muss. Der Inhalt der XML-Datei wird mittels file_get_contents() ausgelesen und per simplexml_load_string() als Objekt zurück geliefert. Außerdem wird das BOM durch die Funktion trim() entfernt und bei Bedarf ein Fehler ausgegeben.

<?php
	$file = 'xml/data.xml';
	if(file_exists($file)){
		$string = trim(file_get_contents($file));
		$xml = simplexml_load_string($string);
		$txt = $xml->screen->txt;
	} else {
		$txt = 'Fehler: Ich konnte '.$file.' nicht finden.';
	}
	echo $txt;
?>
Als Textdatei öffnen | since1985de_8e8ccd83.txt | 298 Byte

Wenn man schon dabei ist …

Nachdem ich nun schon recht zufrieden mit dieser weniger fehleranfälligen Version meines Scripts war, habe ich mir noch gedacht, dass es vielleicht sinnvoll wäre neben der Existenz der XML-Datei auch noch zu prüfen, ob es sich bei dem zurück gelieferten Wert um en Objekt handelt.

<?php
	$file = 'xml/data.xml';
	if(file_exists($file)){
		$string = trim(file_get_contents($file));
		$xml = simplexml_load_string($string);
		if(is_object($xml)){
			$txt = $xml->screen->txt;
		} else {
			$txt = 'Fehler: Damit kann ich nicht arbeiten.';
		}
	} else {
		$txt = 'Fehler: Ich konnte '.$file.' nicht finden.';
	}
	echo $txt;
?>
Als Textdatei öffnen | since1985de_c7ec04e2.txt | 389 Byte

6. Februar 2010

  • Eingeordnet unter: PHP
  • keine Antworten