Archiv des Autors: admin

Darf ich mal kurz vorstellen: JDatabase

Genau wie WordPress bringt auch Joomla ein eigene Logik für Operationen auf der Datenbank mit, nachlesen kann man das en Detail in der Joomla Dokumentation zum Thema JDatabase. Wir wollen uns für den Anfang mal vornehmen, bestimmte Daten aus einer Joomla-Tabelle in einem Artikel auszugeben. Zum Thema Select schauen sie mal hier in die JDatabase-Dokumentation.

Die Ausgangstabelle: contents

Wir holen uns mal zum Üben ein paar Datensätze aus der (prefix)_contents. Um das Tabellenpräfix nicht fest verdrahten zu müssen, benutzt man die eingebaute Variable #, der Select sieht dann so aus:

SELECT * FROM #__content

Das Datenzugriffsobjekt

Die folgende Syntax erzeugt ein neues Datenzugriffsobjekt in der Variablen $db:

$db = JFactory::getDBO();

Jetzt bauen wir uns eine Variable für den Select:
$query = „SELECT * FROM #__content;“;

Und weisen diese dem Datenzugriffsobjekt als Query zu
$db->setQuery($query);

Ausgeführt wird dieses Statement dann mit der Zuweisung
$result = $db->execute();

Erste Information: wieviele Datensätze wurden selektiert?

Das kommt einem doch sehr bekannt vor:

$anzahl_zeilen = $db->getNumRows();
echo $anzahl_zeilen.“ Zeilen selektiert<br>“;

Zeilenweise Ausgabe bestimmter Spalten des Select-Ergebnisses

Wir wollen ja nicht die ganze Tabelle #__contents ausgeben, sondern nur ausgewählte Spalten, ich nehme mal fürs Beispiel die ID, den Title und den Alias. Dafür holen wir uns die ausgewählten Datensätze als Liste von Objekten, durch die wir nachher einfach iterieren können:

$results = $db->loadObjectList();

In der Object List stecken die einzelnen Datensätze des Select-Ergebnisses, und deren Spalten kann man mit dem Namen ansprechen. Wir packen das Ganze wie schon oft gehabt in eine Foreach-Anweisung, das sieht dann so aus:

foreach ($results as $zeile) :
echo $zeile->id;
echo $zeile->title;
echo $zeile->alias;
echo „<br>“;
endforeach;

Ihre Ausgabe sollte jetzt so etwas in der Art gleichsehen:

liste_content

liste_content

Zugegeben, an der Formatierung ist noch einiges optimierbar, aber wir haben das Ergebnis unseres Select jetzt als Liste in den Artikel eingefügt. Doch schon mal nicht schlecht für den Anfang, darauf kann man aufbauen.

Weitere Datenbankoperationen

Zu den weiteren Operationen wie Insert, Update und Delete gibt es hier tieferschürfende Informationen:

Inserting, Updating and Removing data using JDatabase

Konnektieren zu einer externen Datenbank

Auch das ist genau wie in WordPress  möglich, nähere Informationen findet man hier:

Connecting to an external database

Damit lasse ich es mal gut sein mit den Datenbankoperationen. Jetzt wirds Zeit, mal ein bisschen die Stammdaten von Joomla zu durchforsten, und dazu gibt es einen neuen Beitrag.

 

 

Wie man Joomla eigenen PHP-Code unterjubelt: der Sourcerer

Wenn man in den Support-Foren die Frage recherchiert, wie man denn eigenen PHP-Code in Joomla unterbringt, wird man meistens mit dem Hinweis erschlagen, dass man dafür ein eigenes Modul oder Plugin schreiben sollte. Beides ist in Joomla (im Vergleich zur WordPress-Pluginprogrammierung) recht aufwändig und für meinen Geschmack zu umständlich, wenn es nur um ein paar kleine Code Snippets geht. Wer sich selber an einem Modul versuchen möchte findet hier bei OSTraining oder hier bei joomla.org recht ausführliche Tutorials zum Thema Modulerstellung.

„Kleine“ Lösung mit dem Sourcerer

Wenn ich bloß ein paar PHP-Zeilen z.B. zum Zugriff auf eine eigene Tabelle unterkriegen will, ist mir das mit den Modulen aber wie gesagt wesentlich zu umständlich. Ich suchte nach sowas wie php Code for Posts oder einer Shortcode-Funktionalität, und bin schließlich bei der Erweiterung Sourcerer fündig geworden.  Nach der Installation findet man im Beitragseditor eine neue Funktionalität „Quelltext“, die sich sehr unauffällig gibt:

quelltext

quelltext

Nach Klick auf „Quelltext“ landet man erstmal in einem Editor, der mit den Default-Einstellungen eine kleine Hilfestellung gibt, wo man den Code platzieren kann:

sourcerer_edit

sourcerer_edit

Das wars auch schon! Nach Klick auf „Füge ein“ wird der Text inklusive der {source}-Tags in den Beitrag eingefügt und kann dort auch weiter bearbeitet werden. Leider habe ich keine Option für Code Highlighting gefunden, auch wenn in der Doku steht: „Also it comes with syntax coloring (php, js, css, html)“. Macht jetzt aber erstmal nichts, ich kopiere mir meine paar Zeilen Code aus dem Notepad++ rein. Das sieht im einfachsten Fall so aus, beispielsweise mit einem simplen echo:

php_programmerl

php_programmerl

Der Output sollte ungefähr so aussehen:

screenshot_phpcode

screenshot_phpcode

Und was machen wir jetzt damit?

Wir haben ein bisschen Spaß auf der Datenbank! Es wird höchste Zeit, sich ein wenig mit JDatabase anzufreunden, aber dafür gibt es einen neuen Beitrag.

Jetzt fehlt nur noch : der Inhalt!

Im Original Inselfisch-Kochbuch gibt es über 300 Rezepte, und die will ich eigentlich wirklich nicht händisch nach Joomla  reinkopieren. Also habe ich mich mal auf die Suche nach Import-Tools gemacht, und das Ergebnis war leider äusserst mager. Genauer gesagt, da war aber auch schon gar nix brauchbares dabei, zumindest nicht im Public-Domain-Bereich.

Das einzige Tool, das anscheinend Artikel und Kategorien direkt aus der WordPress-Datenbank importieren kann ist JConverter, und der kostet 25 $, das hab ich jetzt erstmal nicht eingesehen.  Dann gibt es noch J2XML, aber da war die Dokumentation nicht besonders aussagekräftig. Es scheint aber so zu sein, dass J2XML für den Datenimport/Export zwischen verschiedenen Joomla-Sites gedacht ist, das ist jetzt auch nicht das was ich brauche.

Was heisst hier „Bulk create“?

OSContent macht Werbung damit, wieviel Zeit und Aufwand man mit ihrem Tool bei der Erstellung neuer Joomla-Inhalte sparen kann. Ich habe mir die Free-Version installiert, und das präsentiert sich dann so:

mass_content

mass_content

OSContent präsentiert sich als recht spartanisches Formular, in das man Artikeldaten per Copy&Paste einfügen kann, für bis zu 10 neue Artikel auf einmal. Man kann hier den Titel, Alias, Intro-Text und Fulltext eintragen. Für alle 10 Artikel kann man dann noch eine Kategorie, einen Menu Link und ein Access Level angeben, sowie das Erstellungsdatum setzen. Für die Schlagwörter habe ich leider keine Option gefunden. Na ja, so im Prinzip würde das schon reichen um ein paar Rezepte aus WordPress zu übernehmen…

Aber ich werd doch nicht allen Ernstes über 300 mal die Rezeptdaten händisch hier reinkopieren! Im richtigen Leben ist das der Job für den Praktikanten, wenn  man es gar nicht anders hinkriegt. Aber professionell ist das nicht, und auch nicht so wirklich praxistauglich. Das müsste doch auch anders gehen, vielleicht mit einem CSV-Import…

Gibts nicht sowas wie wp_insert-post()?

Erinnern sie sich an den kleinen CSV-Importer für den Turnverein Weiss-Blau? Der basierte auf der sehr komfortablen WordPress-Funktion wp_insert_post(), die man mit ein paar ausgesuchten Parametern füttern kann und die auch in einer sehr minimalistischen Version schon brauchbare Ergebnisse liefert.

So etwas habe ich bei Joomla bisher vergeblich gesucht. Am ehesten in der Richtung geht noch dieser Artikel bei Stack Exchange: Create categories, subcategories and articles using php

Aber da gehts schon heftig ans Eingemachte, die Erzeugung eines neuen Artikels ist bei Joomla offenbar ein absolut nicht-trivialer Prozess, das hab ich mir jetzt erstmal nicht angetan. Damit bleibt die Frage, wie ich denn meine WordPress-Beiträge ins Joomla reinkriege, erstmal offen. Ich recherchiere weiter!

Noch ein nettes kleines Modul: Zufallsbild

Da hatte ich doch glatt den Menüpunkt „Rezeptbilder als Geschenke“ unterschlagen, und weils Spaß macht, legen wir den mit dem Modul für Zufallsbilder an. Voraussetzung ist natürlich, dass man ein paar Bilder zu den vorhandenen Artikeln hochgeladen hat, die stecken dann im Verzeichnis „images“. Man kann sich aber auch ein extra Bilderverzeichnis anlegen, dann den Pfad entsprechend anpassen

Erweiterungen->Module->Neu „Zufallsbild“, bei Bilderverzeichnis images oder das eigene Verzeichnis angeben. Dem Modul einen Namen geben, speichern.

Dann einen Beitrag für das Zufallsbild aussuchen oder neu anlegen, ggf. einem eigenen Menüpunkt zuordnen. Im Beitragseditor die Option „Module“ wählen und das eben erstellte Modul einfügen – fertig!

zufallsbild

zufallsbild

Das Modul könnte man ausser in einem Beitrag natürlich auch an einer Modulposition im Layout anzeigen lassen, aber da kann jeder selber rumprobieren.

Mehr zur Bilderverwaltung in Joomla gibts später in einem eigenen Artikel.

 

Menü mit Untermenüs

Ich habe ja im Original-Inselfischkochbuch ein Untermenü bei den Kochbüchern eingerichtet, da will ich die Umsetzung nach Joomla nicht unterschlagen, damit man das Prinzip mal sieht. Auch hier gilt: viele Wege führen nach Rom, ich hab mal einen relativ simplen genommen. Ich gehe davon aus, dass schon Artikel mit einzelnen Kochbüchern vorhanden sind, falls nicht, kann man sie auch beim Erstellen der Menüstruktur anlegen.

Hauptmenüeintrag erstellen und konfigurieren

Menüs->Main Menü (oder wie es bei ihnen heißt)->Neuer Eintrag, Titel „Meine Lieblingskochbücher“, Menüeintragstyp „Systemlinks“->URL. Jetzt im Feld Link den Hashtag „‚#“ eingeben, speichern und schliessen.

Untermenüeintrag erstellen und zuordnen

Neuer Menüeintrag, Titel z.B. „Das bairische Kochbuch“, Menüeintragstyp Beiträge->Einzelner Beitrag, hier den passenden Beitrag auswählen oder neu erstellen. Rechts bei Übergeordneter Beitrag unseren Hauptmenüeintrag „Meine Lieblingskochbücher“ wählen, speichern.

Wenn man sich jetzt die neuen Menüeinträge im Main Menü anschaut, sollte es ungefähr so aussehen:

untermenu

untermenu

Und das Ergebnis im Frontend sollte etwa so aussehen:

untermenu_screenshot

untermenu_screenshot

Weitere Untermenüeinträge werden nach genau dem selben Muster hinzugefügt, mehr ist nicht dabei. Natürlich kann man den Untermenüeinträgen beliebige Inhalte zuordnen und hier zum Beispiel weitere Kategorieblogs oder dergleichen einrichten, aber das kann jeder selber ausprobieren.

Nach dem selben Muster kann man auch mehrstufige Untermenüs einrichten, also so etwas in der Art:

zweistufiges_untermenu

zweistufiges_untermenu

Mehrstufige Menüs brauche ich aber in der Praxis nicht oft, das wird bei zu tiefer Verschachtelung so unübersichtlich, dass man sich da eine andere Lösung überlegen sollte.

Breezing Forms: ein kurzer theoretischer Durchlauf

Theoretisch deswegen, weil Breezing Forms nicht mit meinem Xampp-Mailtodisk zusammenarbeitet und ich den Output nicht kontrollieren kann. Trotzdem, packma’s und schauen uns den populärsten Formulareditor für Joomla mal näher an.

Installation

Erweiterungen->Webkatalog->Breezing Forms free suchen und installieren, dann unter Komponenten->Breezing Forms die Installation vervollständigen.

Neues Formular anlegen

Unter Formulare verwalten->Neu kommt man in einen Formulareditor, und hier wirds schwer gewöhnungsbedürftig. Zuerst mal einen Titel (freie Zeichenwahl) und einen Namen (nur alphanumerisch) für das neue Formular vergeben. Dann muss man erstmal eine Seite hinzufügen, das geht mit Klick auf den „Page“-Button. Mit einem Klick auf „Element“ kann man der eben erstellten Seite 1 Formularfelder hinzufügen, die Optionen sind recht selbsterklärend. Ich belasse es mal bei einem Feld für den Namen des Absenders und einer Textarea für die Nachricht. Anschauen kann man sich das Ganze dann unter „Vorschau“. Das ist alles ziemlich unhandlich und wenig intuitiv, aber mit ein bisschen Übung wird das schon.

Neuen Menüpunkt für das Formular erstellen

Menüs->Main Menu (oder wie es bei ihnen heißt)->Neuer Menüeintrag Titel z.B. „Kontakt“, Menüeintragstyp „Breezing Forms“  Add Form. Dann unter dem Tab „Add Form“ den Namen des Formulars eintragen. Das sollte es gewesen sein, mit etwas Glück sieht das jetzt ungefähr so aus:

evi_kontaktformular

evi_kontaktformular

Anmerkung: wenn man das Formular in einen Beitrag anbinden will, braucht man zusätzlich das Breezing Forms Plugin, Info dazu gibts hier bei Crosstec.

Glitch oder Feature?

Ich hatte bei der Vergabe eines eigenen Formularnamens das Problem, dass die Anzeige nicht funktionierte „evisformular could not be found“. Wenn ich dann in der Formularverwaltung nachgeschaut habe, stand der Formularname wieder auf dem von Breezing Forms automatisch vergebenen Namen „QuickForm231612383“ drin, mit dem funktionierte es dann auch. Möglicherweise ein Glitch wegen der nicht ganz perfekten Installation auf dem neuen Xampp, vielleicht auch ein Feature  – sehr unbefriedigend, ich gebs zu, aber immerhin gibt es einen Workaround.

Fazit:

Wenn man sich mal an den etwas unhandlichen Formulareditor gewöhnt hat, läßt Breezing Forms keine Wünsche offen, es läßt auch die Erstellung komplexer mehrseitiger Formulare zu und bietet unzählige Konfigurationsoptionen. Eingehende Nachrichten werde auch automatisch mitprotokolliert, die kann man sich unter Komponenten->Breezing Forms-> Einträge verwalten anzeigen lassen, das gefällt mir dann doch sehr gut. Zugegeben, in Contact Form 7 ist das alles ein bisschen intuitiver, aber die Funktionsvielfalt von Breezing Forms ist schon beeindruckend.

Jedenfalls haben wir jetzt auch unser simples Kontaktformular mit recht wenig Aufwand realisiert, und dabei lassen wir es für heute.

Erweiterungen installieren: kleines Beispiel

Da fehlte doch noch was im Joomla-Inselfischkochbuch: das Zufallsrezept geht noch ab! Kurzes Googlen ergab, dass „Random Article“ von Artur Alves genau das können sollte, was ich brauchte. Also los:

Erweiterung installieren

Erweiterungen->Verwalten-> Installieren, hier sollte man sich bequemerweise den Tab „Aus Webkatalog installieren“ aktivieren, dann gehts genauso wie in WordPress mit dem Plugin-Verzeichnis. Erweiterung mit dem Namen suchen, wenn man die richtige gefunden hat wird man vom Assistenten durch die Installation geführt.

Modul anlegen

Mit Erweiterungen->Module->Neu->Random Article kann man sich jetzt ein eigenes Modul für den zufällig ausgewählten Artikel anlegen. Unter „Article Source Options“ wählt man sich die Kategorie aus, aus der der Zufallsartikel kommen soll, man könnte hier auch Subkategorien einbeziehen, aber die habe ich (noch) nicht. Namen für das Modul vergeben, darf ruhig „Zufallsrezept“ heissen, speichern.

Neuen Menüeintrag und Beitrag anlegen

Viele Wege führen in diesem Fall nach Rom, ich packe das neue Modul wieder in einen eigenen Beitrag und ordne diesem einem Menüeintrag zu.

Menüs->Main Menu->Neuer Menüeintrag-> Name „Zufallsrezept“, Menüeintragstyp einzelner Beitrag, den kann man hier gleich neu anlegen. Im Beitragseditor die Option Module anklicken und hier unser eben neu erstelltes Modul auswählen, beliebigen Text dazuschreiben, speichern und fertig. Wenn alles richtig geklappt hat, steht im Editor jetzt ungefähr sowas:

{loadmodule mod_random-article,Zufallsrezept}

Das kann man sich schon mal merken, diese Syntax wird uns noch öfter begegnen. Das wars jetzt aber auch schon, wir haben unser Zufallsrezept jetzt auch eingebaut.

Meckerpunkt am Rande: die Erweiterungs-Verwaltung

Wenn man unter Erweiterungen->Verwalten sowas wie den Pluginmanager erwartet, guckt man zuerst mal ganz schön, da springen einem neun Seiten mit mehr oder weniger kryptischen Einträgen entgegen. Weil hier nämlich auch die systeminternen Erweiterungen, Module und Komponenten mit angezeigt werden, und da fasst man tunlichst erstmal gar nichts an. Benutzerfreundlich ist das nicht, hier hätte ich mir eine übersichtlichere Lösung gewünscht!

 

 

 

Beitragskategorien aus der Datenbank abfassen

Für Spitzenklöppler: das WordPress-Kategorienmodell

Um an die Beitragskategorien heranzukommen, muss man sich mit sage und schreibe 5 Tabellen herumschlagen. Das kommt daher, weil die WordPress-Entwickler das Kategorienmodell unbedingt mehrstufig anlegen mussten. Das ist zwar wunderbar verschachtelbar und ergibt ganz eindrucksvolle Baumstrukturen, aber datenverarbeitungstechnisch ist es meiner Meinung nach mit Kanonen auf Spatzen geschossen. Mit einer winzigen Ausnahme (die Backrezepte im Inselfisch-Kochbuch) habe ich noch in keinem meiner Blogs eine Unterkategorien-Ebene gebraucht, und damit das hier nicht allzu unübersichtlich wird, lasse ich es auch bei der einen Ebene. Haben sie ein bißchen Zeit? dann wollen wir mal.

Die relevanten Tabellen

Erstens natürlich die wp_posts, aus der holen wir uns die ID, also den Primärschlüssel der Beiträge. Dann brauchen wir noch:

  • wp_term_relationships
  • wp_term_taxonomy
  • wp_terms
  • (wp_termmeta, nein, die brauchen wir nicht, nur der Vollständigkeit halber erwähnt)

Warum das ganze mit Term und nicht mit Category bezeichnet ist: rein theoretisch kann man sich auch noch eigene Taxonomien anlegen, die dann eben nicht Kategorie heissen sondern einen eigenen Namen kriegen. Sowas hab ich anno Dunnerkeil mal in meinem Bilderblog gemacht, da gabs eine eigene Taxonomie „Jahreszeiten“, die bestand aus genau vier Einträgen, nämlich „Frühling, Sommer, Herbst, Winter“. Bin ich wieder davon abgekommen, ich hab die Jahreszeiten einfach in die erste Kategorieebene mit aufgenommen, geht auch und ist wesentlich einfacher zu verwalten. Aber das nur am Rande bemerkt, wir holen uns die Tabellen jetzt mal ins Access rein und basteln uns die nötigen Verknüpfungen.

Das Datenmodell im Detail

Die ersten beiden Tabellen: wp_term_relationships und wp_posts

Wichtig ist hier erstens die object_id, das ist die ID des Beitrags aus der wp_posts. Einem Beitrag können ja mehrere Kategorien zugeordnet sein, deshalb tauchen die IDs hier auch mehrfach auf. Die term_taxonomy_id verweist auf die Kategorie. Die term_order könnte man für eine benutzerdefinierte Sortierung der Kategorien verwenden, aber das geht jetzt zu weit, das lassen wir weg.

screenshot_term_relationships

screenshot_term_relationships

Wir basteln uns also die erste Verknüpfung mit der object_id auf die wp_posts.

screenshot_beziehnungen_posts_relationships

screenshot_beziehnungen_posts_relationships

Die dritte Tabelle: wp_terms_taxonomy

Hier wird es schon ein bißchen undurchsichtiger. Die ersten drei Felder ID, term_taxonomy_id und term_id haben alle den selben Wert, da kann man nur raten wofür welches gut ist. Da wir nur die term_taxonomy_id aus der wp_term_relationships eindeutig zuordnen können, nehmen wir die halt, und merken uns als Hauptschlüssel die ID. Im Feld taxonomy steht immer der Wert category, wir haben ja nur diese eine Taxonomie, das können wir auch weglassen. Interessanter wäre da noch das Feld „parent“, das die übergeordnete Kategorie im Falle verschachtelter Kategorieebenen enthält, aber auch das lassen wir mal aussen vor, sonst blickt hier kein Schwein mehr durch.

Kleine Kuriosität am Rande: hier wird ein count mitgeführt, der die Anzahl der Beträge zu einer Kategorie wiederspiegelt. Kann man das nicht nachher im Rahmen einer Abfrage berechnen?

screenshot_term_taxonomies

screenshot_term_taxonomies

Unsere Beziehungen sollten jetzt so aussehen:

screenshot_beziehungen_3

screenshot_beziehungen_3

Die vierte Tabelle: wp_terms

Na gottseidank, da blickt man wenigstens halbwegs durch. Die term_id können wir aus der wp_term_taxonomy zuordnen, der name (na endlich!) ist der Name der Kategorie, slug ist auch klar, und die term_group ignorieren wir einfach.

screenshot_wp_terms

screenshot_wp_terms

Jetzt kommt endlich Butter bei die Fische, wir können unsere Beziehungen vervollständigen.

screenshot_beziehungen_4

screenshot_beziehungen_4

Haben wir da nicht noch was vergessen?

Die Tabelle wp_termmeta

Ja, die gibts auch noch, aber ehrlich gesagt weiß ich nicht so ganz genau, wofür man die verwenden könnte, die zieht nur wenn man mit mehreren Taxonomien arbeitet. Bei marketpress gibt es eine gelehrte Abhandlung dazu, ich hab sie allerdings nicht ganz verstanden, muss ich zugeben. Nachdem die Tabelle allerdings bei mir immer leer ist, ignoriere ich sie schlicht und ergreifend.

Sonst noch was? Ach ja, ich hätts beinah vergessen:

Die Tags = Schlagwörter stecken in der selben Logik

Und zwar wird für die Schlagwörter eine eigene Taxonomie „post_tag“ angelegt. Ich verwende prinzipiell keine Schlagwörter, wenn sie es getan haben lassen sie sich nicht irritieren, uns reichen die Beziehungen über die Kategorien.

Und jetzt: die Abfrage der Kategorien über alle vier Tabellen

Anmerkung: damit das hier nicht total uferlos wird, beschränke ich mich hier auf eine Kategorieebene. Sie sehen gleich, warum: Wir holen uns zunächst mal eine Auswahl relevanter Daten aus allen vier Tabellen, der SQL sieht dann so aus:

SELECT wp_posts.ID, wp_posts.post_title, wp_term_relationships.object_id, wp_term_relationships.term_taxonomy_id AS wp_term_relationships_term_taxonomy_id, wp_term_taxonomy.term_taxonomy_id AS wp_term_taxonomy_term_taxonomy_id, wp_term_taxonomy.term_id AS wp_term_taxonomy_term_id, wp_term_taxonomy.taxonomy, wp_term_taxonomy.count, wp_terms.term_id AS wp_terms_term_id, wp_terms.name
FROM wp_terms INNER JOIN ((wp_posts INNER JOIN wp_term_relationships ON wp_posts.[ID] = wp_term_relationships.[object_id]) INNER JOIN wp_term_taxonomy ON wp_term_relationships.[term_taxonomy_id] = wp_term_taxonomy.[term_taxonomy_id]) ON wp_terms.[term_id] = wp_term_taxonomy.[term_id];

Das Ergebnis: eine schon mal relativ übersichtliche Tabelle

Hier taucht jedes Rezept so oft auf, wie es Kategorien zugeordnet hat. Wenn wir jetzt ausser den Kategorien noch Schlagwörter mit drin hätten, müssten wir die herausfiltern, aber haben wir nicht, alles brav nur Kategorien.

screenshot_kategorien_rohdaten

screenshot_kategorien_rohdaten

Ein kleiner Kunstgriff: die Abfrage auf der Abfrage

Damit ich mir keinen Wolf parametrisiere, habe ich einfach auf die eben gezeigten Rohdaten (die Abfrage heisst auch kategorien_rohdaten) eine zweite Abfrage aufgesetzt, die ist schon übersichtlicher:

SELECT Count(kategorien_rohdaten.[ID]) AS AnzahlvonID, kategorien_rohdaten.[name]
FROM kategorien_rohdaten
GROUP BY kategorien_rohdaten.[name];

Auf Deutsch: ich zähle nur die Beitrags-IDs zu jeder genannten Kategorie, und fasse pro Kategorie die Summe zusammen. Das Ergebnis:

screenshot_kategorien_endergebnis

screenshot_kategorien_endergebnis

Na bitte, geht doch 🙂

Nur noch ein kleiner Glitch ist drin: die Summe beim Backwerk stimmt nicht. Das kommt daher, dass ich bei den Backwerken drei Unterkategorien angelegt habe, nämlich „Kuchen und Torten“, „Weihnachtsbäckerei“ und „Pikante Bäckereien“. Allerdings erlaubt es einem WordPress beim Erstellen oder Bearbeiten eines Beitrags, eine Unterkategorie anzugeben ohne auch die übergeordnete Hauptkategorie anzukreuzen, das habe ich offensichtlich einige Male gemacht, und daher stammt der Zählfehler. Die Korrektur ist einfach: ich entferne die Kategorie Backwerk und behandle die drei Unterkategorien wie Kategorien erster Ordnung, mein Excel für das Tortendiagramm kann mit Unterkategorien eh nix anfangen 🙂

Ich überlasse es jedem, der mit mehr als einer Kategorieebene gearbeitet hat selber, da die Logik entsprechend rauszupfriemeln, da muss man in der wp_terms_taxonomy den parent berücksichtigen, das ist mir jetzt hier zuviel Gedöns. Das hier langt jetzt nämlich echt für einen Beitrag, der hier ist lang genug – schließlich ist ja schon fast Feiertag!

 

 

 

 

 

 

 

 

Kategorien im Inselfisch-Kochbuch, statistisch aufbereitet (kleine Schummelei)

Der einfache Weg – ich schummle ein bißchen

Ich lass mir ja die Beitrags-Kategorien im Inselfisch-Kochbuch in der Sidebar anzeigen, mit der Anzahl der jeweiligen Beiträge, das sieht so aus:

screenshot_kategorien

screenshot_kategorien

Und weil ich manchmal ein bißchen ein Faulpelz bin, kopier ich mir den ganzen Schamott als unformatierten Text in eine Spalte ins Excel rein, hacke mir in der zweiten Spalte die Anzahlen manuell rein und bastel mir mein erstes Tortendiagramm:

Rezeptkategorien-Diagramm

kategorien_torte

kategorien_torte

Nanü, ich hab also am allermeisten vegetarische Rezepte eingestellt? Darüber liesse sich debattieren, schließlich habe ich auch alle Kuchen, Torten und Süßspeisen als „vegetarisch“ kategorisiert. Kann ich aber damit leben, darunter fallen nämlich auch alle Salate und Gemüsezubereitungen, und sowas esse ich täglich, das hat schon seine Richtigkeit.

Rang zwei mit 99 Rezepten hat die Kategorie „Für Kinder“, und auch das hat seine Richtigkeit, denn schließlich stelle ich auch viele Rezepte aus meiner Kinderzeit aus Omas Küche ein, die werden von den Kiddies heute auch noch geliebt!

Der Rest spiegelt getreulich wieder was ich selber oft und gerne esse. Mir sind gute Saucen genauso wichtig wie das Stückchen Fleisch auf dem Teller, und meine ganz große Liebe gehört der Mittelmeerküche. Ausserdem esse ich viel Gemüse, und Kuchen gebacken wird bei mir auch regelmäßig.

Fazit: Ins Inselfisch-Kochbuch kommen nur Rezepte, die garantiert ausgetestet sind und die bei mir selber oft auf den Tisch kommen. Deshalb sind auch die Zubereitungsbeschreibungen sehr genau und gut nachzuvollziehen, so daß die Rezepte leicht und gelingsicher nachzukochen sind. Mein Publikum mag es so – Rezepte für jeden Tag sind gefragt, keine ausgefallenen Exoten! Ich bleibe bei dieser Philosophie, und schreibe weiter nur das hinein, was ich auch selber gern koche und esse.

Ja, aber das war doch geschummelt!

Klar wars geschummelt – aber die Kategorien zu den Beiträgen aus der WordPress-Datenbank zu holen ist ein Späßchen für sich, und dazu gibt es einen neuen Beitrag.

 

 

Beitragsstatistik: weil mir das Dashboard da nicht reicht

Da waren die WordPress-Programmierer ein bißchen sparsam

Zugegeben, eine rudimentäre Beitragsstatistik läßt sich auch im Dashboard unter „alle Beiträge“ ablesen. Lesen, wohlgemerkt, wenn man da aussagekräftige Auswertungen fahren will, steht man ganz schön auf dem Schlauch, da kann man sich die Zahlen nur abschreiben, und das ist ein mühselig Spiel. Schon die allereinfachsten Statistiken wie z.B. Anzahl der Beiträge über die Tage gerechnet kann man sich zwar am Bildschirm angucken, aber wie zum Geier kriegt man die Daten da raus und rein ins Excel? Pfiffkas, da braucht man schon wieder Plugins dafür… ähem, Spaß muss sein, wir machen das natürlich anders 🙂

Ran an die Datenbank

Die meisten Daten von Interesse, wenn es um die Beiträge geht, stecken in der WordPress-Haupttabelle, der wp_posts. Die kennen wir ja schon recht gut, und die klemmen wir uns jetzt mal und schubsen sie aus MySQL raus und rein ins Access, da lässt es sich besser werken. Ich nehme wieder die Daten aus dem Inselfisch-Kochbuch, da war am meisten los.

Anmerkung am Rande: eine Access-2010-Lizenz gibts ab um die 30 €, wer öfter mal ein handliches Datenbankerl braucht sollte über diese Investition nachdenken!

Da hat sich ganz schön was angesammelt übers Jahr

Auf gehts, raus aus MySQL via CSV für Excel, Zeichensatz Windows 1250, Erste Zeile enthält Feldnamen anhaken und Schuß! Rein in Access, darauf gucken dass das Feld post_content den Datentyp Memo kriegt, und jetzt fangen wir richtig an.

1543 Datensätze bei 316 Rezepten – ganz schön viel Holz, aber das filtern wir uns gleich mal zurecht. Das ist jetzt alles Wiederholung, ich schalt mal den Schnellgang ein.

  • unser Erfassungszeitraum startet am 29.10.2016. Das Inselfisch-Kochbuch gibts zwar schon länger, aber da habe ich es nach einem katastrophigen Providerwechsel neu aufgebaut.
  • Ende-Datum ist gestern, 21.12.2017.
  • Uns interessieren eigentlich nur die veröffentlichten Rezepte, die erkennt man am post_type = post und post_status = publish.

Daraus stricken wir unsere erste Abfrage, wir nehmen erstmal nur wenige Felder mit, für den Anfang reichen uns das Erstellungsdatum (post_date) und der Titel (post_title). Im Access-Abfrageassistenten sieht das ganz bequem so aus:

Datum und Titel

Datum und Titel

Und hier kommt noch für alle Hardcorer das SQL:
SELECT wp_posts.post_date, wp_posts.post_title
FROM wp_posts
WHERE (((wp_posts.post_status)=“publish“) AND ((wp_posts.post_type)=“post“));

Das Ergebnis hat die erwarteten 316 Datensätze und sieht doch schon mal sehr hübsch aus:

liste_datum_titel

liste_datum_titel

Und wo ist der Rest geblieben?

Immerhin 1227 Datensätze sind bei unserer Abfrage auf der Strecke geblieben, wer oder was sind die? Access zu Hilf!

  • 1192 Datensätze sind vom post_status „inherit“, davon wiederum 1120 vom post_type „revision“. Das sind die Revisionen, die man sich im Beitragseditor zurückholen kann, wenn man mal einen Beitrag verschlimmbessert hat und eine frühere Version wieder herstellen möchte.
  • 16 mal post_type = page, das sind Seiten, keine Beiträge.
  • 72 mal post_type = attachment, das sind die hochgeladenen Bilder
  • und noch ein bißchen Kleinkram, ein paar drafts vom post_type = nav_menu_item und ein Contact-Form-Seven-Formular, das wars dann aber auch.

Wir bleiben jetzt mal bei unseren 316 veröffentlichten Beiträgen = Rezepten. Hier kommt die erste Statistik, die:

Anzahl der veröffentlichten Rezepte pro Tag über den ganzen Erfassungszeitraum

rezepte_pro_tag

rezepte_pro_tag

Was sagt uns dieses zackige Diagramm? Ich habe von Ende Oktober 2016 bis Ende Januar 2017 Rezepte eingehackt wie der Weltmeister, das war erstens die Wiederherstellung aus dem Datenbankbackup und zweitens die gleichzeitige Überarbeitung aller Rezepte im Hinblick auf Barrierefreiheit.  Von April bis Juli hab ich dann noch die Nachzügler aus dem Backup eingehackt, und ab August läuft dann der Normalbetrieb, mit ein bis zwei Rezepten an einem Tag. Dazu nehmen wir mal zum Vergleich die:

Besucherentwicklung über den gleichen Zeitraum

Man kann ganz deutlich sehen, dass die Anzahl der eingestellten Rezepte und die Anzahl der Besucher über den gleichen Zeitraum nahezu nix miteinender zu tun haben.

ifkb_besucher_pro_tag

ifkb_besucher_pro_tag

Ich mach hier mal einen kleinen Kunstgriff (wen es interessiert: mit dem GIMP) und mache eine

Kombination beider Diagramme

Jetzt stimmt natürlich die Y-Achsenbeschriftung nicht mehr, aber das kann ich verschmerzen. Die blaue Linie ist die Anzahl der von mir eingestellten Rezepte, die grüne Linie zeigt den Besucherverlauf.

besucher_gegen_rezepte

besucher_gegen_rezepte

Fazit: meinen Besuchern ist es nicht so wichtig, dass ständig neue Rezepte eingestellt werden. Die kommen, weil sie ein bestimmtes Rezept über Google gefunden haben, und dann kommen sie wieder und wieder zum Schmökern und zum Nachschlagen. Zur Erinnerung: ich habe 2819 Stammkunden (erkenntlich an den individuellen IP-Adressen), die so oft hereinschauen, dass sie den Löwenanteil meiner über 50.000 Hits auf dem Inselfisch-Kochbuch ausmachen.

Ich lerne daraus

Ja, was eigentlich? Dass ich mit dem Inselfisch-Kochbuch auf einem guten Weg bin, ein treues Stammpublikum habe und mir keinen Streß machen muss, weil ich nicht täglich neue Rezepte einstelle. Das läuft prima so wie es ist, die Besucherzahlen haben insgesamt eine leicht steigende Tendenz, das ist ein gesundes Wachstum und sehr erfreulich.

Und damit lass ich es für heute mal gut sein. Morgen gibts noch mehr WordPress-Zahlenschubserei,versprochen!