{"id":1205,"date":"2018-06-02T13:48:04","date_gmt":"2018-06-02T11:48:04","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1205"},"modified":"2018-06-19T16:53:19","modified_gmt":"2018-06-19T14:53:19","slug":"alternative-zum-besucherzaehler","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/06\/02\/alternative-zum-besucherzaehler\/","title":{"rendered":"Alternative zum Besucherz\u00e4hler: der Rezeptecounter"},"content":{"rendered":"<p>Tscha, der nette kleine Visitor Counter auf meinen Webseiten musste leider weg, weil der die IP-Adressen der Besucher bunkert, und das ist nach der neuen Datenschutz-Verordnung nicht mehr erlaubt, IP-Adressen z\u00e4hlen als schutzw\u00fcrdige pers\u00f6nliche Daten und d\u00fcrfen nicht mehr ungecrypted gespeichert werden. Mich interessiert aber trotzdem, was die Besucher auf meinen Seiten anzieht, und ich hab mir f\u00fcrs Inselfisch-Kochbuch eine &#8222;kleine&#8220; Alternative gebastelt.<\/p>\n<h2>Rezeptecounter ganz minimalistisch<\/h2>\n<p>Eigentlich ist es f\u00fcr mich am Interessantesten, welche Rezepte am \u00f6ftesten aufgerufen werden, die Aufrufe der wenigen statischen Seiten interessieren mich eher weniger. Das k\u00f6nnte ich mir zwar aus den Logfiles meines Providers herausfieseln, aber der Aufwand ist doch relativ hoch. Das geht auch einfacher, dachte ich mir, da klemme ich eine kleine PHP-Funktion ans Ende jedes Rezeptes und schreibe mir die Aufrufe in eine eigene Tabelle. Damit habe ich eine prima kleine Rezepte-Hitparade und kann z.B. die 10 beliebtesten Rezepte ausgeben oder sonstwas damit anstellen.<\/p>\n<p>Damit kann ich in der single.php ansetzen und mir da einen kleinen Z\u00e4hler einbauen, der mir in die Datenbank bunkert wie oft das jeweilige Rezept schon aufgerufen wurde. Die Funktion kommt in einen Shortcode, und der wiederum kommt in ein Plugin, der Plugin-Aufruf kommt ins Child-Theme in die single.php nach dem Content.<\/p>\n<h2>Die Tabelle counter<\/h2>\n<p>ist ganz einfach strukturiert:<\/p>\n<div id=\"attachment_1206\" style=\"width: 532px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1206\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1206\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/tabelle_counter.jpg\" alt=\"tabelle_counter\" width=\"522\" height=\"174\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/tabelle_counter.jpg 522w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/tabelle_counter-300x100.jpg 300w\" sizes=\"(max-width: 522px) 100vw, 522px\" \/><p id=\"caption-attachment-1206\" class=\"wp-caption-text\">tabelle_counter<\/p><\/div>\n<p>Eine Autowert-ID, und drei Felder f\u00fcr Rezept-ID, Titel und der Z\u00e4hler f\u00fcr die Aufrufe, das wars schon.<\/p>\n<h2>Die Funktionalit\u00e4t des Shortcodes<\/h2>\n<p>&#8230; ist auch nicht weiter kompliziert. Ich hole mir ID und Titel des aktuellen Rezeptes ab und gehe mit der ID auf die Tabelle counter. Falls die ID da noch nicht vorhanden ist, mache ich einen Insert, falls sie schon da ist, setze ich den Z\u00e4hler um eins hoch und mache einen Update. Das wars schon!<\/p>\n<pre>function el_rezeptcounter() {\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 if(is_single()) {\r\n\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/id und titel abholen\r\n\u00a0\u00a0 \u00a0\u00a0 global $wpdb;\r\n\u00a0\u00a0 \u00a0\u00a0 $akt_id = get_the_id();\r\n\u00a0\u00a0 \u00a0\u00a0 $akt_titel = get_the_title();\r\n\u00a0\u00a0 \u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0 \/\/Bisherige Anzahl holen\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $alleposts = $wpdb-&gt;get_results( \"SELECT * from counter where rezeptid = \".$akt_id.\"\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$anzahl = $wpdb-&gt;num_rows;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$zaehler = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0foreach($alleposts as $einpost){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$zaehler = $einpost-&gt;zaehler;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo \"Dieses Rezept wurde bisher \".$zaehler.\" mal aufgerufen\";\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if($anzahl == 0){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Neuen Aufruf eintragen\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$wpdb-&gt;insert('counter', array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'rezeptid' =&gt; $akt_id,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Sonderbehandlung f\u00fcr - und \" usw.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'titel' =&gt; html_entity_decode($akt_titel),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0'zaehler' =&gt; 1\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Z\u00e4hler updaten\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$zaehler = $zaehler +1;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$wpdb-&gt;update( \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0'counter', \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0array( \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0'zaehler' =&gt; $zaehler\u00a0 \/\/ int\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0 ), \r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0array( 'rezeptid' =&gt; $akt_id )\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0 } \/\/End von if( is_single)\r\n\u00a0 \r\n}\r\nadd_shortcode ('counter', 'el_rezeptcounter');<\/pre>\n<p>Dabei kann man sich \u00fcberlegen, ob man bei der Ausgabe der bereits erfolgten Aufrufe bei 0 oder bei 1 das z\u00e4hlen anf\u00e4ngt, das ist Geschmackssache. Korrekter ist es wahrscheinlich, mit dem aktuell erfolgten Aufruf bei 1 anzufangen, Dann s\u00e4he die Zeile mit dem Z\u00e4hler f\u00fcr die Ausgabe so aus:<\/p>\n<pre>if ($o_zaehler == ''){$zahl = 1;}else{$zahl = $o_zaehler+1;}<\/pre>\n<p>Den html_entity_decode($akt_titel) brauchts, weil ich in meinen Titeln auch mal Zeichen wie &#8211; oder &#8220; verwende, damit das in der Datenbank sauber ankommt.<\/p>\n<h2>Der Aufruf des Shortcodes in der single.php<\/h2>\n<p>&#8230; wird nach Wunsch vor oder nach dem Content platziert:<\/p>\n<pre>       &lt;!--Shortcode f\u00fcr den Rezepte-Counter--&gt;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 &lt;?php echo do_shortcode(\"[counter]\"); ?&gt;<\/pre>\n<p>Und so sieht die Ausgabe aus:<\/p>\n<div id=\"attachment_1212\" style=\"width: 742px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1212\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1212\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/4malaufgerufen.jpg\" alt=\"4malaufgerufen\" width=\"732\" height=\"475\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/4malaufgerufen.jpg 732w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/4malaufgerufen-300x195.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/4malaufgerufen-624x405.jpg 624w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><p id=\"caption-attachment-1212\" class=\"wp-caption-text\">4malaufgerufen<\/p><\/div>\n<h2><span style=\"color: #ff00ff;\">Update und Tipp:<\/span><\/h2>\n<p>Man kann die Counter-Funktionalit\u00e4t statt in einen Shortcode auch in einen Filter packen. Ich bin zwar mit komplexen Filtern in WordPress schon manchmal auf die Nase gefallen, aber hier scheint es stabil zu funktionieren. Der Code bleibt gleich, nur setze ich dann den Filter auf the_content:<\/p>\n<pre>function el_rezeptcounter($content) {\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 if(is_single()) {\r\n\u00a0 ...\r\n  ...(Hier kommt der Code wie oben)\r\n\u00a0 ...\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 .\r\n\u00a0 } \/\/End von if( is_single)\r\n\u00a0 <span style=\"color: #ff00ff;\">return $content<\/span>;\r\n}\r\nadd_filter( 'the_content', 'el_rezeptcounter' );<\/pre>\n<p>Damit kann man sich den Umbau der single.php sparen.<\/p>\n<h2>Die Counter-Tabelle<\/h2>\n<p>Die Tabelle counter ist sehr \u00fcbersichtlich, man kann sie sich gleich mal nach dem Z\u00e4hler sortieren und sieht sofort, welche Rezepte die meisten Aufrufe haben.<\/p>\n<div id=\"attachment_1208\" style=\"width: 701px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1208\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1208\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/counter_mit_eintraegen.jpg\" alt=\"counter_mit_eintraegen\" width=\"691\" height=\"537\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/counter_mit_eintraegen.jpg 691w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/counter_mit_eintraegen-300x233.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/counter_mit_eintraegen-624x485.jpg 624w\" sizes=\"(max-width: 691px) 100vw, 691px\" \/><p id=\"caption-attachment-1208\" class=\"wp-caption-text\">counter_mit_eintraegen<\/p><\/div>\n<p>Das kann man nat\u00fcrlich h\u00fcbsch f\u00fcr eine Ausgabe z.B. als Rezept-Hitparade verwenden, daf\u00fcr basteln wir uns:<\/p>\n<h2>Den Hitparaden-Shortcode<\/h2>\n<p>kann man sich selber dahin platzieren wo man ihn am liebsten hat, die Konstruktion ist denkbar einfach:<\/p>\n<pre>function el_rezepthitparade(){\r\n\u00a0\u00a0 \u00a0global $wpdb;\r\n\u00a0\u00a0 \u00a0echo \"&lt;h2&gt;Die beliebtesten Rezepte&lt;\/h2&gt;\";\r\n\u00a0\u00a0 \u00a0$alleposts = $wpdb-&gt;get_results( \"SELECT * FROM counter ORDER BY zaehler DESC\");\r\n\u00a0\u00a0 \u00a0foreach ($alleposts as $einpost){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo $einpost-&gt;titel.\" (\".$einpost-&gt;zaehler.\")&lt;br&gt;\";\r\n\u00a0\u00a0 \u00a0}\r\n}\r\nadd_shortcode('hitparade','el_rezepthitparade');<\/pre>\n<p>Ausgabe:<\/p>\n<div id=\"attachment_1209\" style=\"width: 522px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1209\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1209\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/diebeliebtestenzezepte.jpg\" alt=\"diebeliebtestenzezepte\" width=\"512\" height=\"267\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/diebeliebtestenzezepte.jpg 512w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/diebeliebtestenzezepte-300x156.jpg 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><p id=\"caption-attachment-1209\" class=\"wp-caption-text\">diebeliebtestenzezepte<\/p><\/div>\n<p>Man kann jetzt noch die Anzahl der ausgegebenen Zeilen mit einem LIMIT steuern, aber man kann auch noch ganz was anderes machen, n\u00e4mlich das Ganze in ein Widget packen und die Anzahl der auszugebenden Zeilen als Benutzereingabe abfragen. Aber das ist dann doch recht aufwendig, ich nehme hier mal lieber eine kleine L\u00f6sung:<\/p>\n<h2>Shortcode in Text-Widget packen<\/h2>\n<p>Daf\u00fcr zieht man sich einfach ein Text-Widget an die passende Stelle und gibt hier nur den Shortcode ein, z.B. <h2>Die beliebtesten Beitr\u00e4ge<\/h2><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/09\/29\/ein-kleiner-chat-in-php-wieder-mal-was-fuer-minimalisten\/'>Ein kleiner Chat in PHP &#8211; wieder mal was f\u00fcr Minimalisten<\/a> (7530)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/08\/21\/kraut-und-rueben-auf-der-datenbank-wo-woocommerce-die-produktdaten-speichert\/'>Kraut und R\u00fcben auf der Datenbank: wo wooCommerce die Produktdaten speichert<\/a> (4686)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/06\/25\/kontrastfarbe-automatisch-berechnen-mit-jqueryjavascript\/'>Kontrastfarbe automatisch berechnen mit jquery\/Javascript<\/a> (4591)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/08\/31\/noch-mehr-postmeta-benutzerdefinierte-felder-in-woocommerce\/'>Noch mehr postmeta: benutzerdefinierte Felder in wooCommerce<\/a> (4536)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/05\/06\/schmankerl-fuer-alte-datenbanker-zugriff-auf-externe-daten-mit-dem-wpdb-objekt\/'>Schmankerl f\u00fcr alte Datenbanker: Zugriff auf externe Daten mit dem wpdb-Objekt<\/a> (4383)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/03\/30\/joomla-template-2-die-index-php\/'>Joomla-Template 2: die index.php<\/a> (4346)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/07\/05\/alphabetische-paginierung-aus-array-die-tuecken-des-php-sort\/'>Alphabetische Paginierung aus Array: die T\u00fccken des PHP-sort()<\/a> (3768)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/03\/30\/ein-einfaches-joomla-template-erstellen\/'>Ein einfaches Joomla-Template erstellen<\/a> (3045)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/05\/04\/html5-datalist-value-ganz-so-einfach-ist-es-nicht\/'>HTML5 Datalist Value &#8211; ganz so einfach ist es nicht<\/a> (3016)<br><a href = 'https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/06\/21\/php-5-6-forever\/'>PHP 5.6 forever?<\/a> (2999)<br>. Wenn das nicht funktioniert, sind die Shortcodes f\u00fcr Textwidgets noch nicht enabled, das geht aber mit einer Zeile im Plugin oder in der functions.php des Child-Themes:<\/p>\n<pre>add_filter('widget_text', 'do_shortcode');<\/pre>\n<p>Das sollte es gewesen sein. Wir h\u00fcbschen die Ausgabe noch mit Links zu den Rezepten auf, das ist auch nicht weiter schwierig, wir haben ja die IDs und packen das mit in den foreach:<\/p>\n<pre>foreach ($alleposts as $einpost){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$pfad = get_the_permalink($einpost-&gt;rezeptid);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo \"&lt;a href = '\".$pfad.\"'&gt;\".$einpost-&gt;titel.\"&lt;\/a&gt; (\".$einpost-&gt;zaehler.\")&lt;br&gt;\";\r\n\u00a0\u00a0 \u00a0}<\/pre>\n<p>Jetzt ist es aber sch\u00f6n genug!<\/p>\n<div id=\"attachment_1214\" style=\"width: 1003px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1214\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1214\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wirgetmit_links.jpg\" alt=\"widgetmit_links\" width=\"993\" height=\"489\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wirgetmit_links.jpg 993w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wirgetmit_links-300x148.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wirgetmit_links-768x378.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wirgetmit_links-624x307.jpg 624w\" sizes=\"(max-width: 993px) 100vw, 993px\" \/><p id=\"caption-attachment-1214\" class=\"wp-caption-text\">widgetmit_links<\/p><\/div>\n<h2>Nachschlag f\u00fcr WordPress-Puristen<\/h2>\n<p>Ich bin darauf hingewiesen worden, dass man die Anzahlen der Rezeptaufrufe auch in der wp_options speichern k\u00f6nnte, das w\u00e4re die sauberere L\u00f6sung. Ja bittesehr, kann man, ist nicht besonders schwierig. Man muss sich halt \u00fcberlegen, wie man die Options benennt, damit man sie nachher auch auswerten kann. Ich hab da mal einen Versuch gemacht und die Optionsnamen nach dem Muster zaehler_[beitragsid] zusammengeschraubt. D:ie Funktion zum Wegschreiben ist recht \u00fcbersichtlich geworden:<\/p>\n<pre>function el_rezeptcounter() {\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 if(is_single()) {\r\n\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/id und titel abholen\r\n\u00a0\u00a0 \u00a0\u00a0 $akt_id = get_the_id();\r\n\u00a0\u00a0 \u00a0\u00a0 $akt_titel = get_the_title();\r\n\u00a0\u00a0 \u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0 \/\/option nachschauen\r\n\u00a0\u00a0 \u00a0\u00a0 $o_zaehler = get_option('zaehler_'.$akt_id.'');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if ($o_zaehler == ''){$zahl = 0;}else{$zahl = $o_zaehler;}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0echo \"Dieses Rezept wurde bisher \".$zahl.\" mal aufgerufen\";\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if($o_zaehler == ''){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0update_option('zaehler_'.$akt_id, 1);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}else{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Z\u00e4hler updaten\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$o_zaehler = $o_zaehler +1;\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0update_option('zaehler_'.$akt_id, $o_zaehler);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0 } \/\/End von if( is_single)\r\n\u00a0 \r\n}<\/pre>\n<p>Man kann hier ohne Gefahr update_option() verwenden, da es eine Option einfach neu anlegt, falls sie noch nicht vorhanden sein sollte. Das funktioniert soweit ganz gut und hat hier zum Testen etliche Eintr\u00e4ge korrekt in meiner wp_options hinterlassen:<\/p>\n<div id=\"attachment_1217\" style=\"width: 944px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1217\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1217\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wp_options.jpg\" alt=\"wp_options\" width=\"934\" height=\"156\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wp_options.jpg 934w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wp_options-300x50.jpg 300w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wp_options-768x128.jpg 768w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/wp_options-624x104.jpg 624w\" sizes=\"(max-width: 934px) 100vw, 934px\" \/><p id=\"caption-attachment-1217\" class=\"wp-caption-text\">wp_options<\/p><\/div>\n<p>Eine \u00dcbersicht bek\u00e4me man im ersten Ansatz mit diesem Select heraus:<\/p>\n<pre>( \"SELECT * from wp_options where option_name like 'zaehler_%' \r\nORDER BY option_value DESC\");<\/pre>\n<p>Was mir an dieser L\u00f6sung allerdings nicht gef\u00e4llt: wie wertet man das jetzt aus und kriegt die Rezepttitel mit zu den Z\u00e4hlerst\u00e4nden? Als Optionsnamen nur die Rezept-ID allein (ohne das zaehler_ vorneweg) zu vergeben w\u00e4re ein L\u00f6sungsansatz, aber das gef\u00e4llt mir nicht so recht.<\/p>\n<p>Man k\u00f6nnte nat\u00fcrlich in den option_value ein Array mit ID, Z\u00e4hler und Titel packen und WordPress die Daten serialisieren lassen (<a href=\"http:\/\/wpengineer.com\/968\/wordpress-working-with-options\/\">hier bei wpengineer.com ein nettes Tutorial zu dem Thema<\/a>), aber das ist mir\u00a0eigentlich zu umst\u00e4ndlich, da hat man dann das G&#8217;frett damit, die Daten wieder einzeln rauszufieseln. Da bleibe ich lieber bei meinem &#8222;kurzen Dienstweg&#8220; mit der eigenen Tabelle.<\/p>\n<h2>Update<\/h2>\n<p>Ich bin gefragt worden, ob ich nicht ein Beispiel f\u00fcr das Wegschreiben der Options als Array bringen k\u00f6nnte. Ja OK, machen wir, aber dazu gibts einen neuen Beitrag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tscha, der nette kleine Visitor Counter auf meinen Webseiten musste leider weg, weil der die IP-Adressen der Besucher bunkert, und das ist nach der neuen Datenschutz-Verordnung nicht mehr erlaubt, IP-Adressen z\u00e4hlen als schutzw\u00fcrdige pers\u00f6nliche Daten und d\u00fcrfen nicht mehr ungecrypted gespeichert werden. Mich interessiert aber trotzdem, was die Besucher auf meinen Seiten anzieht, und ich [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[20,7,4,14,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1205"}],"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=1205"}],"version-history":[{"count":12,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1205\/revisions"}],"predecessor-version":[{"id":1290,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1205\/revisions\/1290"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}