{"id":465,"date":"2017-05-14T15:38:17","date_gmt":"2017-05-14T13:38:17","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=465"},"modified":"2017-05-14T17:22:59","modified_gmt":"2017-05-14T15:22:59","slug":"ein-dirty-trick-wir-holen-uns-die-wp-load-php","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/05\/14\/ein-dirty-trick-wir-holen-uns-die-wp-load-php\/","title":{"rendered":"Ein Dirty Trick: wir holen uns die wp-load.php"},"content":{"rendered":"<h2>Wo ist unser wpdb-Objekt geblieben?<\/h2>\n<p>In unserer &#8222;nackten&#8220; PHP-Datei steht es n\u00e4mlich erstmal nicht zur Verf\u00fcgung. Um jetzt aber trotzdem ranzukommen &#8211; wir wollen ja schlie\u00dflich wieder mit $wpdb-&gt;get_results und all den praktischen Helferlein arbeiten &#8211; gibt es eine einfache, wenn auch unter WordPress-Puristen umstrittene Methode. Man holt sich mithilfe einer require()-Anweisung die Datei wp-load.php ins Boot, und schon kann man die WordPress-Funktionalit\u00e4ten wieder nutzen. Wo diese Datei liegt, ist abh\u00e4ngig von der jeweiligen WordPress-Installation, normalerweise steckt sie im Stammverzeichnis, da wo auch wp-config.php und Konsorten zu finden sind. Falls sie also da zu finden ist, kann man sich so behelfen:<\/p>\n<p><em>require(&#8218;..\/..\/..\/wp-load.php&#8216;);<\/em><\/p>\n<p>Das ist nat\u00fcrlich nicht besonders Foolproof und f\u00e4llt auf die Nase, wenn die Datei woanders liegen sollte.<\/p>\n<h2>Sauberere Methode &#8211; wenn auch etwas kryptisch<\/h2>\n<p>Eigentlich hasse ich es ja, Code zu verwenden, den ich nicht ganz verstehe. Aber hier mache ich mal eine Ausnahme, es funktioniert n\u00e4mlich einwandfrei. Das Code Snippet stammt von <a href=\"https:\/\/frankiejarrett.com\/2012\/04\/the-simplest-way-to-require-include-wp-load-php\/\">Frankie Jarrets Seite<\/a>, und dort kann man auch nachlesen warum man es so NICHT machen sollte&#8230;<\/p>\n<p>Statt dem wie oben codierten absoluten Pfad kann man nach Frankie folgende L\u00f6sung verwenden:<\/p>\n<p><em>$parse_uri = explode( &#8218;wp-content&#8216;, $_SERVER[&#8218;SCRIPT_FILENAME&#8216;] );<\/em><br \/>\n<em><strong>require_once<\/strong>( $parse_uri[0] . &#8218;<strong>wp-load.php<\/strong>&#8218; );<\/em><\/p>\n<p>Wie dem auch sei, wir holen uns halt unsere wp-load.php, auch wenn die Puristen Zetermordio schreien. F\u00fcr unser kleines Adresseneditor-Plugin tuts diese L\u00f6sung wirklich, da werden wir keine Probleme mit Serverlast Verdopplung etc. zu erwarten haben.<\/p>\n<h2>Hurra, das wpdb-Objekt ist wieder da!<\/h2>\n<p>Und deshalb k\u00f6nnen wir den Code aus unserem ersten Adresseneditor-Plugin (fast) unver\u00e4ndert \u00fcbernehmen. Die ID f\u00fcr den aktuellen Datensatz haben wir ja schon, die steckt in:<\/p>\n<p><em>$akt_id = $_POST[&#8222;id&#8220;];<\/em><\/p>\n<p>ganz am Anfang der Datei edit-adresse.php und kommt aus unserem aufrufenden Formular.<\/p>\n<h2>Der Select<\/h2>\n<p>&#8230; ist jetzt wie gehabt:<\/p>\n<p><em>global $wpdb;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$alleposts = $wpdb-&gt;get_results( &#8222;SELECT * from &#8222;.MAINTABLE.&#8220; where ID = &#8222;.<strong>$akt_id<\/strong>.&#8220;&#8220;);<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0<\/em><\/p>\n<h2>Kleiner Negertrick in der Foreach-Schleife<\/h2>\n<p>Wenn wir den Foreach auch unge\u00e4ndert \u00fcbernehmen, kommt es nach dem Editieren des Datensatzes und Dr\u00fccken des &#8222;\u00c4nderungen speichern&#8220;-Buttons zu einem unerw\u00fcnschten Effekt: die Formularfelder werden auf die urspr\u00fcnglichen Werte zur\u00fcckgesetzt. Das f\u00fchrt nat\u00fcrlich zu heftiger Verwirrung beim Anwender, weil seine \u00c4nderungen pl\u00f6tzlich verschwunden sind. Dabei sind sie doch schon in der Datenbank gespeichert! Ich mach da mal kurzen Prozess und unterbinde die Anzeige des Formulars, wenn auf den &#8222;\u00c4nderungen speichern&#8220;-Button gedr\u00fcckt wurde, dann siehts sauberer und f\u00fcr den Anwender besser logisch verst\u00e4ndlich aus. Dazu binde ich eine IF-Abfrage mit ein, hier unten fett hervorgehoben:<\/p>\n<p><em>foreach ( $alleposts as $einpost ) { \u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\/\/Begin Formular<\/em><br \/>\n<em>echo &#8218;&lt;form method=&#8220;post&#8220;&gt;&#8216;;<\/em><\/p>\n<p><em>\u00a0\u00a0 \u00a0\u00a0\u00a0 <strong>\u00a0if (!isset($_POST[&#8217;speichern&#8216;])){<\/strong><\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo &#8222;&lt;div style = &#8218;border: 3px solid blue; padding: 10px; display: inline-block&#8216;&gt;&#8220;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo &#8218;ID: &amp;nbsp&#8216;.$einpost-&gt;id.'&lt;input type=&#8220;text&#8220; name=&#8220;id&#8220; value = &#8222;&#8218;.$einpost-&gt;id.'&#8220; hidden\/&gt;&lt;\/br&gt;&#8216;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo &#8218;Vorname: &lt;input type=&#8220;text&#8220; name=&#8220;vorname&#8220; value = &#8222;&#8218;.$einpost-&gt;vorname.'&#8220;\/&gt;&lt;\/br&gt;&#8216;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo &#8218;Nachname: &lt;input type=&#8220;text&#8220; name=&#8220;nachname&#8220; value = &#8222;&#8218;.$einpost-&gt;nachname.'&#8220;&gt;&lt;\/br&gt;&#8216;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 <\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo &#8218;&lt;input type=&#8220;submit&#8220; name = &#8222;speichern&#8220; value=&#8220;\u00c4nderungen speichern&#8220;\/&gt;&#8216;.&#8220;&lt;br&gt;&#8220;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 <strong>\u00a0} \/\/end von nicht isset<\/strong><\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo &#8222;&lt;\/div&gt;&#8220;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>echo &#8218;&lt;\/form&gt;&#8216;;<\/em><br \/>\n<em>\/\/ End Formular<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>} \/\/end foreach<\/em><\/p>\n<p>Damit verschwindet das Formular, sobald auf den &#8222;\u00c4nderungen speichern&#8220;-Button geklickt wurde.<\/p>\n<h2>Der Update wie gehabt<\/h2>\n<p>An der Update-Logik \u00e4ndert sich auch nicht das Geringste, die \u00fcbernehmen wie 1:1.<\/p>\n<h2>Zur\u00fcck zur Adressenliste<\/h2>\n<p>Jetzt fehlt noch ein Link zur\u00fcck zur Adressenliste, und auch das mach ich kurz und schmerzlos mit der URL der ersten Seite des Plugins:<\/p>\n<p><em>echo &#8222;&lt;a href = &#8218;http:\/\/localhost\/turnverein\/wp-admin\/admin.php?page=adressen-tabelle&#8217;\/&gt;&lt;h1&gt;Zur\u00fcck zur Adressenliste&lt;\/h1&gt;&lt;\/a&gt;&#8220;;<\/em><\/p>\n<p>Sie m\u00fcssen hier nat\u00fcrlich ihre eigene URL einsetzen, aber das sollte ja nun wirklich kein Problem sein. Funktionierts? Nach dem Klick auf\u00a0 &#8222;<em>Zur\u00fcck zur Adressenliste<\/em>&#8220; sollte jetzt nat\u00fcrlich wieder unsere Adressentabelle auftauchen, mit den eben gemachten \u00c4nderungen.<\/p>\n<h2>Funktioniert &#8211; aber wie sieht denn das aus? Nacktes PHP!<\/h2>\n<p>Gemach, gemach, hier ging es um die Funktionalit\u00e4t. Zugegeben, besonders sch\u00f6n ist das nicht mit dem &#8222;weissen&#8220; Unterformular ohne die gewohnte WordPress-Umgebung, aber das zu \u00e4ndern ist nicht wirklich einfach, da bin ich noch am Forschen. Die L\u00f6sung k\u00f6nnte evtl. in <a href=\"https:\/\/wpshout.com\/make-wordpress-admin-options-page-without-using-settings-api\/\">diesem Artikel <\/a>stecken oder auch <a href=\"http:\/\/stackoverflow.com\/questions\/3902760\/how-do-you-add-a-wordpress-admin-page-without-adding-it-to-the-menu\">hier<\/a>, aber da bin ich noch nicht ganz durch. Ich halte euch auf dem Laufenden, wenn da mal eine L\u00f6sung in Sicht kommt.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wo ist unser wpdb-Objekt geblieben? In unserer &#8222;nackten&#8220; PHP-Datei steht es n\u00e4mlich erstmal nicht zur Verf\u00fcgung. Um jetzt aber trotzdem ranzukommen &#8211; wir wollen ja schlie\u00dflich wieder mit $wpdb-&gt;get_results und all den praktischen Helferlein arbeiten &#8211; gibt es eine einfache, wenn auch unter WordPress-Puristen umstrittene Methode. Man holt sich mithilfe einer require()-Anweisung die Datei wp-load.php [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[20,21,11,7,4,8,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/465"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=465"}],"version-history":[{"count":5,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/465\/revisions"}],"predecessor-version":[{"id":470,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/465\/revisions\/470"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}