Support » Allgemeine Fragen » Selbstständiges Verschieben von Shortcodes

  • Gelöst trackersb

    (@trackersb)


    Seitdem ich auf WordPress 5 geupdated habe, verändert der Editor in WordPress (Modus Code), sobald ich auf „Aktualisieren“ klicke, meinen Code, indem er Shortcodes in eckigen Klammern aus allen im Editor angezeigten Tags herausschiebt.
    Das zeigt sich z.B. bei folgendem Snippet, das sich auf meiner Hauptseite musikschule-freilassing.de wiederfindet.

    <h2>Termine und Veranstaltungen</h2>
    <table>
    <thead>
    <tr>
    <th>Veranstaltung</th>
    <th>Zeit</th>
    <th>Ort</th>
    <th>Adresse</th>
    </tr>
    </thead>
    <tbody>
    [php_everywhere instance="1"]
    [php_everywhere instance="2"]
    [php_everywhere instance="3"]
    [php_everywhere instance="4"]
    </tbody>
    </table>

    Wenn ich hier also auf „Aktualisieren“ klicke, sieht der Quelltext dann so aus:

    <h2>Termine und Veranstaltungen</h2>
    
    [php_everywhere instance="1"]
    [php_everywhere instance="2"]
    [php_everywhere instance="3"]
    [php_everywhere instance="4"]
    <table>
    <thead>
    <tr>
    <th>Veranstaltung</th>
    <th>Zeit</th>
    <th>Ort</th>
    <th>Adresse</th>
    </tr>
    </thead>
    <tbody></tbody>
    </table>

    Erst in dieser veränderten Form speichert und veröffentlicht WordPress die Datei.
    Es liegt auch nicht am Plugin. Diesen Effekt sehe ich auch bei anderen Shortcodes.

    Wie kann ich verhindern, dass WordPress diese Veränderung durchführt?

    Die Seite, für die ich Hilfe brauche: [Anmelden, um den Link zu sehen]

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 15)
  • Du verwendest nicht den neuen Block-Editor?

    Zumindest nicht, dass mir das bewusst klar wäre.
    Würde die Verwendung des Block-Editors mir bzgl. dieses Problems helfen?

    so wie es sich darstellt, willst du die Shortcodes NACH der Tabelle einsetzen, und beim Abspeichern werden sie VOR die Tabelle gesetzt. Das macht keinen Sinn, was dagegen tun, keine Ahnung.

    Beim Block Editor hast du für jeden Absatz einen neuen Block. Titelblock, Textblock, Bildblock, Shortcodeblock…

    Die Tabelle hast im Textblock, den Shortcode darunter im Shortcodeblock. Die Blöcke sind so wie du sie anordnest. Du kannst die Blöcke beliebig rauf und runter schieben, aber du bestimmst die Reihenfolge. Der Blockeditor hat einige Vorteile, aber noch auch Nachteile. Bei zwei Seiten habe ich den Blockeditor im Einsatz, bei zwei Anderen muss ich vorerst noch beim Alten bleiben.

    Genauer gesagt will ich (wie auch im Snippet zu erkennen) die Shortcodes innerhalb des tbody-Tags haben.
    Die Tags NACH der Tabelle einzufügen geht; VOR auch. Nur eben nicht innerhalb eines Tags…
    Diese Shortcodes müssen aber da rein, da diese entsprechend dem Namen php-Code aufrufen, der den Inhalt der Tabelle generiert.

    Mein aktueller Workaround sieht so aus, dass ich die Seite in der Datenbank direkt bearbeite…
    Das ist keine dauerhafte Lösung.

    Hallo @trackersb

    <h2>Termine und Veranstaltungen</h2>
    <table>
    <thead>
    <tr>
    <th>Veranstaltung</th>
    <th>Zeit</th>
    <th>Ort</th>
    <th>Adresse</th>
    </tr>
    </thead>
    <tbody>
    [php_everywhere instance="1"]
    [php_everywhere instance="2"]
    [php_everywhere instance="3"]
    [php_everywhere instance="4"]
    </tbody>
    </table>

    Müsste korrekterweise so geschrieben werden (wieso das vor WP 5.0 funktionierte, ist mir ein Rätsel):

    <h2>Termine und Veranstaltungen</h2>
    <table>
    <thead>
    <tr>
    <th>Veranstaltung</th>
    <th>Zeit</th>
    <th>Ort</th>
    <th>Adresse</th>
    </tr>
    </thead>
    <tbody>
    <tr>
    <td>[php_everywhere instance="1"]</td>
    <td>[php_everywhere instance="2"]</td>
    <td>[php_everywhere instance="3"]</td>
    <td>[php_everywhere instance="4"]</td>
    </tr>
    </tbody>
    </table>

    In der Tat wird der Shortcode dann nicht mehr nach außen verschoben.
    Aber ich denke dennoch, dass ich fragen müsste: Wieso wird innerhalb der td-Tags akzeptiert?
    Diese php-Aufrufe generieren entweder eine Zeile samt td-Tags, sodass eben eine valide Zeile entsteht, oder nichts, sodass die Zeile nicht sichtbar ist.
    Wie könnte ich das dann geschickt machen, wenn ich gezwungen bin, die Shortcodes in fest eingebundene td-Tags eizuschließen?

    ok, da hab ich nicht genau hingesehen. Aber da hat Angelika schon recht, so wie du die Tabelle geschrieben hast ist das nix. Und da denkt WP anscheinend mit und speichert nur korrekte Tabellensyntax.

    Das <td> in der Tabelle? Warum? Korrekte Tabelle und in der DB nur die Daten die zu sehen sein sollen.

    Verstehe ich das richtig, wenn [php_everywhere instance="4"] leer ist, hast eine sichtbare Zeile die unschön ausschaut?

    Ich sehe da eigentlich nur die Möglichkeit die ganze Tabelle samt Inhalt in einer Funktion zu generieren. Da hast ja dann für die Ausgabe der Datenzeilen einen Loop der Zeile um Zeile ausgibt. Da kannst mit einem ‚IF‘ definieren, wenn die Daten leer sind, gib nix aus.

    In der Tat wird der Shortcode dann nicht mehr nach außen verschoben.
    Aber ich denke dennoch, dass ich fragen müsste: Wieso wird innerhalb der td-Tags akzeptiert?

    Eher umgekehrt, die fehlenden td-Tags werden nicht akzeptiert.

    Diese php-Aufrufe generieren entweder eine Zeile samt td-Tags, sodass eben eine valide Zeile entsteht, oder nichts, sodass die Zeile nicht sichtbar ist.
    Wie könnte ich das dann geschickt machen, wenn ich gezwungen bin, die Shortcodes in fest eingebundene td-Tags eizuschließen?

    Vielleicht postest du erst einmal den Inhalt des Shortcodes. 🙂

    Shortcodes sind Teil des Plugins php_everywhere.
    Der php-Code, der durch die Shortcodes aufgerufen wird, ist der Folgende:

    <?php
    $showInstanceTwo = time() <= strtotime("14 December 2018");
    $showInstanceThree = time() <= strtotime("21 November 2018");
    $showInstanceFour = time() <= strtotime("8 December 2018");
    
    if($instance == "1" && ! $showInstanceTwo && ! $showInstanceThree && !$showInstanceFour){
    echo '<tr><td>Aktuell sind keine Termine vorhanden.</td><td></td><td></td><td></td></tr>';
    }
    
    if($instance == "2" && $showInstanceTwo){
    echo '<tr>';
    echo '    <td>Swinging Christmas</td>';
    echo '    <td>14.12.18</td>';
    echo '    <td>Rathaussaal Freilassing</td>';
    echo '    <td><a href="https://binged.it/2EgpZPJ" target="_blank">Münchener Straße&nbsp;15, 83395&nbsp;Freilassing</a></td>';
    echo '</tr>';
    }
    
    if($instance == "3" && $showInstanceThree){
    echo '<tr>';
    echo '    <td>Vorrunde</td>';
    echo '    <td>21.11.18</td>';
    echo '    <td>Grundschule</td>';
    echo '    <td><a href="https://goo.gl/maps/pVAj4U98QCP2" target=_blank>Heiligbrunnerstraße&nbsp;3, 83435&nbsp;Bad Reichenhall</a></td>';
    echo '</tr>';
    }
    
    if($instance == "4" && $showInstanceFour){
    echo '<tr>';
    echo '    <td>Weihnachtskonzert</td>';
    echo '    <td>8.12.18, 17:00</td>';
    echo '    <td>Marienkirche Salzburghofen</td>';
    echo '    <td><a href="https://goo.gl/maps/uvBqaWazFK92" target=_blank>Pfarrweg&nbsp;2, 83395&nbsp;Freilassing</a></td>';
    echo '</tr>';
    }
    
    ?>

    Der Zweck dieses Codes ist, dass ich Zeilen in die Tabelle einfügen kann, die selbstständig wieder verschwinden.
    Jeder Shortcode ruft den obigen Quelltext auf und übergibt als Parameter $instance, sodass ich weiß, welcher Shortcode gerade einen Aufruf macht.
    Wenn also eine Instanz diesen Code aufruft (Z.B. Instanz 2), dann wird das heutige Datum mit dem dem entsprechenden Instanz-Datum (Z.B. $instanceTwo) verglichen. Wenn dieser Vergleich „true“ liefert, dann wird die entsprechende Zeile in der Tabelle erzeugt, sonst kommt einfach „“ (empty string) zurück, d.h. es kommt keine Zeile hinzu.
    Instance1 ist ein Sonderfall. Instance1 liefert genau dann eine Zeile, wenn keine andere Instanz etwas liefert, sodass in der Tabelle angezeigt wird „Aktuell sind keine Termine vorhanden.“.
    Notiz:
    Dass die Nummerierung der Instanzen nicht der Reihenfolge der Instanz-Dati entspricht, liegt daran, dass ich Instanzen vergangener Termine nicht stets entferne.

    • Diese Antwort wurde geändert vor 1 Jahr, 2 Monate von trackersb.
    Moderator espiat

    (@espiat)

    Warum erzeugst du nicht direkt in dem Shortcode deine ganze Tabelle mit <table> etc.?

    Wenn also der 15.12. war , dann wird ja nur noch der Tabellen Rahmen angezeigt, weil die Inhalte schon abgelaufen sind.

    Und der 15.12. ist auch schon übermorgen. Ich glaube es wäre einfacher da jetzt einfach eine Tabelle zu erzeugen und die Daten da einzutragen, anstatt das jetzt mit Shortcodes zu versuchen. Man muss dann auch mal den Aufwand gegen den Aufwand betrachten.

    Es wird sich vermutlich darauf hinauslaufen, dass ich die Tabelle als Ganzes erzeugen muss.
    Bei genauerer Betrachtung wirst du feststellen, dass, wenn keine Termine eingebunden werden, dann $instance == 1 zuschlägt und in die Tabelle „Aktuell sind keine Termine vorhanden.“ schreibt. Das ist also kein Problem.
    Wenn ich stattdessen die Tabelle komplett weglassen würde, dann müsste ich auch das Heading „Termine und Veranstaltungen“ weglassen, da in der section sonst nichts mehr wäre. Das finde ich aber nicht gut, da ich versuche, möglichst viel als HTML und weniger über PHP einzubinden.
    Aber ja. Es schaut danach aus, als müsste ich die Tabelle als Ganzes erzeugen, auch wenn das mit den mehreren Shortcodes recht gut funktioniert hat.

    Moderator espiat

    (@espiat)

    Das finde ich aber nicht gut, da ich versuche, möglichst viel als HTML und weniger über PHP einzubinden.

    Der Code ist schon insgesamt etwas frickelig, aber funktioniert.

    Aber ja. Es schaut danach aus, als müsste ich die Tabelle als Ganzes erzeugen, auch wenn das mit den mehreren Shortcodes recht gut funktioniert hat.

    Es geht hierbei um 3 Daten, wo 2 schon abgelaufen sind. Allein dafür ein Shortcode zu schreiben für 3 Termine ist der Aufwand nicht wert, meiner Meinung nach.

    Es geht hierbei um 3 Daten, wo 2 schon abgelaufen sind. Allein dafür ein Shortcode zu schreiben für 3 Termine ist der Aufwand nicht wert, meiner Meinung nach.

    Ist ansich richtig, aber es sind deswegen drei da, da ich schon mal drei Termine gleichzeitig anzeigen wollte, und die Shortcodes schlicht nicht entfernt habe, um sie nicht nochmal schreiben zu müssen. Ich verwende die quasi wieder. Da wäre mir der „Aufwand“ die zu löschen und bei Bedarf wieder neu einzufügen zu hoch.
    Wenn ich mehr wesentlich mehr Termine gleichzeitig anzeigen wollen würde, dann müsste ich da sowieso eine andere Strategie fahren. Das ist aber soweit absolut ausreichend.

    • Diese Antwort wurde geändert vor 1 Jahr, 2 Monate von trackersb.
    Moderator espiat

    (@espiat)

    Okay.

    Dennoch: Der Code ist frickelig. Das solltest du in Zukunft über ein Array und eine Funktion lösen. So als Lösungsvorschlag.

Ansicht von 15 Antworten - 1 bis 15 (von insgesamt 15)
  • Das Thema „Selbstständiges Verschieben von Shortcodes“ ist für neue Antworten geschlossen.