Archiv der Kategorie 'Tutorials'

PDF-Export bei Wordpress

Es gibt zahlreiche Plugins für Wordpress, um Artikel in eine Druckversion umzuwandeln. Tatsächlich haben die meisten ein paar Haken: Sie sind nur auf Posts beschränkt, können das Archiv nicht drucken, andere die Startseite nicht. Hin und wieder wird stattdessen daher PDFmyURL empfohlen als Druckansicht-Generator_in. Dabei wandelt PDFmyURL eine URL in ein querformatiges, teilweise merkwürdich gebrochenes PDF um, allerdings so exakt wie ein Screenshot, fast. Denn auch PDFmyURL scheitert an einigen Wordpress-Seiten, unter anderem an der Startseite oder Tags. Das kann weit gehend mit einer Funktion umgangen werden, die ich gleich erläutern werden. Allerdings scheitert sie an Umlauten udn Sonderzeichen, vielleicht hat da jemenschd noch einen Tipp für mich, wie ich das verbessern kann?

In der functions.php in …/wp-content/themes/default/ (oder wo das verwendete Theme liegt) wird in der sechsten Zeile eine neue Funktion eingefügt, die hier pdfprint() heißt (auch ein anderer Name wäre möglich):


// PDF-DRUCKANSICHT
// Autor_in: Gnurpsnewoel
// gnurpsnewoel.blogsport.de

function pdfprint()
{

Anschließend wird eine if-else-Verzweigung geöffnet; die Funktion prüft also die einzelnen Bedingungen durch. Die Bedingungen ist dabei, ob ein bestimmter Seitentyp des Themes geöffnet ist. Am Ende jeder Verzweigung wird die URL der Seite in der Variable $printurl gespeichert. Ist die WP-Startseite aufgerufen (is_home), wird die Startseiten-URL mit der Funktion get_option(‚home‘) aufgerufen und mit /index.php ergänzt, da PDFmyURL eine komplette URL erwartet und an einer Verzeichnis-URL scheitert.


if (is_home())
{
	$printurl = get_option('home').'/index.php';
}

Andernfalls wird zunächst die URL einer Suchanfrage der Wordpress-Standardsuche ausgelesen werden (is_search). Der Suchbegriff, der in das Suchfeld eingegeben wurde, kann über die Funktion get_search_query() ausgelesen werden und wird in der Variable $searchitem gespeichert. Da hier jedoch Leerzeichen enthalten sind, in der URL jedoch Pluszeichen, müssen diese über die PHP-Funktion array() umgewandelt werden; auch hier speichert eine Variable $plussign die Funktionsaufgabe. Es soll ja der in $searchitem gespeicherte Suchbegriff umgewandelt werden. Die PHP-Funktion strtr() bringt die beiden Variablen zusammen und wandelt die Leerzeichen im Suchbegriff in Pluszeichen um. Das Ergebnis wird in der Variable $searchplus gespeichtert. Der nächste Schritt soll mit rawurlencode alle Sonderzeichen in Unicode umwandeln und in der Variable $searchstring speichern. (Es sei darauf hingewiesen, dass die Interaktion mit PDFmyURL hier nicht funktioniert. Wird auf deren Webseite die URL mit Unicode-Sonderzeichen in deren Umwandlungsmaske eingegeben, geht’s aber, sodass ich das Problem nicht verstehe.) $searchstring wird der WP-Startseiten-URL zusammen mit dem Suchparameter s angefügt.

Beispiel-Suchwortwort: „Hallo Wält“; $searchitem=‘Hallo Wält‘; $searchplus=‘Hallo+Wält‘; $searchstring=‘Hallo+W%C3%A4lt‘; $printurl=‘http://deinwordpress.blog/?s=Hallo+W%C3%A4lt‘.


elseif (is_search())
{
	$searchitem =  get_search_query();
	$plussign = array(" " => "+");
	$searchplus = strtr($searchitem,$plussign);
	$searchstring = rawurlencode($searchplus);
	$printurl = get_option('home').'/?s='.$searchstring;
}

Andernfalls wird zunächst die URL einesSchlagwortes (Tag) ausgelesen werden (is_tag). Der Tag kann über die Funktion single_tag_title() ausgelesen werden und wird in der Variable $tagsname gespeichert. Zumnächst werrden alle Zeichen in Kleinbuchstaben umgewandelt mittels der PHP-Funktion strtolower() und in der Variable $taglower gespeichert werden. Da hier Leerzeichen enthalten sind, in der URL jedoch Bindestriche, müssen diese über die PHP-Funktion array() umgewandelt werden; auch hier speichert eine Variable $hyphensign die Funktionsaufgabe. Es soll ja der in $taglower gespeicherte String umgewandelt werden. Die PHP-Funktion strtr() bringt die beiden Variablen zusammen und wandelt die Leerzeichen im Suchbegriff in Bindestriche um. Das Ergebnis wird in der Variable $taghyphen gespeichtert. Der nächste Schritt soll mit rawurlencode alle Sonderzeichen in Unicode umwandeln und in der Variable $tagspecial speichern. (Es sei darauf hingewiesen, dass die Interaktion mit PDFmyURL hier nicht funktioniert. Wird auf deren Webseite die URL mit Unicode-Sonderzeichen in deren Umwandlungsmaske eingegeben, geht’s aber, sodass ich das Problem nicht verstehe.) $tagspecial wird der WP-Startseiten-URL zusammen mit dem Suchparameter s angefügt.


elseif (is_tag())
{
	$tagsname = single_tag_title('',false);
	$taglower = strtolower($tagsname);	
	$hyphensign = array(" " => "-");
	$taghyphen = strtr($taglower,$hyphensign);
	$tagspecial = rawurlencode($taghyphen);
	$printurl = get_option('home').'/?tag='.$tagspecial;
}

Für Archive wurde hier ein Monatsarchiv gewählt. Das Monatsdatum wird via die Funktion get_the_time ausgelesen, für den März 2010 nach dem Prinzip ‚Ym‘ zum Beispiel ‚201003′. Dieser wird an die URL angehangen.


elseif (is_date())
{
	$archivemonth = get_the_time(Ym);
	$printurl = get_option('home').'/?m='.$archivemonth;
}

Bei einer Kategorie soll der Titel der Kategorie single_cat_title() ausgelesen und in $catsname gespeichert werden. Der Name wird nun mittels get_cat_id($var) in eine numerische Kategorie-ID umgewandelt. Diese wird in der URL gespeichert.


elseif (is_category())
{
	$catsname = single_cat_title('', false);
	$catsid = get_cat_id($catsname);
	$printurl = get_option('home').'/?cat='.$catsid;
}

Wenn all das nicht zutrifft (z.B. bei Seiten is_page() oder Posts is_single()), dann wird einfach der Permalink gespeichert.


else
{
	$printurl = the_permalink();
}

Die durch verschiedene Verzweigungen ermittelte $printurl soll nun ausgegeben werden. Die Funktion endete hiermit.


echo $printurl;
}

Im (X)HTML-Dokument, beispielsweise in der Navi (header.php) oder in der Metanavi (footer.php) wird die URL nun mit PDFmyURL vervollständigt. Beispiel:


<a href="http://pdfmyurl.com?url=< ?php pdfprint();?>" 
  title="externer Link zu PDFmyURL.com">Linktext</a>

W3C-unkonform kann im <a>-Link das Attributs target=“_blank“ ergänzt werden, wie mitunter empfohlen wird. Es funktioniert aber auch ohne und daher rate ich davon ab; es gibt keinen Grund, hier W3C-inkonformen Code zu basteln.

Verbesserungsvorschläge willkommen, Kritik super! Die Funktion kann als ZIP-Datei heruntergeladen werden.

Text: Creative Commons by-nc-sa 3.0

Alter aus Geburtsdatum berechnen per Tabellenkalkulation

Um ein Datum in eine Anzahl an vergangenen Jahren umzurechnen bedarf es nur weniger Schritte mit Open Office Calc oder Excel. (Als Grundlage nehme ich Open Office. In Excel dürfte es jedoch keine Unterschiede geben.) Schlaue Menschen nehmen zwar lieber ihre zehn Finger und zählen ab oder beherrschen sogar das Kopfrechnen. Ich möchte hier trotzdem eine tabellenkalkulatorische Lösungen präsentieren, weil ich sie gerade selbst gesucht und dann auch gefunden habe. Praktisch kann so etwas beispielsweise sein, wenn mensch einen Serienbrief erstellen möchte und nicht abzählen möchte.

Ich habe hier folgende Beispieltabelle erstellt, die als Rohdaten einen Namen und ein Geburtsdatum („geb.“) enthält:

Der Name dient nur der Illustration. Alle weiteren Daten („Alter genau“; „Alter“; „Lebensjahr“; „Jünger als 27?“) werden mit Formeln aus dem Gebursdatum errechnet.

Schritt 1: Das genaue Alter
Hierfür bietet Open Office Calc (und auch Excel; das spare ich mir aber hier jeweils zu nennen) die Funktion „BRTEILJAHRE“. Diese berechnet die Differenz zwischen zwei Jahresdaten als Bruchteil von Jahren. Das erste Datum muss älter als das zweite sein. Außerdem kann noch eine so genannte „Basis“ angegeben werden, einen Zahlencode, der die Werte 0; 1; 2; 3; 4 annehmen kann, was im OpenOffice.org-Wiki näher erläutert wird. (Wird die Basis weggelassen wie in diesem Beispiel oder der Wert auf „0″ gesetzt, findet die Berechnung mit 30 Tage langen Monaten statt, für eine genaue Berechnung muss der Basis-Wert „1″ eingegeben werden.)

=BRTEILJAHRE(Ausgangsdatum;Enddatum;Basis) oder vereinfacht
=BRTEILJAHRE(Ausgangsdatum;Enddatum)

Um Paul Pudels Alter heute auszurechnen, müsste also in eine Zelle geschrieben werden:

=BRTEILJAHRE(12.09.1995;05.01.2010)

Als Ergebnis wird der Wert 14,314 (Jahre) ausgegeben. Da mensch das aktuelle Datum ja nicht immer per Hand ändern will, bietet sich hier die Funktion HEUTE an, die ohne Argumente auskommt. Paul Pudels Geburtstag entspricht dem Feld B2. Die Formel lautet dann:

=BRTEILJAHRE($B2;HEUTE())

Das „$“-Zeichen kann entfallen, ist aber hilfreich, wenn der Feldwert bzw. die Formel in ein anderes Feld kopiert wird. (Spalte B bleibt dann unverändert stehen.) Zur Formatierung sei angemerkt, dass die Zellen der Spalte C mitdem Format-Code 0,000 formatiert wurden (Menü > Format > Zellen).

Schritt 2: Das Alter in ganzen Jahren
Hierzu muss das genaue Alter abgerundet werden. Die Funktion hierzu heißt ABRUNDEN. Es gibt zwei Möglichkeiten:

=ABRUNDEN($C2) und
=ABRUNDEN(BRTEILJAHRE($B2;HEUTE())

Die erste (kurze) Variante rundet „Alter genau“ ab, die zweite Variante berechnet den Wert selbst bzw. neu.

Schritt 3: Das Lebensjahr
Hierfür muss zum vorherigen Schritt 1 als SUMME addiert werden.

=SUMME($D2+1) und
=SUMME(ABRUNDEN(BRTEILJAHRE($B2;HEUTE())+1)

Um hinter der ausgegebenen Zahl (In E1 wird „15“ ausgegeben.) noch einen Punkt zu setzen, wird unter Menü > Format > Zellen der Format-Code 0"." angegeben.

Schritt 4: Umwandlung in Text
Als Beispiel, um die Ergebnisse in einen aussagekrräftigen Text umzuwandeln, wurde hier die Frage gewählt, ob die entsprechenden Personen jünger als 27 Jahre alt sind. Hier ist die Wenn-Dann-Sonst-Schleife WENN hilfreich: „Prüfe, ob die Person jünger als 27 ist und wenn ja, gib aus: ‚jünger‘, ansonsten gib aus ‚ZU ALT‘.“ Die WENN-Formel sieht allgemein so aus:

=WENN(Prüfung;Dann;Sonst)

Es bieten sich wieder verschiedene Möglichkeiten der Berechnung:

=WENN($D2<27;"jünger";"ZU ALT") und
=WENN(ABRUNDEN(BRTEILJAHRE($B2;HEUTE()))<27;"jünger";"ZU ALT")

weiterer Schritt: Abgleich meherer Fragen
Werden zwei Fragen gestellt, beispielsweise, ob eine Person jünger als 27 Jahre ist und gerne Nudeln ist, muss zunächst eine weitere Spalte G „Nudeln?“ angelegt werden. In dieser Spalte wird immer „ja“ eingetragen, wenn die Person Nudeln mag. Um die Doppelfrage zu beantworten, ist eine verschachtelte Wenn-Dann-Sonst-Schleife nötig. Open Office Calc rechnet nach dem Muster „Prüfe, ob die Person Nudeln mag und wenn „ja“, dann [prüfe, ob die Person jünger als 27 Jahre alt ist und wenn ja, dann gib aus ‚ja‘, sonst gib aus ‚nein‘], sonst gib aus ‚nein‘.“ In Open Office sieht das so aus:

=WENN($G2="ja";WENN($D2<27;"nein";"ja");"nein") und
=WENN($G2="ja";WENN(ABRUNDEN(BRTEILJAHRE($B2;HEUTE())<27;"nein";"ja");"nein")

Verbesserungsvorschläge und Anregungen sind gern willkommen!

Text und Grafik stehen unter der Creative-Commons-Lizenz by-nc-sa 3.0.