{"id":1257,"date":"2018-06-10T18:04:35","date_gmt":"2018-06-10T16:04:35","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=1257"},"modified":"2018-06-24T11:07:44","modified_gmt":"2018-06-24T09:07:44","slug":"shortcodes-echo-vs-return","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2018\/06\/10\/shortcodes-echo-vs-return\/","title":{"rendered":"Shortcodes: echo vs. return"},"content":{"rendered":"<p>Ich arbeite ja gern mit Shortcodes und packe da auch oft komplexere Funktionalit\u00e4ten rein, weil sie so praktisch sind. Wenn man allerdings Shortcodes in Beitr\u00e4ge einbinden will, die auch noch Text enthalten, muss man ein bisschen aufpassen mit den Ausgaben, wo man echo und wo man return verwendet, sonst kann es zu unerw\u00fcnschten Effekten kommen. Ich mach mal ein einfaches Beispiel.<\/p>\n<p>Simpler Shortcode mit return:<\/p>\n<pre>function el_harmlosertext(){\r\n\u00a0\u00a0 \u00a0return \"&lt;strong&gt;Ich bin ein komplett harmloser ShortcodeText&lt;\/strong&gt;\";\r\n}\r\nadd_shortcode('harmlos','el_harmlosertext');<\/pre>\n<p>Den kann man im Fliesstext platzieren wo man will, er wird an der richtigen Stelle ausgef\u00fchrt. Im Editor sieht das so aus:<\/p>\n<div id=\"attachment_1258\" style=\"width: 571px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1258\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1258\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/editor.jpg\" alt=\"editor\" width=\"561\" height=\"509\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/editor.jpg 561w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/editor-300x272.jpg 300w\" sizes=\"(max-width: 561px) 100vw, 561px\" \/><p id=\"caption-attachment-1258\" class=\"wp-caption-text\">editor<\/p><\/div>\n<p>Das erzeugt diese Bildschirmausgabe:<\/p>\n<div id=\"attachment_1259\" style=\"width: 603px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1259\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1259\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/bildschirm.jpg\" alt=\"bildschirm\" width=\"593\" height=\"432\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/bildschirm.jpg 593w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/bildschirm-300x219.jpg 300w\" sizes=\"(max-width: 593px) 100vw, 593px\" \/><p id=\"caption-attachment-1259\" class=\"wp-caption-text\">bildschirm<\/p><\/div>\n<p>\u00c4ndert man jedoch den Shortcode und macht aus dem return ein echo, funktioniert das nicht mehr, die Ausgabe erfolgt vor dem Fliesstext des Artikels.<\/p>\n<div id=\"attachment_1260\" style=\"width: 520px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1260\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1260\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/vor_fliesstext.jpg\" alt=\"vor_fliesstext\" width=\"510\" height=\"383\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/vor_fliesstext.jpg 510w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/vor_fliesstext-300x225.jpg 300w\" sizes=\"(max-width: 510px) 100vw, 510px\" \/><p id=\"caption-attachment-1260\" class=\"wp-caption-text\">vor_fliesstext<\/p><\/div>\n<p>Das ist etwas irritierend, und komplett l\u00e4stig wird es, wenn man zum Beispiel die Ergebnisse einer Datenbankabfrage ausgeben m\u00f6chte, die nicht so ohne weiteres in ein return-Statement zu packen sind. Ich stricke mal eine kurze Liste aller bisher ver\u00f6ffentlichten Posts, und m\u00f6chte diese am Ende meines Beitrags ausgeben. Der Shortcode sieht erstmal so aus:<\/p>\n<pre>function el_mit_datenbankabfrage(){\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0 global $wpdb;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Bisherige Anzahl posts holen\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $alleposts = $wpdb-&gt;get_results( \"SELECT * from wp_posts where post_status like 'publish'\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $anzahl = $wpdb-&gt;num_rows;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echo $anzahl.\" Datens\u00e4tze gefunden und mit echo ausgegeben&lt;br&gt;\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $ausgabe = array();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$i=0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach($alleposts as $einpost){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #ff0000;\">echo<\/span> $einpost-&gt;post_title.\"&lt;br&gt;\";\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \r\n}\r\nadd_shortcode('db_abfrage','el_mit_datenbankabfrage');<\/pre>\n<p>Hier kann man das echo nicht einfach mit einem return ersetzen, weil sonst der foreach nach dem ersten Durchgang abbricht. So lassen kann man es aber auch nicht, weil die Liste so wie der Shortcode jetzt aussieht immer vor dem Fliesstext des Artikels ausgegeben wird:<\/p>\n<div id=\"attachment_1261\" style=\"width: 544px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1261\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1261\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/echo_vor_text.jpg\" alt=\"echo_vor_text\" width=\"534\" height=\"486\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/echo_vor_text.jpg 534w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/echo_vor_text-300x273.jpg 300w\" sizes=\"(max-width: 534px) 100vw, 534px\" \/><p id=\"caption-attachment-1261\" class=\"wp-caption-text\">echo_vor_text<\/p><\/div>\n<p>Abhilfe: wir packen die Ausgaben des foreach in einen String und verketten den innerhalb der Schleife. Die Funktion des Shortcodes wird wie folgt ge\u00e4ndert:<\/p>\n<pre>function el_mit_datenbankabfrage(){\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0 global $wpdb;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Bisherige Anzahl posts holen\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $alleposts = $wpdb-&gt;get_results( \"SELECT * from wp_posts where post_status like 'publish'\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $anzahl = $wpdb-&gt;num_rows;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 echo $anzahl.\" Datens\u00e4tze gefunden und mit echo ausgegeben&lt;br&gt;\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #ff0000;\">$ausgabe = \"\";<\/span>\r\n<span style=\"color: #ff0000;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 <\/span>\r\n<span style=\"color: #ff0000;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach($alleposts as $einpost){<\/span>\r\n<span style=\"color: #ff0000;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  \u00a0$ausgabe=$ausgabe.$einpost-&gt;post_title.\"&lt;br&gt;\";<\/span>\r\n<span style=\"color: #ff0000;\">\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<\/span>\r\n<span style=\"color: #ff0000;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span>\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0return \"Mit return ausgegeben:&lt;br&gt;\".$ausgabe;\r\n}<\/pre>\n<p>Diesen String gebe ich dann mit dem return der Shortcode-Funktion zur\u00fcck, und meine Liste wird brav ans Ende des Beitrags gestellt, da wo ich sie auch haben will.<\/p>\n<div id=\"attachment_1262\" style=\"width: 583px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1262\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1262\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/return.jpg\" alt=\"return\" width=\"573\" height=\"504\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/return.jpg 573w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/return-300x264.jpg 300w\" sizes=\"(max-width: 573px) 100vw, 573px\" \/><p id=\"caption-attachment-1262\" class=\"wp-caption-text\">return<\/p><\/div>\n<p>Ich k\u00f6nnte die Ausgabe auch mitten im Text platzieren, funktioniert auch. Man sieht hier auch noch, dass die mit echo ausgegebene Anzahl der Datens\u00e4tze gnadenlos vor dem Beitragstext landet:<\/p>\n<div id=\"attachment_1263\" style=\"width: 565px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-1263\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-1263\" src=\"http:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/mitten_im_text.jpg\" alt=\"mitten_im_text\" width=\"555\" height=\"495\" srcset=\"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/mitten_im_text.jpg 555w, https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-content\/uploads\/2018\/06\/mitten_im_text-300x268.jpg 300w\" sizes=\"(max-width: 555px) 100vw, 555px\" \/><p id=\"caption-attachment-1263\" class=\"wp-caption-text\">mitten_im_text<\/p><\/div>\n<p>Das ist alles nat\u00fcrlich nur relevant, wenn man den Shortcode auf einer Seite oder auf einem Beitrag platzieren m\u00f6chte, die sonst auch noch Text enthalten, bei sonst leeren Posts\/Pages ist es egal. Wissen muss man halt, dass return und echo hier v\u00f6llig unterschiedliche Effekte in der Ausgabe erzielen, dann kann man auch gegensteuern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich arbeite ja gern mit Shortcodes und packe da auch oft komplexere Funktionalit\u00e4ten rein, weil sie so praktisch sind. Wenn man allerdings Shortcodes in Beitr\u00e4ge einbinden will, die auch noch Text enthalten, muss man ein bisschen aufpassen mit den Ausgaben, wo man echo und wo man return verwendet, sonst kann es zu unerw\u00fcnschten Effekten kommen. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,14],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1257"}],"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=1257"}],"version-history":[{"count":5,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1257\/revisions"}],"predecessor-version":[{"id":1312,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/1257\/revisions\/1312"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=1257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=1257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=1257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}