Support » Allgemeine Fragen » SQL Befehl zum Ersetzen in der DB

  • Gelöst michaelxxx

    (@michaelxxx)


    Ich bräuchte mal Eure Hilfe. Gibt es MySQL Spezialisten unter Euch? 🙂

    Ich habe in WordPress in meinen Beiträgen für meine Überschriften auf Grund des Themes bisher einen Shotcode genutzt:
    [x_custom_headline type="left" level="h2" looks_like="h3"]Hier steht eine Überschrift[/x_custom_headline]

    Das ist natlich völlig überflüssig und ich möchte es gerne durch ein simples h2 ersetzen:
    <h2>Hier steht eine Überschrift</h2>

    Jetzt habe ich über 1.000 Beiträge in meinem Blog und das alles händisch anzupassen dauert Wochen.

    Daher suche ich nach einer Möglichkeit, dass per MySQL direkt in der Datenbank zu ändern. Generell habe ich dafür auch schon den passenden SQL Befehl gefunden:

    UPDATE wp_posts
        SET post_content = REPLACE(
          REPLACE(post_content, '[x_custom_headline type="left" level="h2" looks_like="h3"]', '<h2>'),
          '[/x_custom_headline]','</h2>')
    WHERE post_content LIKE '%[/x_custom_headline]%';

    Das klappt auch soweit. Das Problem dabei: ich habe 2 verschiedene Headlines:

    [x_custom_headline type=“left“ level=“h2″ looks_like=“h3″]Hier steht eine Überschrift[/x_custom_headline]
    [x_custom_headline type=“left“ level=“h3″ looks_like=“h7″]Hier steht eine Überschrift[/x_custom_headline]

    Die erste Überschrift müsste mit <h2>…</h2> und die zweite mit <h3>…</h3> ersetzt werden.

    Mit der aktuellen Abfrage wird der vordere Teil der 2. Headline ([x_custom_headline type=“left“ level=“h3″ looks_like=“h7″]) nicht ersetzt, aber der hintere Teil [/x_custom_headline] ebenfalls durch ein <h2>, was an der Stelle dann falsch ist. Hier müsste ja ein <h3> stehen.

    Kann man die Anfrage so erweiteren, dass man diese Logik noch mit aufnimmt?

    Ich hatte mal versucht die Anfrage so umzubauen, dass er nur die Zeilen mit dem looks_like=“h3″ ersetzt:

    UPDATE wp_posts
        SET post_content = REPLACE(
          REPLACE(post_content, '[x_custom_headline type="left" level="h2" looks_like="h3"]', '<h2>'),
          '[/x_custom_headline]','</h2>')
    WHERE post_content LIKE '%[x_custom_headline type="left" level="h2" looks_like="h3"]%';

    …aber auch das ersetzt mir immer das [/x_custom_headline] zu <h2>, auch bei der looks_like=“h7″ Zeile.

    Ich dachte durch die WHERE Bedingung ist das Begrenzt auf alle Datensätze, die mit [x_custom_headline type=“left“ level=“h2″ looks_like=“h3″] beginnen. Aber da hab ich von der SQL Logik wohl noch einen Denkfehler…

    Kann da jemand helfen?

    • Dieses Thema wurde geändert vor 2 Jahren, 1 Monat von michaelxxx.
    • Dieses Thema wurde geändert vor 2 Jahren, 1 Monat von michaelxxx.

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

Ansicht von 10 Antworten - 1 bis 10 (von insgesamt 10)
  • Warum verwendest du nicht (nach einem Backup der Datenbank) das Plugin Better Search Replace?

    Moderator Michi91

    (@michi91)

    Sicher gibt’s jemanden hier der fließend SQL spricht, ich selber muss auch immer Googlen.. Aber rein optisch sieht das für mich schon irgendwie komisch aus… Ein replace in einem weiteren replace verschachtelt?! Sieht für mich nicht richtig aus.

    Versuch doch einfach zwei SQL Befehle? Im ersten ersetzt du nur das closing tag und danach dann das shortcode open Tag 🙂

    Thread-Starter michaelxxx

    (@michaelxxx)

    @pixolin Das hatte ich mir schon angeschaut. Da kann man meines Wissens nach aber nur Teile ersetzen (wie z.B. die URL) oder ich könnte generell [x_custom_headline type=“left“ level=“h2″ looks_like=“h3″] gegen <h2> austauschen.

    Das Problem ist das [/x_custom_headline].

    Das muss ja einmal </h2> und einmal </h3> sein, je nachdem, ob vorne looks_like=“h3″ oder looks_like=“h7″ steht. Und diese Abhängigkeit geht mit dem Plugin meines Wissens nicht.

    @michi91 Daher kann ich auch nicht erst den einen Teil übersetzen, und dann den anderen. Es gibt eine Abhängigkeit vom öffnenden Tag und dem closing Tag.

    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von michaelxxx.
    Moderator Michi91

    (@michi91)

    Genau deswegen sollst den closing tag zuerst ersetzen 🙂 die abhängigkeit/condition ist zu dem Zeitpunkt noch vorhanden.

    dann ist der open Tag ja noch vorhanden und du kannst mit dem zweiten Befehl diesen auch noch entfernen

    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von Michi91.
    Thread-Starter michaelxxx

    (@michaelxxx)

    Genau deswegen sollst den closing tag zuerst ersetzen

    Wie würde Deiner Meinung nach der SQL Befehl lauten, wenn ich das [/x_custom_headline] ersetzen möchte zu <h3>, mit der Abhängigkeit, „nur in der Zeile ersetzen, wo vorne ein looks_like=“h7″ vorkommt?

    Ich habs mal so versucht:

    UPDATE wp_posts
        SET post_content = REPLACE (post_content, '[/x_custom_headline]', '</h2>')
    WHERE post_content LIKE '[x_custom_headline type="left" level="h2" looks_like="h3"]%[/x_custom_headline]';

    Aber das ist nicht richtig. Da ersetzt er alle [/x_custom_headline].

    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von michaelxxx.
    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von michaelxxx.
    Moderator Michi91

    (@michi91)

    Eigentlich dachte ich so:

    UPDATE wp_posts
        SET post_content = REPLACE (post_content, '[/x_custom_headline]', '</h2>')
    WHERE post_content LIKE '%[x_custom_headline type="left" level="h2" looks_like="h3"]%';
    UPDATE wp_posts
        SET post_content = REPLACE (post_content, '[/x_custom_headline]', '</h3>')
    WHERE post_content LIKE '%[x_custom_headline type="left" level="h3" looks_like="h7"]%';

    Und Zack!! Stimmt das wird so nicht funktionieren… Ich sehe jetzt den Fehler… Der where clause ist ja vollkommen unabhängig von dem replace…

    Wenn dein post content nun mehrfach das shortcode enthält, wird die where condition immer greifen… MIST!

    Du wirst die Ersetzung per RegEx machen müssen… Es gibt so so ein anderes deutschsprachiges wordpress forum, da gibt’s einige RegEx Experten… Die können sicher helfen.

    Bisher dachte ich immer, in diesem Forum geht es um WordPress und nicht um SQL-Befehle. 😀

    Du könntest auch die Tabelle exportieren, die Daten mit einem Editor korrigieren und dann wieder importieren.

    • Diese Antwort wurde geändert vor 2 Jahren, 1 Monat von bscu.
    Thread-Starter michaelxxx

    (@michaelxxx)

    @bscu Um einen SQL Befehl in der WordPress Datenbank 😉
    Aber wenn das Thema nicht hier herein passt, bitte einfach löschen.

    Um einen SQL Befehl in der WordPress Datenbank

    Trotzdem nicht unser Thema hier und in einem SQL-Forum besser aufgehoben.

    Aber wenn das Thema nicht hier herein passt, bitte einfach löschen.

    Wir löschen nur bei groben Verstößen gegen die Forenregeln. Eher schließen wir Thread oder markieren sie (wie in diesem Fall) als „keine Support-Frage“.

    Mit dem Kommandozeilen-Tool WP-CLI ist auch eine Ersetzung in der Datenbank mit Hilfe von Regular Expressions möglich. (Beispiel unter https://developer.wordpress.org/cli/commands/search-replace/#examples)

    Thread-Starter michaelxxx

    (@michaelxxx)

    Vielen Dank für die Kommentare und Hilfe.

Ansicht von 10 Antworten - 1 bis 10 (von insgesamt 10)
  • Das Thema „SQL Befehl zum Ersetzen in der DB“ ist für neue Antworten geschlossen.