Support » Allgemeine Fragen » Einen Satz in allen Dokumenten gleichzeitig ändern, geht das?

  • Gelöst mrsjanice

    (@mrsjanice)


    Hallo in die Runde,

    ich würde gerne ein WordPress erstellen, bei dem in den einzelnen Posts sich immer wieder ein Satz, eine Anbieterkennzeichnung, wiederholen würde.

    Nun ist das Problem, irgendwann muss diese Formulierung dann auf allen Posts nachträglich geändert werden, um den Vorgaben zu entsprechen, mit denen ich arbeite.

    Gibt es ein PlugIn oder irgendeine Möglichkeit, solche Änderungen vorzunehmen, ohne jeden Post einzeln aufzurufen und zu bearbeiten? Sozusagen als Stapelverarbeitung, bei html-Dateien hat man alle Dateien in den Editor gezogen und dann mit suchen und ersetzen gearbeitet.

    Für erhellende Antworten wäre ich Euch wirklich dankbar!

    Vielen Dank im Voraus und einen schönen Tag!

Ansicht von 10 Antworten - 1 bis 10 (von insgesamt 10)
  • Ich würde dafür Shortcodes (eine Art Textbaustein) verwenden. Wenn du nicht gleich ein eigenes Plugin programmieren möchtest (was sich vermutlich komplizierter anhört, als es ist), kannst du so vorgehen:

    1. Du installierst und aktivierst das Plugin Code Snippets
    2. Über den neuen Menüeintrag Snippets > Hinzufügen gelangst du zu einer Eingabemaske. Hier suchst du dir einen möglichst aussagekräftigen Titel für deinen Shortcode aus.
    3. Im Eingabefeld Code gibst du folgenden Code ein:
      //[meinsatz]
      function meinsatz_func( $atts ){
      	return "Dieser Satz erscheint anstelle des Shortcodes";
      }
      add_shortcode( 'meinsatz', 'meinsatz_func' );
    4. Zuletzt klickst du auf den Button „Speichere Änderungen und aktiviere“.

    Nun kannst du in Seiten und Beiträgen den Textbaustein einfügen, in dem du im Text [meinsatz] einfügst. (Den Textbaustein könnte man sicher sinnvoller benennen als“meinsatz“, aber mir fiel gerade nichts gescheiteres ein.) Der Textbaustein wird dann im Frontend in den in der Funktion definierten Satz umgewandelt (auch hier ist mir kein gescheiterer Text eingefallen, sorry), wobei du den Satz in der Funktion jederzeit ändern kannst. Die Änderung wirkt sich auf alle Textstellen aus, in denen der Shortcode [meinsatz] verwendet wurde.

    Möchtest du unterschiedliche Sätze einbinden, kannst du neue Snippets hinzufügen und dabei die Funktion – natürlich mit abgeändertem Shortcode-Namen und Satz, der ausgegeben werden soll – verwenden.

    Einziger Haken bei der Sache ist, dass Shortcodes nur so lange funktionieren, wie die Funktion und das Plugin Snippets aktiviert sind. Anderenfalls wird im Text auch lediglich [meinsatz] ausgegeben.

    Wenn du allen Beiträgen automatisch einen gleichbleibenden Satz anhängen möchtest, kannst du alternativ auch den Text filtern. Auch dafür kannst du wieder das Plugin Code Snippets verwenden, nur gibst du dann diese Funktion ein:

    add_filter('the_content','mein_anhang');
    
    function mein_anhang($content){
      if(get_post_type()=='post') {
        $content .= "<p>Dieser Absatz erscheint unter jedem Beitrag, aber nicht auf Seiten</p>";
      }
      return $content;
    }

    Auch hier kannst du den Text an einer zentralen Stellen – im Snippet – ändern. Die Änderung wirkt sich auf alle Beiträge aus.

    Thread-Starter mrsjanice

    (@mrsjanice)

    Das nenne ich eine tolle und umfassende antwort, vielen dank dafür, du hast mir sehr weitergeholfen!!!

    Hallo @pixolin
    könnte man Deinen zweiten Code-snippet so modifizieren (und wie), daß man ihn an alle Beiträge nur einer definierten Kategorie anhängen kann?
    Eventuell so:

    add_filter('the_content','mein_anhang');
    function mein_anhang($content){
      if(get_post_type()=='post',category=1) {
        $content .= "<p>Dieser Absatz erscheint unter jedem Beitrag, aber nicht auf Seiten</p>";
      }
      return $content;
    }

    Und weißt Du ob bei Anlegen des Codes der entsprechende Inhalt nachträglich auf allen posts erscheint?
    … und ob man ihn auch, wenn man später den Code-Inhalt auf den posts doch wieder entfernen will, dieser komplett aus allen Beiträgen wieder gelöscht wird (bei Deaktivieren des plugins), also keinerlei Info auf den posts übrigbleibt?

    • Diese Antwort wurde geändert vor 7 Jahren, 6 Monaten von donaldtrump.
    • Diese Antwort wurde geändert vor 7 Jahren, 6 Monaten von donaldtrump.
    • Diese Antwort wurde geändert vor 7 Jahren, 6 Monaten von donaldtrump.

    Wenn du möchtest, dass der Satz „Dieser Beitrag wurde von Firma Hubermaier gesponsert.“ unter allen Beiträgen (keinen Seiten) erscheint, die zur Kategorie Gesponsort gehören, sollte folgender Code funktionieren:

    add_filter('the_content','mein_anhang');
    
    function mein_anhang($content){
      $idObj = get_category_by_slug('gesponsort'); 
      $id = $idObj->term_id;
      
      if( in_category( $id ) ) {
        $content .= "<p>Dieser Beitrag wurde von Firma Hubermaier gesponsert.</p>";
      }
      return $content;
    }

    (Falls du dich wunderst, wieso die Abfrage der Beitragsart (get_post_type()) weggefallen ist: Seiten haben keine Kategorien, die Bedingung in_category() ist also für Seiten ohnehin nie erfüllt.)

    Der Anhang wird allen Beiträgen der Kategorie angehängt, auch denen die längst veröffentlicht wurden. Genauso wird er wieder aus allen Beiträgen entfernt, wenn du das Snippet deaktivierst. Einfach mal ausprobieren. 🙂

    Oh danke.
    (Ich wollte es ohne weitere Info sicherheitshalber erstmal nicht ausprobieren, ich hatte die Horrorvision vor Augen daß nachträgliches Entfernen vielleicht nicht klappten könnte und ich dann einige hundert posts per Hand ändern müßte… man weiß ja nie…)

    Hast du für sowas keine Test-Installation?

    Übrigens ist das bei dem Plugin Code Snippets recht schön gelöst: wenn du Tippfehler im PHP-Code machst, zerlegt es dir nicht gleich die ganze Website, sondern gibt dir einen Fehlermeldung aus und deaktiviert vorsichtshalber das Snippet.

    Andererseits kann man sich auch ein zusätzliches Plugin sparen und gleich ein eigenes Plugin schreiben:

    <?php
    /*
    Plugin Name: Anhang Sponsoring
    Version: 0.1
    Description: Fügt Beiträgen der Kategorie "Gesponsort" einen Anhang hinzu.
    Author: Bego Mario Garde
    Author URI: https://pixolin.de
    */
    
    add_filter('the_content','mein_anhang');
    
    function mein_anhang($content){
      $idObj = get_category_by_slug('gesponsort'); 
      $id = $idObj->term_id;
      
      if( in_category( $id ) ) {
        $content .= "<p>Dieser Beitrag wurde von Firma Hubermaier gesponsert.</p>";
      }
      return $content;
    }

    als anhang-sponsoring.php in einem Verzeichnis anhang-sponsoring abspeichern, Verzeichnis als .zip-Datei komprimieren, die Datei als Plugin installieren. Allerdings solltest du dann eine Zugangsmöglichkeit per FTP haben, um das Plugin-Verzeichnis zur Not vom Server löschen zu können, wenn ein Programmierfehler alles lahmlegt.

    Ich habe gerade Deinen Code ausprobiert (nicht das plugin), und bin mit trial and error schon eine halbe Stunde zugange… aber ohne Erfolg.
    Leider bietet Code Snippet keine anständige Erläuterung, wie man vorgeht. Selbst der von Code Snippet vorgeschlagene Beispiel-Code funktioniert nicht. Man erfährt von Code Snippet auch nicht, was man im Text eingeben soll.
    Dein Code war:

    add_filter('the_content','mein_anhang');
    function mein_anhang($content){
      $idObj = get_category_by_slug('gesponsort'); 
      $id = $idObj->term_id;
      
      if( in_category( $id ) ) {
        $content .= "<p>Dieser Beitrag wurde von Firma Hubermaier gesponsert.</p>";
      }
      return $content;
    }

    Ich habe statt gesponsort Startseite eingesetzt. Im post dann [mein_anhang]. Ergebnis: nichts = [mein_anhang] erscheint bei der Ausgabe.

    • Diese Antwort wurde geändert vor 7 Jahren, 6 Monaten von donaldtrump.

    Änderung meines vorhergehenden Beitrages:
    Ich hatte den Code in Code Snippet nicht aktiviert((
    Nutzt aber auch nix, jetzt bekomme ich im DEBUG-Modus auf der Seite des posts die Meldung:
    ‚Notice: Trying to get property of non-object in /Applications/MAMP/htdocs/wp-content/plugins/code-snippets/php/snippet-ops.php(383) : eval()’d code on line 5‘
    In line 5 im Code Snippet-Fenster steht: $id = $idObj->term_id;

    • Diese Antwort wurde geändert vor 7 Jahren, 6 Monaten von donaldtrump.

    In der Funktion get_category_by_slug() darfst du nur die Titelform (Slug) einsetzen, nicht den Titel. Unter „Startseite“ findet die Funktion nichts, unter „startseite“ schon – vorausgesetzt du hast die Kategorie angelegt. Das könnte man zusätzlich mit einem if-Statement abfangen

    add_filter('the_content','mein_anhang');
    function mein_anhang($content){
    	$idObj = get_category_by_slug('startseite'); 
    	if($idObj){
    		$id = $idObj->term_id;
    		if( in_category( $id ) ) {
    			$content .= "<p>Dieser Satz erscheint auf der Startseite.</p>";
    		}
    
    	return $content;
    }

    Abgesehen davon bitte nicht Shortcode und Filter verwechseln: Damit er Shortcode in Text umgewandelt wird, muss er im Text des Beitrags hinzugefügt werden, also z.B. [meinsatz]. Der Filter funktioniert hingegen ohne weiteres Zutun. Wenn du [mein_anhang] eingibst, gibt es keinen Shortcode dazu (deshalb wird der Shortcode einfach wiedergegeben) und es hat mit dem Filter nichts zu tun.

    Ah jetzt hab ichs! Mit shortcodes hatte ich mich bislang noch gar nicht beschäftigt, deshalb kam ich zu keinem Ergebnis. Habe jetzt erstmal Shortcodes ausprobiert – klappt; und Deine Code-Schnipsel klappen auch (wenn man im letzten noch eine abschließende Klammer = } hinzufügt, dessen Fehlen Code Snippets feststellte und eine Fehlermeldung ausgab, die ich am oberen Teil der Seite übersehen hatte – erst jetzt sah ich sie.

    Ach ja erstmal hatte bei mir die Ausgabe Deines Codes nicht geklappt, weil ich zwar eine ‚Startseite‘ habe, die aber nicht explizit als Kategorie angelegt ist…
    Vielen Dank für Deine Hilfe!

    • Diese Antwort wurde geändert vor 7 Jahren, 6 Monaten von donaldtrump.
Ansicht von 10 Antworten - 1 bis 10 (von insgesamt 10)
  • Das Thema „Einen Satz in allen Dokumenten gleichzeitig ändern, geht das?“ ist für neue Antworten geschlossen.