Archiv für den Monat: Mai 2017

Unser erstes Plugin: SetzeCode 2, die Funktionalität

Was wollten wir also tun? Den Wert einer Option per Plugin setzen. Dafür brauchen wir zuerstmal:

Ein kleines Formular für die Eingabe

//Begin Formular
echo ‚<form method=“post“>‘;
echo ‚Mein Code: <input type=“text“ name=“code“ /></br>‘;
echo ‚<input type=“submit“ name = „senden“ value=“Abschicken“/>‘.“<br>“;
echo „</form>“;
// End Formular

Keine Hexerei, nur ein ganz normales PHP-Formulärchen mit einem Texteingabefeld und einem submit-Button.

Was soll passieren, wenn auf „Abschicken“ gedrückt wurde?

Auch nicht weiter schwer, die Option soll mit dem Inhalt der Benutzereingabe gesetzt werden.

if (isset($_POST[’senden‘]))
{
    $akt_code = $_POST[‚code‘];
    update_option (‚mein_code‘, $akt_code);   
}

Und schon landet der vom Benutzer eingegebene Code als Options-Wertepaar (Name und Wert) in der Tabelle wp_options!

Man kann noch eine kleine Debug-Ausgabe mit dranhängen, dann sieht man auch gleich mal wie das mit dem get_option() funktioniert:

$akt_option = get_option (‚mein_code‘);
        echo „Wert aus der Datenbank &nbsp:“.$akt_option;

Alles klar? Bitteschön, unser erstes Plugin kann marschieren! Nochmal zur Kontrolle die gesamte Funktion:

function pluginAdminScreen() {
    echo „<h1>Setze Meinen Code</h1>“;
            
//Begin Formular
echo ‚<form method=“post“>‘;
echo ‚Mein Code: <input type=“text“ name=“code“ /></br>‘;
echo ‚<input type=“submit“ name = „senden“ value=“Abschicken“/>‘.“<br>“;
echo „</form>“;
// End Formular

if (isset($_POST[’senden‘]))
{

    $akt_code = $_POST[‚code‘];
    update_option (‚mein_code‘, $akt_code);
    
}
$akt_option = get_option (‚mein_code‘);
        echo „Wert aus der Datenbank &nbsp:“.$akt_option;      
}

Hochladen und Aktivieren unseres Plugins

Man verschiebt jetzt die fertige setze_code.php in unser vorher angelegtes Plugin-Unterverzeichnis. Wenn alles geklappt hat, taucht unser neues Plugin jetzt im Plugins-Menü auf und kann dort aktiviert werden. Dann erscheint am Ende des Admin-Menüs der neue Eintrag „SetzeCode“, und den rufen wir jetzt auf und probierens mal aus. Aussehen sollte das Ganze etwa so:

screenshot_setze_code

screenshot_setze_code

Der Wert aus der Datenbank wird beim ersten Aufruf leer sein, weil die Option noch nicht gesetzt wurde, aber nach dem ersten Abschicken sollte er treu und brav den zuletzt eingegebenen Code wiedergeben. Das wars!

 

 

Unser erstes Plugin: SetzeCode 1, die Plugin-Definition

Was ist eigentlich ein Plugin?

Ganz vereinfacht gesagt: ein Plugin ist eine Funktionserweiterung des Admin Panels. Es bekommt einen eigenen Menüeintrag (kann man nach Belieben definieren, später mehr dazu), und man kann eine Funktion hinterlegen, die bei Aufruf des Menüeintrags ausgeführt wird.

Was soll unser Plugin können?

Wir wollen den Wert einer Option in der Tabelle wp_options setzen bzw. ändern. Dafür brauchen wir ein Eingabefeld, in das der Benutzer seinen Optionswert eintragen kann, und einen „Abschicken“-Button, der den Neueintrag setzt. Das wars eigentlich schon, und wir lösen das natürlich mit einem kleinen Formular, aber dazu später mehr. Jetzt gehts erstmal darum:

Wie definiere ich ein Plugin?

Dafür legt man sich eine PHP-Datei an, die bestimmten Anforderungen entsprechen muss (gleich mehr). Dieser Datei gibt man einen aussagekräftigen Namen, in unserem Fall z.B. setze_code.php. Dann legt man sich unterhalb des WordPress-Verzeichnisses …wp-content/plugins ein eigenes neues Verzeichnis für das Plugin an und benennt es entsprechend, also z. B. …wp-content/plugins/setze-code. In dieses Verzeichnis schieben wir später unsere PHP-Datei rein, aber jetzt füllen wir sie erstmal mit Funktionalität.

Der Header des Plugin-Skripts

WordPress liest aus dem Header die relevanten Plugin-Informationen zur Darstellung im Plugins-Menü, der muss also bestimmten Anforderungen genügen. Das sieht beispielsweise so aus:

/*
Plugin Name: SetzeCode
Plugin URI: http://localhost/wordpress/wp-content/plugins/SetzeCode
Description: Setzt eine Option für einen benutzerdefinierten Code
Version: 1.0
Author: Evi Leu
Author URI: http://www.evileu.de
*/

Die fett markierten Schlüsselwörter müssen ganz genau so geschrieben werden wie sie hier zu sehen sind, inklusive der Kommentar-Tags (/*). Die hinter den Schlüsselwörtern hinterlegten Informationen kann man frei formulieren, aber es sollten schon sinnvolle Informationen sein, die man hier einträgt, die tauchen dann nämlich im Plugins Menü auf:

pluginscreen

pluginscreen

Alles klar soweit mit dem Header? Dann gehts weiter mit dem:

Eintrag im Admin-Panel

Mit der Funktion add_action() wird WordPress angewiesen, eine neue Funktionalität hinzuzufügen. Wir wollen das im Admin Panel tun, also kriegt der erste Parameter den Wert „admin_menu“ mit. Der zweite Parameter benennt die Funktion, die bei Aufruf des Menüeintrags ausgeführt werden soll.

add_action(‚admin_menu‘, ‚basicPluginMenu‘);

Die Funktion ‚basicPluginMenu‘ sieht für unser Plugin folgendermassen aus:

function basicPluginMenu() {
$appName = ‚SetzeCode‘;
$appID = ’setze-code‘;
add_menu_page($appName, $appName, ‚administrator‘, $appID, ‚pluginAdminScreen‘);
}

Mehr zur Funktion add_menu_page() im Codex, ich machs hier mal kurz, als Parameter werden hier als absolutes Minimum mitgegeben:

  • Seitentitel (wird im Browsertab angezeigt)
  • Menütitel (Wird im Adminmenü angezeigt
  • Rolle (administrator ist hier völlig OK, sind ja nur wir)
  • Slug (taucht im Permalink wieder auf)
  • Auszuführende Funktion

Das erstellt uns einen neuen Menüeintrag unten am Ende des Admin Panels, und der heißt – oh was wohl?

SetzeCode

Man könnte den Menüeintrag auch anders positionieren und z.B. ins Untermenü Werkzeuge verschieben, und ein anderes Icon auswählen und und und, aber das sparen wir uns jetzt mal, es geht rein um die Funktionalität.

Die Funktion, die das Plugin ausführen soll

Haben wir oben mit pluginAdminScreen benamst, und die definieren wir uns gleich im nächsten Beitrag. Jetzt machen wir erstmal was ganz banales, wir geben mal nur eine Titelzeile für unser Plugin aus:

function pluginAdminScreen() {
    echo „<h1>Setze Meinen Code</h1>“;
}

Funzt alles? Menüeintrag vorhanden, Überschrift wird ausgegeben? Na fein, dann basteln wir uns die Options-setzen-Funktion im nächsten Beitrag. Hier folgt mal noch zur Kontrolle der komplette Code der setze_code.php:

<?php
/*
Plugin Name: SetzeCode
Plugin URI: http://localhost/wordpress/wp-content/plugins/SetzeCode
Description: Setzt eine Option für einen benutzerdefinierten Code
Version: 1.0
Author: Evi Leu
Author URI: http://www.evileu.de
*/
add_action(‚admin_menu‘, ‚basicPluginMenu‘);

function basicPluginMenu() {
$appName = ‚SetzeCode‘;
$appID = ’setze-code‘;
add_menu_page($appName, $appName, ‚administrator‘, $appID, ‚pluginAdminScreen‘);
}

function pluginAdminScreen() {
    echo „<h1>Setze Meinen Code</h1>“;
}
?>

Options: benutzerdefinierte globale Variable

Wozu globale Variable?

Manchmal braucht man Werte, die global in WordPress zur Verfügung stehen sollen. Man kann natürlich Shortcodes definieren, die nur einen bestimmten Wert zurückgeben (return „ABCD“;), aber mit dem Shortcode ist man logischerweise abhängig vom Theme, wenn man das Theme wechselt ist auch der Shortcode und der Wert futsch. WordPress bietet da alternativ eine hübsch simple Möglichkeit, eigene Werte in der Datenbank abzulegen und auch wieder herauszuholen.

Die WordPress Options

Kurzer Blick in den Codex: add_option() legt ein Wertepaar (Option Name und Wert) in der WordPress-Tabelle wp_options ab. Mit get_option(‚optionsname‘) holt man sich den Wert bei Bedarf wieder heraus. Ich zitiere nochmal kurz den Codex:

If you are trying to ensure that a given option is created, use update_option() instead, which bypasses the option name check and updates the option with the desired value whether or not it exists.

Wir nehmen also lieber die Funktion update_option(), die uns auf jeden Fall den Datenbankeintrag anlegt, falls er noch nicht existiert. Das sieht dann etwa so aus:

update_option (‚mein_code‘, ‚Evis neuer Code‘);

Das ‚mein_code‚ ist der Name der Option, diese wird durch das update_option() neu angelegt, falls sie noch nicht existiert. Der zweite Parameter setzt den Wert (value) der neuen Option, hier habe ich einfach einen String eingesetzt. Das Feld option_value ist übrigens ein longtext, da können sie bis zu 2^32 Bytes speichern, also nur keine Hemmungen!

Wie sieht das in der Datenbank aus?

Braucht uns eigentlich nicht zu kümmern, da wir ja den Wert der Option nachher mit get_option() herausholen, aber ich zeigs mal der Vollständigkeit halber:

options

options

Die neue Option kriegt eine AutoIncrement-ID, in option_name landet der angegebene Name, in option_value der gewünschte Wert der Option, und das autoload wird defaultmäßig auf yes gesetzt und braucht uns nicht weiter zu kümmern.

Wie man den Wert der Option wieder herauskriegt

Ganz simpel. Mit get_option($option_name). Der Code für die Ausgabe sieht zum Beispiel so aus:

$akt_option = get_option (‚mein_code‘);
echo „Wert von akt_option :&nbsp“.$akt_option;

Das erzeugt die Ausgabe:

Wert von akt_option :  Evis neuer Code

Eigentlich selbsterklärend.

Und wohin jetzt mit den update- und get- Anweisungen? Dafür (täterätää!) schreiben wir unser erstes Plugin, und dazu gibts natürlich einen neuen Beitrag.

Noch’n Nachschlag: Formular mit Gedächtnis (reines PHP)

Formular soll sich Eingaben merken

Kennen sie das auch: man hat ein Online-Formular ausgefüllt und auf den „Abschicken“-Button geklickt, und alle Benutzereingaben verschwinden, man hat wieder ein leeres Formular vor sich. Passiert heutzutage gottseidank nicht mehr so oft, aber wenn dann ist es oft verdammt ärgerlich, wenn man nicht das gewünschte Ergebnis erzielt hat und das Formular nochmal von vorn ausfüllen muß. Unser Freizeitsportpartner-Suchformular vom Turnverein Weiß-Blau leidet noch unter dieser Kinderkrankheit, und die wollen wir ihm abgewöhnen. Kurz zur Erinnerung, das Formular sieht so aus:

suchformular

suchformular

Selektive Vorbelegung

Jetzt möchte ich gerne, daß nach dem Klick auf „Abschicken“ die vom Benutzer gesetzten Häkchen in den Checkboxen erhalten bleiben. Bislang sah der Code für eine Checkbox so aus:

echo „<input type=’checkbox‘ name=’turnen‘ value=’ja‘>Turnen<br>“;

Den brechen wir jetzt ein bißchen auf, und wir fragen ab ob denn der Wert für die Checkbox nicht schon mal gesetzt wurde, das sieht dann so aus:

echo „<input type=’checkbox‘ name=’turnen‘ value=’ja'“;
            if ($_POST[‚turnen‘] == ‚ja‘){
            echo „checked=’checked'“;
            }
        echo „>Turnen<br>“;

Das $_POST[‚turnen‘] enthält den aktuellen Wert des Feldes, der ist leer, wenn die Checkbox vor dem Drücken des Abschicken-Buttons leer war, und er enthält ein „ja“, wenn die Checkbox angekreuzt war. Das checken wir mit dem IF ab, und mit dem „checked=’checked'“ setzen wir im ja-Fall das Häckchen.

That’s it! Das machen wir für alle anderen Checkboxen analog, und schon haben wir ein Formular mit Gedächtnis.

Dropdownfeld mit Gedächtnis

Für die, die’s ganz perfekt haben wollen, hier noch die Vorbelegung für das Dropdown-Feld:

/*Begin select*/
echo „Auswahl Fitneß: &nbsp“;
echo „<select name=’meine_auswahl‘>“;

echo „<option“;
if ($_POST[‚meine_auswahl‘] == ‚egal‘){
    echo “ selected“;
}
echo „>egal</option>“;

echo „<option“;
if ($_POST[‚meine_auswahl‘] == ‚Anfänger‘){
    echo “ selected“;
}
echo „>Anfänger</option>“;

echo „<option“;
if ($_POST[‚meine_auswahl‘] == ‚Freizeitsportler‘){
    echo “ selected“;
}
echo „>Freizeitsportler</option>“;

echo „<option“;
if ($_POST[‚meine_auswahl‘] == ‚Profi‘){
    echo “ selected“;
}
echo „>Profi</option></select><br>“;
/*End Select*/

Das können sie sich jetzt aber selber zusammenreimen, der Mechanismus ist genau so wie bei der Checkbox, nur halt für jede Option extra. Zugegeben, es ist ein bißchen Aufwand, aber in Sachen Benutzerfreundlichkeit der Mühe wert.

Nachschlag: Kategorien schöner ausgeben leicht gemacht

Kategorienliste

Erinnern sie sich, bei der Rezeptausgabe hatte ich das Problem, daß ich hinter jeder Kategorie in der Liste ein Komma hatte, auch hinter der letzten, und das war nicht so schön.

alleposts_mit_kategorien

alleposts_mit_kategorien

Jetzt bin ich gerdae über eine WordPress-Funktion gestolpert, die das wesentlich hübscher macht, und einen gleich mit den Links zu den Kategorien mit versorgt. Kurzer Blick in den Codex: get_the_category_list

Die Funktion gibt die Kategorienliste zu einer beliebigen Beitrags-ID aus, das sieht z.B. so aus:

$ausgabe =  get_the_category_list( ‚,‘,“,1270);
echo „Kategorien: &nbsp“.$ausgabe;

Ergebnis (mit funktionalen Links):

Kategorien:  Echt Bairisch,Plauderei,Single-Küche

Man kann als Seperator übrigens beliebige Strings setzen, ich nehm mal ein “ + „:

Kategorien:  Echt Bairisch + Plauderei + Single-Küche

Das sieht doch gleich viel besser aus!

Schlagwortliste

Eine ähnliche Funktion gibt es auch für die Schlagworte, die nennt sich get_the_tag_list, hier lohnt ebenfalls ein Blick in den Codex:

https://codex.wordpress.org/Function_Reference/get_the_tag_list

Diese kleinen Nützlinge kann man immer wieder mal brauchen.

Schmankerl für alte Datenbanker: Zugriff auf externe Daten mit dem wpdb-Objekt

Was viele nicht wissen: Zugriff auf beliebige MySQL-Datenbanken in WordPress ganz einfach

Mit dem wpdb-Objekt sind wir ja inzwischen schon per Du, da hab ich schon genug Anwendungsbeispiele geliefert. Jetzt setz ich noch eins obendrauf: wir holen uns mal Daten aus einer externen MySQL-Datenbank. Das kann die DB einer anderen WordPress-Instanz sein, muß aber nicht, irgendeine gehostete MySQL-DB tuts auch. Wir brauchen dazu nur den Connect, also ganz das Übliche:

  • Datenbankserver
  • Datenbankname
  • Datenbankuser
  • Datenbankpasswort

Und schon kann es losgehen. Ich leg mir die Connect-Daten gern auf Variable, das sieht dann z.B. so aus:

$user = ‚U12345678‘;
$password = ‚meinPasswort‘;
$database = ‚DB12345678‘;
$server = ‚rdbms.strato.de‘;

Der externe Connect mit dem wpdb-Objekt

Voraussetzung ist natürlich, daß vorneweg global $wpdb deklariert wurde. Dann gehts ganz einfach:

$wpdb = new wpdb($user, $password, $database, $server);

Damit legen wir ein neues wpdb-Objekt an, das auf die externe Datenbank zugreift. Jetzt können wir nach Belieben auf die Tabellen in der externen Datenbank zugreifen, zum Beispiel so:

Der SELECT geht wie gehabt

$rows = $wpdb->get_results(„SELECT * FROM beispieltabelle“);

Das dürfte ihnen jetzt aber doch schwer bekannt vorkommen! Mit dem $wpdb->get_results haben wir ja schon die ganze Zeit gearbeitet, der gibt wie üblich ein Array zurück, das das Ergebnis des Select enthält.

Der FOREACH – auch wie gehabt

Auch hier ändert sich gar nichts, man greift über die Feldnamen der externen Tabelle zu und formatiert sich seine Ausgabe nach Wunsch, zum Beispiel so:

foreach ($rows as $obj) :

   echo „<h1>“.$obj->feldname_1.“</h1>“;
   echo „<h2>“.$obj->feldname_2.“</h2>“;
   echo „<p>“.$obj->feldname_3.“</p>“;

endforeach;

Das wars schon! Wenn sie den Connect String haben, können sie aus WordPress heraus auf jede beliebige Datenbank im Web zugreifen und die gewohnten wpdb-Methoden dafür verwenden. Ist immer wieder mal nützlich!

Mein Freund, der Shortcode – auch auf Knopfdruck mit Button

Warum ich Shortcodes so nützlich finde

Ganz einfach, weil sie die volle Funktionalität von PHP mit all den vielfältigen Möglichkeiten von WordPress vereinen. Ich glaube, daß Shortcodes eins der meistunterschätzten programmiertechnischen Werkzeuge von WordPress sind. Alle Welt schreit immer nach Plugins, aber die sind nicht immer der Weisheit letzter Schluß. Gerade wenn man Ausgaben und Ereignisse auf der für den Benutzer sichtbaren Oberfläche einer Webseite steuern will, sind Shortcodes ein mächtiges Werkzeug und nahezu universell einsetzbar. Sie erlauben durch das wpdb-Objekt vollen Datenbankzugriff (übrigens auf jede beliebige Datenbank, für die man den Connect hat), sie erlauben einem das Einsetzen von Formularen mit all den ausgefuchsten Feinheiten von PHP, sie erlauben die Abfrage der Eigenschaften und die Manipulation nahezu aller WordPress-Objekte, und vieles mehr. Kurz gesagt, sie sind das geniale Universal-Schweizermesser wenn man WordPress programmiererisch zuleibe rücken möchte. Jetzt aber genug der Lobeshymne, heute Abend hab ich noch ein nettes Zuckerl:

Shortcodes auf Knopfdruck mit Buttons

Manchmal wäre es ganz nett, wenn ein Shortcode auf einer Seite oder in einem Beitrag nicht sofort beim Aufruf loslegen würde, besonders dann nicht, wenn man mehrere Shortcodes im selben Objekt einsetzen möchte, das wird schnell unübersichtlich. Dann wäre es ganz nützlich, wenn man erst einmal auf ein entsprechend beschriftetes Knöpfchen drücken könnte, und der Shortcode erst dann ausgeführt wird. Das ist nicht schwer zu realisieren, und die Lösung ist (wie könnte es anders sein) selbst ein Shortcode.

Formular für den Button

Um einen klickbaren Button zu erhalten, lege ich ein kleines Formular an, das nichts ausser einem submit-Button enthält, das sieht so aus:

echo ‚<form method=“post“>‘;
echo ‚<input type=“submit“ name = „senden“ value=“Shortcode abrufen“/>‘;
echo „</form>“;

Was passieren soll, wenn auf den Button geklickt wird, wird wie üblich mit ISSET bestimmt, und hier kommt auch gleich der Witz an der ganzen Sache:

if (isset($_POST[’senden‘]))
{
    //Hier Shortcode einsetzen, wichtig: einfache Hochkommas
    $inhalt = „[form id=’26‘ title=’Anmeldung‘]“;
    echo do_shortcode($inhalt);
}

Die Variable $inhalt wird einfach mit dem String des aufzurufenden Shortcodes belegt, und das kann wirklich ein x-beliebiger Shortcode sein, ob selbst definiert, oder der Shortcode eines Contact-Form-7-Formulars, oder ein MetaSlider-Shortcode oder was einem sonst gerade einfällt. Wichtig ist nur, dass man die doppelten Anführungszeichen in den Shortcode-Parametern durch einfache Hochkommas ersetzt. Mehr ist nicht dran, so sieht das Ganze am Stück aus:
function button_shortcode(){
   
//Begin Formular
echo ‚<form method=“post“>‘;
echo ‚<input type=“submit“ name = „senden“ value=“Shortcode abrufen“/>‘.“<br>“;
echo „</form>“;
// End Formular

if (isset($_POST[’senden‘]))
{
    //Hier Shortcode einsetzen, wichtig: einfache Hochkommas
    $inhalt = „[form id=’26‘ title=’Anmeldung‘]“;
    echo do_shortcode($inhalt);
}
   
}
add_shortcode(‚button‘, ‚button_shortcode‘);

An der gewünschten Stelle im Beitrag oder auf einer Seite den Shortcode [button] einsetzen, und voila, sie haben ihren Shortcode auf Knopfdruck!

Suchformular Auswertung (mit komplettem PHP-Code)

Formular wird ausgefüllt, Abschicken wird gedrückt

Ich setze mal voraus, daß ein wenig Grundwissen in PHP-Formularen vorhanden ist, der Code für das Formular kommt später, jetzt geht es erstmal ums Prinzip. Ich zeige nur mal exemplarisch den Code für das Dropdown-Feld für die Fitness:

echo ‚Fitness auswählen:‘;
        echo „<select name = ‚auswahl_fitness‘>“;
            echo „<option value=’%‘>egal</option>“;    
            echo „<option value=’Anfänger‘>Anfänger</option>“;
            echo „<option value=’Freizeitsportler‘>Freizeitsportler</option>“;
            echo „<option value=’Profi‘>Profi</option>“;

        echo “    </select><br>“;

Das Schlüsselwort „select“ definiert ein Dropdown-Feld, die „options“ sind die einzelnen Einträge. Die „values“ entsprechen genau unseren möglichen Einträgen in der Mitgliederstamm-Tabelle.

Jetzt kommt die Action

Der Benutzer wählt also im Dropdown-Feld seine Fitneß aus und macht seine Häkchen bei den anderen Optionen. Dann klickt er auf „Abschicken“, und erst jetzt tritt unser PHP-Skript wirklich in Aktion. Die Benutzereingaben werden aus den Formularfeldern abgegriffen und auf Variable gelegt. Ich belege alle NICHT angekreuzten Optionen auch gleich mit einem % (Prozentzeichen), das ist der Platzhalter für eine beliebige Zeichenfolge in MySQL. Das ist mal der erste Schritt.

Ob der Button „Abschicken“ gedrückt wurde, fragte man mit dem ISSET-Befehl ab, ich setz den mal hier nur mit der ersten Variablenbelegung für die Fitness rein:

if ( isset($_POST[„senden“]) ) {

(…hier kommt die Variablenbelegung mit den Formularinhalten…)

$akt_auswahl_fitness = $_POST[‚auswahl_fitness‘];

}

Zugriff auf die Datenbank – der Select

Damit aus den Benutzereingaben jetzt auch eine Ausgabe wird, müssen wir natürlich auf unsere Datenbank zugreifen, denn in der stecken ja alle relevanten Informationen. Wir machen das wieder mit einem wpdb-Objekt, wie gewohnt, und basteln uns aus den Variablen mit den Benutzereingaben den passenden Select zusammen. Der wird am Ende in etwa so aussehen:

$alleposts = $wpdb->get_results( „SELECT * from „.MAINTABLE.“
                                        JOIN wp_posts

ON „.MAINTABLE.“.id = SUBSTRING_INDEX( wp_posts.post_title,‘ ‚,1)
                                        WHERE wp_posts.post_status LIKE ‚publish‘                        
                                        AND „.MAINTABLE.“.fitness LIKE ‚“.$akt_auswahl_fitness.“‚
                                        AND „.MAINTABLE.“.tagesfreizeit LIKE ‚“.$akt_auswahl_tagesfreizeit.“‚
                                        AND „.MAINTABLE.“.turnen LIKE ‚“.$akt_auswahl_turnen.“‚
                                        AND „.MAINTABLE.“.aerobic LIKE ‚“.$akt_auswahl_aerobic.“‚
                                        AND „.MAINTABLE.“.fussball LIKE ‚“.$akt_auswahl_fussball.“‚
                                        AND „.MAINTABLE.“.basketball LIKE ‚“.$akt_auswahl_basketball.“‚
                                        AND „.MAINTABLE.“.feierabend LIKE ‚“.$akt_auswahl_feierabend.“‚
                                        AND „.MAINTABLE.“.wochenende LIKE ‚“.$akt_auswahl_wochenende.“‚
                                        „);

Das sieht jetzt erstmal schlimm aus, ist aber gar nicht so kompliziert. Erklärung folgt etwas später.

Zwischenbemerkung: ich hab mal kurz eine Neuerung im Join eingeführt

Wir hatten für die Mitglieder-ID ein benutzerdefiniertes Feld in jedem Beitrag eingeführt, erinnern sie sich? Und dann habe ich noch die Regel eingeführt, daß jeder Beitrag mit der ID und dem Vornamen des Mitglieds betitelt wird, also etwa „1 Ferdinand“ oder „9 Ivonne“. Das war doppelt gemoppelt, wenn man die Benennung der Beiträge konsequent durchführt und immer die richtige ID-Nummer angibt, kann man sich das benutzerdefinierte Feld glatt sparen und die ID aus dem Beitragstitel extrahieren. Dazu schneidet man den Beitragstitel einfach beim ersten Vorkommen eines Leerzeichens ab, das passiert hier mit der Anweisung:

SUBSTRING_INDEX( wp_posts.post_title,‘ ‚,1)

Übrig bleibt die numerische ID, und auf die kann man einwandfrei joinen. Voraussetzung ist wie gesagt, daß man beim Anlegen der Mitglieds-Beiträge konsequent arbeitet und immer die richtige ID angibt.

Die WHERE-Klausel

Die wird ziemlich lang, weil wir natürlich für jedes Feld aus dem Suchformular eine Bedingung haben. Ich nehm mal die erste raus:

WHERE wp_posts.post_status LIKE ‚publish‘                        
                                        AND „.MAINTABLE.“.fitness LIKE ‚“.$akt_auswahl_fitness.“‚

Den post_status LIKE ‚publish‘ brauchen wir, damit uns wirklich nur die veröffentlichten Mitgliedsbeiträge ins Netz gehen.

Die nächste Bedingung (mit AND drangehängt) vergleicht einfach nur, ob der Wert des Feldes „fitness“ gleich dem ist, den wir in der Variable $akt_auswahl_fitness gespeichert haben. Dieser Wert kommt natürlich aus dem Dropdown-Feld des Formulars, und kann „%“ für „egal“ enthalten, oder er ist mit einer der drei anderen Möglichkeiten (Anfänger, Freizeitsportler, Profi) belegt. Damit fischen wir uns alle Mitglieder-Datensätze heraus, die der aktuellen Auswahl Fitness entsprechen.

Die zweite Bedingung lautet:

 AND „.MAINTABLE.“.tagesfreizeit LIKE ‚“.$akt_auswahl_tagesfreizeit.“‚

Im Tabellenfeld tagesfreizeit kann nur „ja“ oder „nein“ drinstehen, und unsere Variable $akt_auswahl_tagesfreizeit aus dem Formular enthält entweder ein „ja“ oder ein „%“ für egal, damit kriegen wir alle mit Tagesfreizeit oder alle bei denen der Benutzer nichts angewählt hat.

Und so gehts lustig weiter, immer mit „AND“ drangehängt die nächste Bedingung mit dem nächsten Datenbankfeld und der nächsten Variablen, bis wir die Liste durch haben. War doch jetzt nicht so schwer, oder?

Die Ausgabe

Jetzt fehlt noch die Ausgabe, aber da gibts nicht viel Neues zu erzählen, das machen wir ganz einfach wieder mit einer Foreach-Schleife über das Ergebnis unseres Selects, die könnte zum Beispiel so ausehen, als Tabelle formatiert:

echo „<table>“;    
    
    // Titelzeile ausgeben
    echo „<tr><td>Turnen</td><td>Aerobic</td><td>Fußball</td><td>Basketball</td><td>Tagesfreizeit</td><td>Feierabend</td><td>Wochenende</td><td>Vorname</td><td>Nachname</td><td>Fitness</td><td>Paßfoto</td><td>Link</td></tr>“;
    
    //Eine Zeile pro Datensatz ausgeben
    foreach ( $alleposts as $einpost ) {
        echo „<td>“.$einpost->turnen.“</td>“;
        echo „<td>“.$einpost->aerobic.“</td>“;
        echo „<td>“.$einpost->fussball.“</td>“;
        echo „<td>“.$einpost->basketball.“</td>“;
        echo „<td>“.$einpost->tagesfreizeit.“</td>“;
        echo „<td>“.$einpost->feierabend.“</td>“;
        echo „<td>“.$einpost->wochenende.“</td>“;
        
        echo „<td>“.$einpost->vorname.“</td>“;        
        echo „<td>“.$einpost->nachname.“</td>“;
        echo „<td>“.$einpost->fitness.“</td>“;
         // Link zum Mitgliedsbeitrag ausgeben
        echo „<td><a href =“.$einpost->guid.“>Zum Mitgliedsbeitrag</<a></td>“;
       
        echo „</tr>“;

    } //end foreach

echo „</table>“;

Haben wir alles schon gehabt, dazu muß ich glaube ich nicht viel erzählen. Hat doch Spaß gemacht, nicht wahr? Auch wenn es jetzt weniger mit WordPress und mehr mit PHP und MySQL zu tun hatte.

Kompletter Code des Suchformulars

Den gibt es hier als gezipptes PHP-Skript. Es sind noch etliche Debug-Ausgaben mit drin, aber die kann sich jeder selber rauskommentieren.

Suchformular als ZIP-Datei

Sportpartner Suche – die Anforderungen

Sportpartnersuche Online

Ich hatte ja früher schon erwähnt, daß der Turnverein Weiß-Blau seinen Mitgliedern einen besonderen Service anbieten möchte, und zwar die gezielte Suche nach möglichen Freizeitsportpartnern online auf der Homepage des Vereins. Man soll herausfinden können, wer sich z.B. auch für Fußball interessiert, am Wochenende Zeit hat und von der Fitneß her auch Anfänger ist. Damit das klappt, müssen wir natürlich eine Möglichkeit schaffen, daß man die gewünschten Suchkriterien online eingeben kann, und das geschieht mit Hilfe eines PHP-Formulars für die Benutzereingaben.

Das Suchformular

Das Suchformular kann natürlich nur das wiederspiegeln, was in unserer Mitgliederstamm-Tabelle auch drin ist, aber das ist ja gar nicht so wenig. Wir haben drei Stufen für die Fitneß (Anfänger, Freizeitsportler, Profi), wir haben vier Sportarten zur Auswahl, und wir haben drei mögliche Kriterien für die verfügbare Freizeit. Im ersten Ansatz kann das Suchformular also so aussehen:

suchformular

suchformular

Für die Fitneß habe ich ein Dropdown-Feld gewählt und zusätzlich die Auswahl „egal“ (für alle Fitneß-Angaben) eingefügt, bei den Sportarten und den Angaben zur Freizeit ist eine Mehrfachauswahl möglich. Wenn man seine Auswahl getroffen hat, klickt man auf den Button „Abschicken“ – ja und dann? Dann wirds programmiertechnisch erst richtig interessant, dann sollen nämlich alle Mitglieder ausgegeben werden, auf die die getroffene Auswahl zutrifft. Wie das programmiertechnisch gelöst wird, dazu gibts einen neuen Beitrag.

Privatsphäre für personenbezogene Daten: das Plugin Secret Content

Adressdaten und Datenschutz

Jetzt haben wir also unser schönes Mitgliederverzeichnis mit allen Adressdaten und freuen uns darüber – aber mal langsam, so geht das „in echt“ natürlich nicht. Man kann nicht einfach Fotos und persönliche Daten von echten Personen ins Internet stellen und blind darauf vertrauen, daß schon nieman Schindluder damit treiben wird. Also muß ein Schutzmechanismus her, und genaugenommen müssen wir auch die Datenschutzerklärung (die auf dem Anmeldeformular) erweitern. Wie gehen wir das an?

Wir nutzen das WordPress-Login

Eine einfache Lösung ist es, unser Mitgliederverzeichnis nur für eingeloggte WordPress-Benutzer sichtbar zu machen. In unserem Fall ist das erstmal nur ich, der Admin, weitere Benutzer gibt es noch nicht (Werden wir aber noch brauchen, später, für die versprochene Suche nach Sportpartnern). Wie stellen wir es also an, daß unser Mitgliederverzeichnis nur für eingeloggte User sichtbar ist?

Das PluginSecret Content

Plugin-Seite: https://de.wordpress.org/plugins/secret-content/

Ich liebe Werkzeuge, die genau einen speziellen Zweck erfüllen und keinen Schnickschnack mitschleppen. Das Plugin Secret Content macht genau ein Ding: es ermöglicht einem, auf jeder Seite und auf jedem Beitrag anzugeben, daß sie nur für eingeloggte Benutzer sichtbar sein sollen. Nach Installation und Aktivierung des Plugins gibt es ein zusätzliches Fensterchen rechts oben im Editor, wo man anwählen kann, ob die Seite oder der Beitrag nur für eingeloggte Benutzer sichtbar sein soll.

secretcontent

secretcontent

Häkchen reinsetzen, speichern, fertig. Seite ist unsichtbar, wenn man nicht eingeloggt ist. Das wars! Das Plugin ist zwar seit über zwei Jahren nicht aktualisiert worden, aber es funktioniert einwandfrei, wieso sollte man daran was verbessern wollen?

Datenschutzerklärung anpassen nicht vergessen

Man muß das schon genau nehmen mit dem Schutz der personenbezogenen Daten, und deshalb müßten wir auch unsere Datenschutzerklärung auf dem Anmeldeformular anpassen, sobald wir echte Personendaten verwalten. Da gehört noch ein Passus hinein, daß Fotos und Adressdaten für andere Vereinsmitglieder sichtbar sind, wenn sie auf der Vereinsseite eingeloggt sind. Wie man das am Besten formuliert – ich würde im Echtfall einen Anwalt fragen, ganz ehrlich.

So, aber jetzt gehts weiter mit ein bißchen Spiel und Spaß mit PHP, wir machen uns an das Sportpartner-Suchformular, und dafür gibt es einen neuen Beitrag.